ptos/amd64+hal: Add interrupt handling + P1 KPCR init
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Kernel processor control region
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hal/kpcr.h>
|
||||||
|
#include <machine/idt.h>
|
||||||
|
#include <machine/trap.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize interrupts for the current processor
|
||||||
|
*/
|
||||||
|
static VOID
|
||||||
|
InitInterrupts(VOID)
|
||||||
|
{
|
||||||
|
MdIdtSetGate(0x00, (UPTR)TrapDivError, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x01, (UPTR)TrapDebugException, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x02, (UPTR)TrapNmi, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x03, (UPTR)TrapBreakPoint, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x04, (UPTR)TrapOverflow, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x05, (UPTR)TrapBoundRange, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x06, (UPTR)TrapInvalidOpcode, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x07, (UPTR)TrapNoCoprocessor, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x08, (UPTR)TrapDoubleFault, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x09, (UPTR)TrapReserved, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x0A, (UPTR)TrapInvalidTss, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x0B, (UPTR)TrapSegNotPresent, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x0C, (UPTR)TrapStackSegmentFault, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x0D, (UPTR)TrapGeneralProtection, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x0E, (UPTR)TrapPageFault, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
HalKpcrP1Init(KPCR *Kpcr)
|
||||||
|
{
|
||||||
|
InitInterrupts();
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Trap dispatch
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <machine/trap.h>
|
||||||
|
#include <ke/bugcheck.h>
|
||||||
|
#include <ptdef.h>
|
||||||
|
|
||||||
|
#define TRAP_STR(TYPE) \
|
||||||
|
((TYPE) >= NELEM(TrapTab)) \
|
||||||
|
? "bad trap type" \
|
||||||
|
: TrapTab[(TYPE)]
|
||||||
|
|
||||||
|
static const CHAR *TrapTab[] = {
|
||||||
|
[TRAP_DIVERR] = "divide error",
|
||||||
|
[TRAP_DEBUG_EXCEPTION] = "debug exception",
|
||||||
|
[TRAP_NMI] = "non-maskable interrupt",
|
||||||
|
[TRAP_BREAKPOINT] = "breakpoint",
|
||||||
|
[TRAP_OVERFLOW] = "overflow",
|
||||||
|
[TRAP_BOUND_RANGE] = "bound range exceeded",
|
||||||
|
[TRAP_INVALID_OPCODE] = "invalid opcode",
|
||||||
|
[TRAP_NO_COPROCESSOR] = "no math coprocessor",
|
||||||
|
[TRAP_DOUBLE_FAULT] = "double fault",
|
||||||
|
[TRAP_RESERVED] = "reserved exception",
|
||||||
|
[TRAP_INVALID_TSS] = "invalid tss",
|
||||||
|
[TRAP_SEG_NOT_PRESENT] = "segment not present",
|
||||||
|
[TRAP_STACK_SEG_FAULT] = "stack segment fault",
|
||||||
|
[TRAP_GENERAL_PROTECTION] = "general protection fault",
|
||||||
|
[TRAP_PAGE_FAULT] = "page fault"
|
||||||
|
};
|
||||||
|
|
||||||
|
VOID
|
||||||
|
MdTrapDispatch(TRAP_FRAME *TrapFrame)
|
||||||
|
{
|
||||||
|
/* Sanity check */
|
||||||
|
if (TrapFrame == NULL) {
|
||||||
|
KeBugCheck(
|
||||||
|
BUGCHECK_UNBOUND_RESRC,
|
||||||
|
"unbound trapframe during dispatch\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
KeBugCheck(
|
||||||
|
BUGCHECK_EXCEPTION,
|
||||||
|
"got fatal %s\n", TRAP_STR(TrapFrame->Vector)
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: AMD64 interrupt vectors
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <machine/frameasm.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl TrapDivError
|
||||||
|
TrapDivError:
|
||||||
|
INTR_ENTRY($0x00)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapDebugException
|
||||||
|
TrapDebugException:
|
||||||
|
INTR_ENTRY($0x01)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapNmi
|
||||||
|
TrapNmi:
|
||||||
|
INTR_ENTRY($0x02)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapBreakPoint
|
||||||
|
TrapBreakPoint:
|
||||||
|
INTR_ENTRY($0x03)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapOverflow
|
||||||
|
TrapOverflow:
|
||||||
|
INTR_ENTRY($0x04)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapBoundRange
|
||||||
|
TrapBoundRange:
|
||||||
|
INTR_ENTRY($0x05)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapInvalidOpcode
|
||||||
|
TrapInvalidOpcode:
|
||||||
|
INTR_ENTRY($0x06)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapNoCoprocessor
|
||||||
|
TrapNoCoprocessor:
|
||||||
|
INTR_ENTRY($0x07)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapDoubleFault
|
||||||
|
TrapDoubleFault:
|
||||||
|
INTR_ENTRY_EC($0x08)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapReserved
|
||||||
|
TrapReserved:
|
||||||
|
INTR_ENTRY($0x09)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapInvalidTss
|
||||||
|
TrapInvalidTss:
|
||||||
|
INTR_ENTRY_EC($0x0A)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapSegNotPresent
|
||||||
|
TrapSegNotPresent:
|
||||||
|
INTR_ENTRY_EC($0x0B)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapStackSegmentFault
|
||||||
|
TrapStackSegmentFault:
|
||||||
|
INTR_ENTRY_EC($0x0C)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapGeneralProtection
|
||||||
|
TrapGeneralProtection:
|
||||||
|
INTR_ENTRY_EC($0x0D)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
.globl TrapPageFault
|
||||||
|
TrapPageFault:
|
||||||
|
INTR_ENTRY_EC($0x0E)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdTrapDispatch
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
push %rcx ;\
|
push %rcx ;\
|
||||||
push %rbx ;\
|
push %rbx ;\
|
||||||
push %rax ;\
|
push %rax ;\
|
||||||
push $VEC
|
push VEC
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pop an interrupt vector alongside all general purpose
|
* Pop an interrupt vector alongside all general purpose
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
*/
|
*/
|
||||||
#define INTR_ENTRY_EC(VEC) \
|
#define INTR_ENTRY_EC(VEC) \
|
||||||
cld ;\
|
cld ;\
|
||||||
_TRAP_PUSHALL() ;\
|
_TRAP_PUSHALL(VEC) ;\
|
||||||
testb $3, 16(%rsp) ;\
|
testb $3, 16(%rsp) ;\
|
||||||
jz 1f ;\
|
jz 1f ;\
|
||||||
lfence ;\
|
lfence ;\
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
#define INTR_ENTRY(VEC) ;\
|
#define INTR_ENTRY(VEC) ;\
|
||||||
cld ;\
|
cld ;\
|
||||||
push $0 ;\
|
push $0 ;\
|
||||||
_TRAP_PUSHALL() ;\
|
_TRAP_PUSHALL(VEC) ;\
|
||||||
testb $3, 8(%rsp) ;\
|
testb $3, 8(%rsp) ;\
|
||||||
jz 1f ;\
|
jz 1f ;\
|
||||||
lfence ;\
|
lfence ;\
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Trap handlers
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACHINE_TRAP_H_
|
||||||
|
#define _MACHINE_TRAP_H_ 1
|
||||||
|
|
||||||
|
#include <ptdef.h>
|
||||||
|
#include <machine/frame.h>
|
||||||
|
|
||||||
|
/* Trap vectors */
|
||||||
|
#define TRAP_DIVERR 0x00
|
||||||
|
#define TRAP_DEBUG_EXCEPTION 0x01
|
||||||
|
#define TRAP_NMI 0x02
|
||||||
|
#define TRAP_BREAKPOINT 0x03
|
||||||
|
#define TRAP_OVERFLOW 0x04
|
||||||
|
#define TRAP_BOUND_RANGE 0x05
|
||||||
|
#define TRAP_INVALID_OPCODE 0x06
|
||||||
|
#define TRAP_NO_COPROCESSOR 0x07
|
||||||
|
#define TRAP_DOUBLE_FAULT 0x08
|
||||||
|
#define TRAP_RESERVED 0x09
|
||||||
|
#define TRAP_INVALID_TSS 0x0A
|
||||||
|
#define TRAP_SEG_NOT_PRESENT 0x0B
|
||||||
|
#define TRAP_STACK_SEG_FAULT 0x0C
|
||||||
|
#define TRAP_GENERAL_PROTECTION 0x0D
|
||||||
|
#define TRAP_PAGE_FAULT 0x0E
|
||||||
|
|
||||||
|
/* Prototypes of trap functions */
|
||||||
|
VOID TrapDivError(VOID);
|
||||||
|
VOID TrapDebugException(VOID);
|
||||||
|
VOID TrapNmi(VOID);
|
||||||
|
VOID TrapBreakPoint(VOID);
|
||||||
|
VOID TrapOverflow(VOID);
|
||||||
|
VOID TrapBoundRange(VOID);
|
||||||
|
VOID TrapInvalidOpcode(VOID);
|
||||||
|
VOID TrapNoCoprocessor(VOID);
|
||||||
|
VOID TrapDoubleFault(VOID);
|
||||||
|
VOID TrapReserved(VOID);
|
||||||
|
VOID TrapInvalidTss(VOID);
|
||||||
|
VOID TrapSegNotPresent(VOID);
|
||||||
|
VOID TrapStackSegmentFault(VOID);
|
||||||
|
VOID TrapGeneralProtection(VOID);
|
||||||
|
VOID TrapPageFault(VOID);
|
||||||
|
VOID TrapLegacySyscall(VOID);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used to dispatch traps that happen on the processor
|
||||||
|
*
|
||||||
|
* @TrapFrame: Trap frame associated with event
|
||||||
|
*/
|
||||||
|
VOID MdTrapDispatch(TRAP_FRAME *TrapFrame);
|
||||||
|
|
||||||
|
#endif /* !_MACHINE_TRAP_H_ */
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Kernel processor control region
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_KPCR_H_
|
||||||
|
#define _HAL_KPCR_H_ 1
|
||||||
|
|
||||||
|
#include <ptdef.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The kernel processor control region contains MI
|
||||||
|
* processor information.
|
||||||
|
*
|
||||||
|
* @Id: Logical processor ID assigned by us
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
USHORT Id;
|
||||||
|
} KPCR;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Phase 1 processor initialization
|
||||||
|
*
|
||||||
|
* @Kpcr: KPCR of processor to initialize
|
||||||
|
*/
|
||||||
|
VOID HalKpcrP1Init(KPCR *Kpcr);
|
||||||
|
|
||||||
|
#endif /* !_HAL_KPCR_H_ */
|
||||||
@@ -11,9 +11,13 @@
|
|||||||
#include <ex/trace.h>
|
#include <ex/trace.h>
|
||||||
#include <mm/pm.h>
|
#include <mm/pm.h>
|
||||||
#include <hal/serial.h>
|
#include <hal/serial.h>
|
||||||
|
#include <hal/kpcr.h>
|
||||||
#include <drivers/bootvid/fbio.h>
|
#include <drivers/bootvid/fbio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Globals */
|
||||||
|
static KPCR BootstrapCore;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display the copyright for legal reasons
|
* Display the copyright for legal reasons
|
||||||
*/
|
*/
|
||||||
@@ -48,4 +52,7 @@ KiKernelInit(VOID)
|
|||||||
|
|
||||||
/* Initialize physical memory */
|
/* Initialize physical memory */
|
||||||
MmPmInit();
|
MmPmInit();
|
||||||
|
|
||||||
|
/* Phase 1 init of bootstrap core */
|
||||||
|
HalKpcrP1Init(&BootstrapCore);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user