You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
6.4 KiB

/*
* Copyright 2002-2019 Intel Corporation.
*
* This software is provided to you as Sample Source Code as defined in the accompanying
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
* section 1.L.
*
* This software and the related documents are provided as is, with no express or implied
* warranties, other than those that are expressly stated in the License.
*/
/*! @file
* A small test which doesn't link in a C runtime.
* It provides a menagerie of different unpleasant push instructions, and
* other instructions which exercise unpleasant corners of the instruction set,
* such as access to (virtualised) segment registers.
*/
.data
value: .long 0x01234567
.text
.globl _start
_start:
mov $1, %ebx # %ebx holds the test number, returned as status of exit on failure
pushl $0
cmpl $0,(%esp)
jne 1f
# Test 2
incl %ebx
pushl $-1
cmpl $-1,(%esp)
jne 1f
# Test 3
incl %ebx
mov %esp,%ecx
pushw $-1
cmpw $-1,(%esp)
jne 1f
# Test 4
incl %ebx
lea 2(%esp),%eax # check the stack moved down by two
cmp %eax,%ecx
jne 1f
lea -2(%esp),%esp # align the stack again
# Test 5
incl %ebx
pushl value
movl value, %eax
cmp (%esp),%eax
jne 1f
# Test 6
incl %ebx
pushl (%esp)
cmp %eax, (%esp)
jne 1f
# Test 7
incl %ebx
decl 4(%esp)
dec %eax
pushl 4(%esp)
cmp %eax,(%esp)
jne 1f
# Test 8
incl %ebx
mov %esp,%ecx
push %cs
lea 4(%esp),%eax # check the stack moved down by four
cmpl %ecx,%eax
jne 1f
# Test 9
incl %ebx
mov %cs,%eax
cmp %eax,(%esp)
jne 1f
# Some tests on virtualized segment registers.
# Test 10
incl %ebx
mov %esp,%ecx
push %gs
lea 4(%esp),%eax # check the stack moved down by four
cmpl %ecx,%eax
jne 1f
# Test 11, check the segment register was store correctly
incl %ebx
mov %gs,%eax
cmp %eax,(%esp)
jne 1f
# Test 12
# Pop the segment register
incl %ebx
mov %esp,%ecx
pop %gs
lea -4(%esp),%eax # check the stack moved up by four
cmpl %ecx,%eax
jne 1f
# Tests on pushf/popf
# Test 13
incl %ebx
mov %esp,%ecx
pushfw
lea 2(%esp),%eax # check the stack moved down by 2
cmpl %ecx,%eax
jne 1f
lea 2(%esp),%esp # align the stack again
# Test 14
incl %ebx
mov %esp,%ecx
pushfl
lea 4(%esp),%eax # check the stack moved down by 4
cmpl %ecx,%eax
jne 1f
# Test 15, popf
incl %ebx
movl $0x282,(%esp)
mov %esp,%ecx
popfl
lea -4(%esp),%eax # check the stack moved up by 4
cmpl %ecx,%eax
jne 1f
# Test 16
incl %ebx
mov %esp,%ecx
push %sp
lea 2(%esp),%eax # check the stack moved down by 2
cmpl %ecx,%eax
jne 1f
# Test 17, check the value pushed
incl %ebx
cmpw (%esp), %ax
jne 1f
# Test 18
incl %ebx
mov %esp,%ecx
pop %sp
lea -2(%esp),%eax # check the stack moved up by 2
cmpl %ecx,%eax
jne 1f
# Test 19 Enter
incl %ebx
lea -4(%esp), %ecx
mov $0x12345678,%ebp
enter $20,$0
cmp %ecx,%ebp # check %ebp updated correctly
jne 1f
# Test 20
incl %ebx
lea -20(%ecx),%ecx # check %esp updated correctly
cmp %ecx,%esp
jne 1f
# Test 21
incl %ebx
cmpl $0x12345678,20(%esp) # check old %ebp saved correctly
jne 1f
# Test 22, not a push, rather a segment register store
incl %ebx
mov %gs, (%esp)
mov %gs, %cx
cmpw %cx, (%esp)
jne 1f
# Test 23 pusha
incl %ebx
mov %esp,%ecx
mov $1,%edi
mov $2,%esi
pushal
xor %edi,%edi
xor %esi,%esi
lea -4*8(%ecx),%ecx
cmp %ecx,%esp
jne 1f
# Test 24 popa
incl %ebx
popal # Will pop %ecx, but that's fine.
cmp %ecx,%esp
jne 1f
# Test 25, Compare the other two registers we set
incl %ebx
cmp $1, %edi
jne 1f
cmp $2,%esi
jne 1f
# Test 26, mov from gs
incl %ebx
mov %gs, (%esp)
mov %gs, %eax
cmp (%esp), %eax
jne 1f
# Test 27, mov to gs
incl %ebx
mov (%esp),%gs
# no verification here, just tests code generation.
# Test 28, pop (%esp)
incl %ebx
movl $0, (%esp)
movl $1,4(%esp)
popl (%esp)
cmpl $0, (%esp)
jne 1f
# Test 29, pop 4(%esp)
incl %ebx
movl $1,8(%esp)
popl 4(%esp)
cmpl $0,4(%esp)
jne 1f
# Test 30, popw (%esp)
incl %ebx
movw $0,(%esp)
movw $1,2(%esp)
popw (%esp)
cmpw $0,(%esp)
jne 1f
# Test 31, translation of call 0
incl %ebx
xor %eax,%eax
je 2f
call 0
2:
# Test 32 call indirect through the stack
incl %ebx
mov $1,%eax
movl $stubRoutine,4(%esp)
call *4(%esp)
cmp $0,%eax
jne 1f
# Exit
movl $0,%ebx # first argument: exit code
1:
movl $1,%eax # system call number (sys_exit)
int $0x80 # call kernel
# Null routine
stubRoutine:
mov $0,%eax
ret