user_space #4
@ -22,36 +22,108 @@
|
||||
.type exception_wrapper_\id,@function
|
||||
/* INTERRUPT FRAME START */
|
||||
/* ALREADY PUSHED TO US BY THE PROCESSOR UPON ENTRY TO THIS INTERRUPT */
|
||||
/* uint32_t ip */
|
||||
/* uint32_t cs; */
|
||||
/* uint32_t flags */
|
||||
/* uint32_t cs; */
|
||||
/* uint32_t ip */
|
||||
/* Pushes the other reg to save same and look like a struct cpu_state*/
|
||||
/* Fake error code */
|
||||
pushl $0
|
||||
pushl $0
|
||||
|
||||
/* Backup the actual context */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
/* Backup the actual context */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
pushl %eax
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
subl $2,%esp
|
||||
pushw %ss
|
||||
pushw %ds
|
||||
pushw %es
|
||||
pushw %fs
|
||||
pushw %gs
|
||||
pushl %eax
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
subl $2,%esp
|
||||
pushw %ss
|
||||
pushw %ds
|
||||
pushw %es
|
||||
pushw %fs
|
||||
pushw %gs
|
||||
|
||||
/* Set correct kernel segment descriptors' value */
|
||||
movw $BUILD_SEGMENT_REG_VALUE(0, 0, SEG_KDATA), %di
|
||||
pushw %di ; popw %ds
|
||||
pushw %di ; popw %es
|
||||
pushw %di ; popw %fs
|
||||
pushw %di ; popw %gs
|
||||
/* Set correct kernel segment descriptors' value */
|
||||
movw $BUILD_SEGMENT_REG_VALUE(0, 0, SEG_KDATA), %di
|
||||
pushw %di ; popw %ds
|
||||
pushw %di ; popw %es
|
||||
pushw %di ; popw %fs
|
||||
pushw %di ; popw %gs
|
||||
|
||||
push %esp
|
||||
pushl $\id
|
||||
call exception_handler_wrap
|
||||
addl $8, %esp
|
||||
|
||||
/* Reconfigure the MMU if needed */
|
||||
pushl %esp /* cpu_ctxt */
|
||||
call thread_prepare_exception_switch_back
|
||||
addl $4, %esp /* Unallocate the stack */
|
||||
|
||||
/* Prepare kernel TSS in case we are switching to a
|
||||
user thread: we make sure that we will come back
|
||||
into the kernel at a correct stack location */
|
||||
pushl %esp /* Pass the location of the context we are
|
||||
restoring to the function */
|
||||
call cpu_context_update_kernel_tss
|
||||
addl $4, %esp
|
||||
|
||||
/* Restore the context */
|
||||
popw %gs
|
||||
popw %fs
|
||||
popw %es
|
||||
popw %ds
|
||||
popw %ss
|
||||
addl $2,%esp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
popl %edx
|
||||
popl %ecx
|
||||
popl %eax
|
||||
popl %ebp
|
||||
/* Remove fake error code */
|
||||
addl $4, %esp
|
||||
|
||||
iret
|
||||
.endm
|
||||
|
||||
.macro exception_mac_with_errcode id
|
||||
exception_wrapper_\id:
|
||||
.type exception_wrapper_\id,@function
|
||||
/* INTERRUPT FRAME START */
|
||||
/* ALREADY PUSHED TO US BY THE PROCESSOR UPON ENTRY TO THIS INTERRUPT */
|
||||
/* uint32_t flags */
|
||||
/* uint32_t cs; */
|
||||
/* uint32_t ip */
|
||||
/* Pushes the other reg to save same and look like a struct cpu_state*/
|
||||
|
||||
/* Backup the actual context */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
pushl %eax
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
subl $2,%esp
|
||||
pushw %ss
|
||||
pushw %ds
|
||||
pushw %es
|
||||
pushw %fs
|
||||
pushw %gs
|
||||
|
||||
/* Set correct kernel segment descriptors' value */
|
||||
movw $BUILD_SEGMENT_REG_VALUE(0, 0, SEG_KDATA), %di
|
||||
pushw %di ; popw %ds
|
||||
pushw %di ; popw %es
|
||||
pushw %di ; popw %fs
|
||||
pushw %di ; popw %gs
|
||||
|
||||
push %esp
|
||||
pushl $\id
|
||||
@ -72,30 +144,32 @@
|
||||
addl $4, %esp
|
||||
|
||||
/* Restore the context */
|
||||
popw %gs
|
||||
popw %fs
|
||||
popw %es
|
||||
popw %ds
|
||||
popw %ss
|
||||
addl $2,%esp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
popl %edx
|
||||
popl %ecx
|
||||
popl %eax
|
||||
popl %ebp
|
||||
/* Remove fake error code */
|
||||
addl $4, %esp
|
||||
popw %gs
|
||||
popw %fs
|
||||
popw %es
|
||||
popw %ds
|
||||
popw %ss
|
||||
addl $2,%esp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
popl %edx
|
||||
popl %ecx
|
||||
popl %eax
|
||||
popl %ebp
|
||||
/* Remove fake error code */
|
||||
addl $4, %esp
|
||||
|
||||
iret
|
||||
.endm
|
||||
|
||||
/*List of exception w or w/o err codehttps://wiki.osdev.org/Exceptions*/
|
||||
.irp exception_id, 8, 10, 11, 12, 13, 14, 17, 30
|
||||
exception_mac_with_errcode exception_id
|
||||
.endr
|
||||
|
||||
.set i, 0
|
||||
.rept 0x20
|
||||
exception_mac %i
|
||||
.set i, i+1
|
||||
.irp exception_id, 0, 1, 2, 3, 4, 5, 6, 7, 9, 15, 16, 18, 19, 20 21, 22, 23, 24, 25, 26, 27, 28, 29, 31
|
||||
exception_mac exception_id
|
||||
.endr
|
||||
|
||||
.macro ref_exception_wrapper id
|
||||
|
Loading…
Reference in New Issue
Block a user