xinyangli
8e4feb4010
NJU-ProjectN/abstract-machine 3348db971fd860be5cb28e21c18f9d0e65d0c96a Merge pull request #8 from Jasonyanyusong/master
99 lines
1.7 KiB
ArmAsm
99 lines
1.7 KiB
ArmAsm
#include "x86-qemu.h"
|
|
|
|
.globl __am_kcontext_start
|
|
__am_kcontext_start:
|
|
// eax = arg, ebx = entry
|
|
pushl %eax
|
|
pushl $__am_panic_on_return
|
|
jmpl *%ebx
|
|
|
|
trap:
|
|
cli
|
|
|
|
subl $20, %esp
|
|
pushl %ebp
|
|
pushl %edi
|
|
pushl %esi
|
|
pushl $0
|
|
pushl %edx
|
|
pushl %ecx
|
|
pushl %ebx
|
|
pushl %eax
|
|
movw %ds, %ax
|
|
pushl %eax
|
|
pushl $0
|
|
|
|
movw $KSEL(SEG_KDATA), %ax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
movw %ax, %ss
|
|
|
|
pushl %esp
|
|
call __am_irq_handle
|
|
|
|
.globl __am_iret
|
|
__am_iret:
|
|
addl $4, %esp
|
|
popl %eax
|
|
movl %eax, %esp
|
|
|
|
addl $4, %esp
|
|
popl %eax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
|
|
cmpw $KSEL(SEG_KCODE), 36(%esp)
|
|
je .kernel_iret
|
|
|
|
.user_iret:
|
|
popl %eax
|
|
popl %ebx
|
|
popl %ecx
|
|
popl %edx
|
|
addl $4, %esp
|
|
popl %esi
|
|
popl %edi
|
|
popl %ebp
|
|
iret
|
|
|
|
.kernel_iret:
|
|
popl %eax
|
|
popl %ebx
|
|
popl %ecx
|
|
popl %edx
|
|
addl $4, %esp
|
|
|
|
/* stack frame:
|
|
28 ss
|
|
24 esp (not popped by iret when returning to ring0)
|
|
20 eflags ---> move to new-esp
|
|
16 cs
|
|
12 eip
|
|
8 ebp
|
|
4 edi
|
|
0 esi <--- %esp
|
|
*/
|
|
|
|
movl %esp, %ebp
|
|
movl 24(%ebp), %edi // %edi is new-esp
|
|
|
|
movl 20(%ebp), %esi; movl %esi, -4(%edi)
|
|
movl 16(%ebp), %esi; movl %esi, -8(%edi)
|
|
movl 12(%ebp), %esi; movl %esi, -12(%edi)
|
|
movl 8(%ebp), %esi; movl %esi, -16(%edi)
|
|
movl 4(%ebp), %esi; movl %esi, -20(%edi)
|
|
movl 0(%ebp), %esi; movl %esi, -24(%edi)
|
|
|
|
leal -24(%edi), %esp
|
|
|
|
popl %esi
|
|
popl %edi
|
|
popl %ebp
|
|
iret
|
|
|
|
#define NOERR push $0
|
|
#define ERR
|
|
#define IRQ_DEF(id, dpl, err) \
|
|
.globl __am_irq##id; __am_irq##id: cli; err; push $id; jmp trap;
|
|
IRQS(IRQ_DEF)
|
|
.globl __am_irqall; __am_irqall: cli; push $0; push $-1; jmp trap;
|