#include <lunaix/syscall.h>
#define __ASM_INTR_DIAGNOSIS
-.macro isr_template vector, no_error_code=1
- .global _asm_isr\vector
- .type _asm_isr\vector, @function
- _asm_isr\vector:
- .if \no_error_code
- pushl $0x0
- .endif
- pushl $\vector
- jmp interrupt_wrapper
-.endm
-
#ifdef __ASM_INTR_DIAGNOSIS
.section .bss
.global debug_resv
tmp_stack:
.section .text
- isr_template FAULT_DIVISION_ERROR
- isr_template FAULT_GENERAL_PROTECTION, no_error_code=0
- isr_template FAULT_PAGE_FAULT, no_error_code=0
- isr_template FAULT_STACK_SEG_FAULT, no_error_code=0
-
- isr_template LUNAIX_SYS_PANIC
- isr_template LUNAIX_SYS_CALL
-
- isr_template APIC_ERROR_IV
- isr_template APIC_LINT0_IV
- isr_template APIC_TIMER_IV
- isr_template APIC_SPIV_IV
- isr_template RTC_TIMER_IV
- isr_template PC_KBD_IV
-
+ .global interrupt_wrapper
interrupt_wrapper:
/*
Stack layout (layout of struct isr_param)
soft_iret:
movl %eax, %esp
+#ifdef __ASM_INTR_DIAGNOSIS
+ movl %eax, (debug_resv + 8)
+ movl 56(%esp), %eax
+ movl %eax, (debug_resv + 4)
+#endif
+
popl %eax
popl %ebx
popl %ecx
# 约定
# arg1: 目标进程PCB地址 (next
- popl %ecx # next
+ popl %ebx # next
movl __current, %eax
- movl 88(%eax), %ebx # __current->pagetable
- movl 88(%ecx), %eax # next->pagetable
+ movl 88(%eax), %ecx # __current->pagetable
+ movl 88(%ebx), %eax # next->pagetable
- cmpl %ebx, %eax # if(next->pagtable != __current->pagetable) {
+ cmpl %ecx, %eax # if(next->pagtable != __current->pagetable) {
jz 1f
movl %eax, %cr3 # cpu_lcr3(next->pagetable)
# }
1:
- movl %ecx, __current # __current = next
+ movl %ebx, __current # __current = next
# 我们已经处在了新的地址空间,为了避免影响其先前的栈布局
# 需要使用一个临时的栈空间
jz 1f
jmp handle_signal
1:
- leal 8(%ecx), %eax
+ leal 8(%ebx), %eax
jmp soft_iret
.global handle_signal