forked from xt-sys/exectos
Generate distinct handlers for CPU traps and hardware interrupts
This commit is contained in:
@@ -13,22 +13,31 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a trap handler for the specified vector.
|
* Creates a trap or interrupt handler for the specified vector.
|
||||||
*
|
*
|
||||||
* @param Vector
|
* @param Vector
|
||||||
* Supplies a trap vector number.
|
* Supplies a trap/interrupt vector number.
|
||||||
|
*
|
||||||
|
* @param Type
|
||||||
|
* Specifies whether the handler is designed to handle an interrupt or a trap.
|
||||||
*
|
*
|
||||||
* @return This macro does not return any value.
|
* @return This macro does not return any value.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
.macro ArCreateTrapHandler Vector
|
.macro ArCreateTrapHandler Vector Type
|
||||||
.global ArTrap\Vector
|
.global Ar\Type\Vector
|
||||||
ArTrap\Vector:
|
Ar\Type\Vector:
|
||||||
/* Push fake error code for non-error vectors */
|
/* Check handler type */
|
||||||
|
.ifc \Type,Trap
|
||||||
|
/* Push fake error code for non-error vector traps */
|
||||||
.if \Vector != 8 && \Vector != 10 && \Vector != 11 && \Vector != 12 && \Vector != 13 && \Vector != 14 && \Vector != 17 && \Vector != 30
|
.if \Vector != 8 && \Vector != 10 && \Vector != 11 && \Vector != 12 && \Vector != 13 && \Vector != 14 && \Vector != 17 && \Vector != 30
|
||||||
push $0
|
push $0
|
||||||
.endif
|
.endif
|
||||||
|
.else
|
||||||
|
/* Push fake error code for interrupts */
|
||||||
|
push $0
|
||||||
|
.endif
|
||||||
|
|
||||||
/* Push vector number */
|
/* Push vector number */
|
||||||
push $\Vector
|
push $\Vector
|
||||||
@@ -106,30 +115,37 @@ ArTrap\Vector:
|
|||||||
mov %cs, %ax
|
mov %cs, %ax
|
||||||
and $3, %al
|
and $3, %al
|
||||||
mov %al, TrapPreviousMode(%rbp)
|
mov %al, TrapPreviousMode(%rbp)
|
||||||
jz KernelMode$\Vector
|
jz KernelMode\Type\Vector
|
||||||
swapgs
|
swapgs
|
||||||
jmp UserMode$\Vector
|
jmp UserMode\Type\Vector
|
||||||
|
|
||||||
KernelMode$\Vector:
|
KernelMode\Type\Vector:
|
||||||
/* Save kernel stack pointer (SS:RSP) */
|
/* Save kernel stack pointer (SS:RSP) */
|
||||||
movl %ss, %eax
|
movl %ss, %eax
|
||||||
mov %eax, TrapSegSs(%rbp)
|
mov %eax, TrapSegSs(%rbp)
|
||||||
lea TRAP_FRAME_SIZE(%rbp), %rax
|
lea TRAP_FRAME_SIZE(%rbp), %rax
|
||||||
mov %rax, TrapRsp(%rbp)
|
mov %rax, TrapRsp(%rbp)
|
||||||
|
|
||||||
UserMode$\Vector:
|
UserMode\Type\Vector:
|
||||||
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
|
/* Push Frame Pointer and clear direction flag */
|
||||||
mov %rsp, %rcx
|
mov %rsp, %rcx
|
||||||
cld
|
cld
|
||||||
|
|
||||||
|
.ifc \Type,Trap
|
||||||
|
/* Pass to the trap dispatcher */
|
||||||
call ArDispatchTrap
|
call ArDispatchTrap
|
||||||
|
.else
|
||||||
|
/* Pass to the interrupt dispatcher */
|
||||||
|
call ArDispatchTrap
|
||||||
|
.endif
|
||||||
|
|
||||||
/* Test previous mode and swapgs if needed */
|
/* Test previous mode and swapgs if needed */
|
||||||
testb $1, TrapPreviousMode(%rbp)
|
testb $1, TrapPreviousMode(%rbp)
|
||||||
jz KernelModeReturn$\Vector
|
jz KernelModeReturn\Type\Vector
|
||||||
cli
|
cli
|
||||||
swapgs
|
swapgs
|
||||||
|
|
||||||
KernelModeReturn$\Vector:
|
KernelModeReturn\Type\Vector:
|
||||||
/* Restore XMM registers */
|
/* Restore XMM registers */
|
||||||
movdqa TrapXmm0(%rbp), %xmm0
|
movdqa TrapXmm0(%rbp), %xmm0
|
||||||
movdqa TrapXmm1(%rbp), %xmm1
|
movdqa TrapXmm1(%rbp), %xmm1
|
||||||
@@ -181,10 +197,20 @@ KernelModeReturn$\Vector:
|
|||||||
iretq
|
iretq
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/* Populate common trap handlers */
|
/* Populate common interrupt and trap handlers */
|
||||||
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
ArCreateTrapHandler 0x\i\j
|
ArCreateTrapHandler 0x\i\j Interrupt
|
||||||
|
ArCreateTrapHandler 0x\i\j Trap
|
||||||
|
.endr
|
||||||
|
.endr
|
||||||
|
|
||||||
|
/* Define array of pointers to the interrupt handlers */
|
||||||
|
.global ArInterruptEntry
|
||||||
|
ArInterruptEntry:
|
||||||
|
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
|
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
|
.quad ArInterrupt0x\i\j
|
||||||
.endr
|
.endr
|
||||||
.endr
|
.endr
|
||||||
|
|
||||||
|
|||||||
@@ -249,34 +249,35 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||||
{
|
{
|
||||||
/* Set the IDT to handle unexpected interrupts */
|
/* Set the IDT to handle unexpected interrupts */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrapEntry[Vector], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArInterruptEntry[Vector], KGDT_R0_CODE,
|
||||||
|
KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup IDT handlers for known interrupts and traps */
|
/* Setup IDT handlers for known interrupts and traps */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrapEntry[0x00], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrapEntry[0x01], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrapEntry[0x02], KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrapEntry[0x03], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrapEntry[0x04], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrapEntry[0x05], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrapEntry[0x06], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrapEntry[0x07], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrapEntry[0x08], KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrapEntry[0x09], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrapEntry[0x0A], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrapEntry[0x0B], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrapEntry[0x0C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrapEntry[0x0D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrapEntry[0x0E], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrapEntry[0x10], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrapEntry[0x11], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrapEntry[0x12], KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrapEntry[0x13], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x1F, (PVOID)ArTrap0x1F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x1F, (PVOID)ArTrapEntry[0x1F], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrapEntry[0x2C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrapEntry[0x2D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2F, (PVOID)ArTrap0x2F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2F, (PVOID)ArTrapEntry[0x2F], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArTrap0xE1, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArTrapEntry[0xE1], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -13,22 +13,31 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro creates a trap handler for the specified vector.
|
* Creates a trap or interrupt handler for the specified vector.
|
||||||
*
|
*
|
||||||
* @param Vector
|
* @param Vector
|
||||||
* Supplies a trap vector number.
|
* Supplies a trap/interrupt vector number.
|
||||||
|
*
|
||||||
|
* @param Type
|
||||||
|
* Specifies whether the handler is designed to handle an interrupt or a trap.
|
||||||
*
|
*
|
||||||
* @return This macro does not return any value.
|
* @return This macro does not return any value.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
.macro ArCreateTrapHandler Vector
|
.macro ArCreateTrapHandler Vector Type
|
||||||
.global _ArTrap\Vector
|
.global _Ar\Type\Vector
|
||||||
_ArTrap\Vector:
|
_Ar\Type\Vector:
|
||||||
/* Push fake error code for non-error vectors */
|
/* Check handler type */
|
||||||
|
.ifc \Type,Trap
|
||||||
|
/* Push fake error code for non-error vector traps */
|
||||||
.if \Vector != 8 && \Vector != 10 && \Vector != 11 && \Vector != 12 && \Vector != 13 && \Vector != 14 && \Vector != 17 && \Vector != 30
|
.if \Vector != 8 && \Vector != 10 && \Vector != 11 && \Vector != 12 && \Vector != 13 && \Vector != 14 && \Vector != 17 && \Vector != 30
|
||||||
push $0
|
push $0
|
||||||
.endif
|
.endif
|
||||||
|
.else
|
||||||
|
/* Push fake error code for interrupts */
|
||||||
|
push $0
|
||||||
|
.endif
|
||||||
|
|
||||||
/* Push vector number */
|
/* Push vector number */
|
||||||
push $\Vector
|
push $\Vector
|
||||||
@@ -77,33 +86,40 @@ _ArTrap\Vector:
|
|||||||
mov %cs, %ax
|
mov %cs, %ax
|
||||||
and $3, %al
|
and $3, %al
|
||||||
mov %al, TrapPreviousMode(%ebp)
|
mov %al, TrapPreviousMode(%ebp)
|
||||||
jz KernelMode$\Vector
|
jz KernelMode\Type\Vector
|
||||||
swapgs
|
swapgs
|
||||||
jmp UserMode$\Vector
|
jmp UserMode\Type\Vector
|
||||||
|
|
||||||
KernelMode$\Vector:
|
KernelMode\Type\Vector:
|
||||||
/* Save kernel stack pointer (SS:ESP) */
|
/* Save kernel stack pointer (SS:ESP) */
|
||||||
movl %ss, %eax
|
movl %ss, %eax
|
||||||
mov %eax, TrapSegSs(%ebp)
|
mov %eax, TrapSegSs(%ebp)
|
||||||
lea TrapEsp(%ebp), %eax
|
lea TrapEsp(%ebp), %eax
|
||||||
mov %eax, TrapEsp(%ebp)
|
mov %eax, TrapEsp(%ebp)
|
||||||
|
|
||||||
UserMode$\Vector:
|
UserMode\Type\Vector:
|
||||||
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
|
/* Push Frame Pointer and clear direction flag */
|
||||||
push %esp
|
push %esp
|
||||||
cld
|
cld
|
||||||
|
|
||||||
|
.ifc \Type,Trap
|
||||||
|
/* Pass to the trap dispatcher */
|
||||||
call _ArDispatchTrap
|
call _ArDispatchTrap
|
||||||
|
.else
|
||||||
|
/* Pass to the interrupt dispatcher */
|
||||||
|
call _ArDispatchTrap
|
||||||
|
.endif
|
||||||
|
|
||||||
/* Clean up the stack */
|
/* Clean up the stack */
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
|
|
||||||
/* Test previous mode and swapgs if needed */
|
/* Test previous mode and swapgs if needed */
|
||||||
testb $1, TrapPreviousMode(%ebp)
|
testb $1, TrapPreviousMode(%ebp)
|
||||||
jz KernelModeReturn$\Vector
|
jz KernelModeReturn\Type\Vector
|
||||||
cli
|
cli
|
||||||
swapgs
|
swapgs
|
||||||
|
|
||||||
KernelModeReturn$\Vector:
|
KernelModeReturn\Type\Vector:
|
||||||
/* Restore segment selectors */
|
/* Restore segment selectors */
|
||||||
mov TrapSegDs(%ebp), %ds
|
mov TrapSegDs(%ebp), %ds
|
||||||
mov TrapSegEs(%ebp), %es
|
mov TrapSegEs(%ebp), %es
|
||||||
@@ -127,10 +143,20 @@ KernelModeReturn$\Vector:
|
|||||||
iretl
|
iretl
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/* Populate common trap handlers */
|
/* Populate common interrupt and trap handlers */
|
||||||
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
ArCreateTrapHandler 0x\i\j
|
ArCreateTrapHandler 0x\i\j Interrupt
|
||||||
|
ArCreateTrapHandler 0x\i\j Trap
|
||||||
|
.endr
|
||||||
|
.endr
|
||||||
|
|
||||||
|
/* Define array of pointers to the interrupt handlers */
|
||||||
|
.global _ArInterruptEntry
|
||||||
|
_ArInterruptEntry:
|
||||||
|
.irp i,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
|
.irp j,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
|
||||||
|
.long _ArInterrupt0x\i\j
|
||||||
.endr
|
.endr
|
||||||
.endr
|
.endr
|
||||||
|
|
||||||
|
|||||||
@@ -242,34 +242,35 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||||
{
|
{
|
||||||
/* Set the IDT to handle unexpected interrupts */
|
/* Set the IDT to handle unexpected interrupts */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrapEntry[Vector], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArInterruptEntry[Vector],
|
||||||
|
KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup IDT handlers for known interrupts and traps */
|
/* Setup IDT handlers for known interrupts and traps */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrapEntry[0x00], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrapEntry[0x01], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrapEntry[0x02], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrapEntry[0x03], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrapEntry[0x04], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrapEntry[0x05], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrapEntry[0x06], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrapEntry[0x07], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrapEntry[0x08], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrapEntry[0x09], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrapEntry[0x0A], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrapEntry[0x0B], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrapEntry[0x0C], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrapEntry[0x0D], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrapEntry[0x0E], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrapEntry[0x10], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrapEntry[0x11], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrapEntry[0x12], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrapEntry[0x13], KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2A, (PVOID)ArTrap0x2A, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2A, (PVOID)ArTrapEntry[0x2A], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2B, (PVOID)ArTrap0x2B, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2B, (PVOID)ArTrapEntry[0x2B], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrapEntry[0x2C], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrapEntry[0x2D], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2E, (PVOID)ArTrap0x2E, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2E, (PVOID)ArTrapEntry[0x2E], KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -506,7 +507,7 @@ AR::ProcSup::SetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
|||||||
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
||||||
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
||||||
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
||||||
Tss->Eip = PtrToUlong(ArTrap0x08);
|
Tss->Eip = PtrToUlong(ArTrapEntry[0x08]);
|
||||||
Tss->Cs = KGDT_R0_CODE;
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
||||||
@@ -720,7 +721,7 @@ AR::ProcSup::SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock
|
|||||||
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
Tss->CR3 = CpuFunc::ReadControlRegister(3);
|
||||||
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
||||||
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
||||||
Tss->Eip = PtrToUlong(ArTrap0x02);
|
Tss->Eip = PtrToUlong(ArTrapEntry[0x02]);
|
||||||
Tss->Cs = KGDT_R0_CODE;
|
Tss->Cs = KGDT_R0_CODE;
|
||||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||||
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
Tss->Es = KGDT_R3_DATA | RPL_MASK;
|
||||||
|
|||||||
@@ -15,9 +15,14 @@
|
|||||||
/* TrampolineEnableXpa end address to calculate trampoline size */
|
/* TrampolineEnableXpa end address to calculate trampoline size */
|
||||||
XTCLINK PVOID ArEnableExtendedPhysicalAddressingEnd[];
|
XTCLINK PVOID ArEnableExtendedPhysicalAddressingEnd[];
|
||||||
|
|
||||||
|
/* External array of pointers to the interrupt handlers */
|
||||||
|
XTCLINK ULONG_PTR ArInterruptEntry[256];
|
||||||
|
|
||||||
/* TrampolineApStartup end address to calculate trampoline size */
|
/* TrampolineApStartup end address to calculate trampoline size */
|
||||||
XTCLINK PVOID ArStartApplicationProcessorEnd[];
|
XTCLINK PVOID ArStartApplicationProcessorEnd[];
|
||||||
|
|
||||||
|
/* External array of pointers to the trap handlers */
|
||||||
|
XTCLINK ULONG_PTR ArTrapEntry[256];
|
||||||
|
|
||||||
/* Forward reference for assembler code */
|
/* Forward reference for assembler code */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
@@ -30,129 +35,4 @@ XTCDECL
|
|||||||
VOID
|
VOID
|
||||||
ArStartApplicationProcessor(VOID);
|
ArStartApplicationProcessor(VOID);
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x00(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x01(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x02(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x03(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x04(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x05(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x06(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x07(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x08(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x09(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0A(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0B(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0C(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0D(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0E(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x10(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x11(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x12(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x13(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x1F(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2C(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2D(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2F(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0xE1(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0xFF(VOID);
|
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_AR_ASSEMBLY_HH */
|
#endif /* __XTOSKRNL_AR_ASSEMBLY_HH */
|
||||||
|
|||||||
@@ -12,9 +12,6 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
/* External array of pointers to the trap handlers */
|
|
||||||
XTCLINK ULONG_PTR ArTrapEntry[256];
|
|
||||||
|
|
||||||
/* Architecture-specific Library */
|
/* Architecture-specific Library */
|
||||||
namespace AR
|
namespace AR
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,9 +12,14 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/* External array of pointers to the interrupt handlers */
|
||||||
|
XTCLINK ULONG_PTR ArInterruptEntry[256];
|
||||||
|
|
||||||
/* TrampolineApStartup end address to calculate trampoline size */
|
/* TrampolineApStartup end address to calculate trampoline size */
|
||||||
XTCLINK PVOID ArStartApplicationProcessorEnd[];
|
XTCLINK PVOID ArStartApplicationProcessorEnd[];
|
||||||
|
|
||||||
|
/* External array of pointers to the trap handlers */
|
||||||
|
XTCLINK ULONG_PTR ArTrapEntry[256];
|
||||||
|
|
||||||
/* Forward reference for assembler code */
|
/* Forward reference for assembler code */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
@@ -22,130 +27,4 @@ XTCDECL
|
|||||||
VOID
|
VOID
|
||||||
ArStartApplicationProcessor(VOID);
|
ArStartApplicationProcessor(VOID);
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x00(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x01(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x02(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x03(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x04(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x05(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x06(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x07(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x08(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x09(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0A(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0B(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0C(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0D(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x0E(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x10(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x11(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x12(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x13(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2A(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2B(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2C(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2D(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0x2E(VOID);
|
|
||||||
|
|
||||||
XTCLINK
|
|
||||||
XTCDECL
|
|
||||||
VOID
|
|
||||||
ArTrap0xFF(VOID);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_AR_ASSEMBLY_HH */
|
#endif /* __XTOSKRNL_AR_ASSEMBLY_HH */
|
||||||
|
|||||||
@@ -12,9 +12,6 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
/* External array of pointers to the trap handlers */
|
|
||||||
XTCLINK ULONG_PTR ArTrapEntry[256];
|
|
||||||
|
|
||||||
/* Architecture-specific Library */
|
/* Architecture-specific Library */
|
||||||
namespace AR
|
namespace AR
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user