bootloader/boot/gdt.S
Hojun-Cho cb56f42e08 add trap
don't want handle trap now
2024-12-02 10:19:57 +09:00

190 lines
5.4 KiB
ArmAsm

.file "gdt.S"
// Trap
#define T_PRIVINFLT 0 /* privileged instruction */
#define T_BPTFLT 1 /* breakpoint trap */
#define T_ARITHTRAP 2 /* arithmetic trap */
#define T_RESERVED 3 /* reserved fault base */
#define T_PROTFLT 4 /* protection fault */
#define T_TRCTRAP 5 /* trace trap */
#define T_PAGEFLT 6 /* page fault */
#define T_ALIGNFLT 7 /* alignment fault */
#define T_DIVIDE 8 /* integer divide fault */
#define T_NMI 9 /* non-maskable interrupt */
#define T_OFLOW 10 /* overflow trap */
#define T_BOUND 11 /* bounds check fault */
#define T_DNA 12 /* device not available fault */
#define T_DOUBLEFLT 13 /* double fault */
#define T_FPOPFLT 14 /* fp coprocessor operand fetch fault (![P]Pro)*/
#define T_TSSFLT 15 /* invalid tss fault */
#define T_SEGNPFLT 16 /* segment not present fault */
#define T_STKFLT 17 /* stack fault */
#define T_MACHK 18 /* machine check ([P]Pro) */
#define T_XFTRAP 19 /* SIMD FP exception */
/* memory segment types */
#define SDT_MEMRO 16 /* memory read only */
#define SDT_MEMROA 17 /* memory read only accessed */
#define SDT_MEMRW 18 /* memory read write */
#define SDT_MEMRWA 19 /* memory read write accessed */
#define SDT_MEMROD 20 /* memory read only expand dwn limit */
#define SDT_MEMRODA 21 /* memory read only expand dwn limit accessed */
#define SDT_MEMRWD 22 /* memory read write expand dwn limit */
#define SDT_MEMRWDA 23 /* memory read write expand dwn limit acessed */
#define SDT_MEME 24 /* memory execute only */
#define SDT_MEMEA 25 /* memory execute only accessed */
#define SDT_MEMER 26 /* memory execute read */
#define SDT_MEMERA 27 /* memory execute read accessed */
#define SDT_MEMEC 28 /* memory execute only conforming */
#define SDT_MEMEAC 29 /* memory execute only accessed conforming */
#define SDT_MEMERC 30 /* memory execute read conforming */
#define SDT_MEMERAC 31 /* memory execute read accessed conforming */
#define S32TEXT 0x08 // segment selector of text section
#define SDT_SYS386TGT 15 /* system 386 trap gate */
#define IPROC(n) X##n
#define idte(e) \
movl $IPROC(e), %eax ; call entry_idt
#define IENTRY_ERR(name,err) \
IPROC(name): \
pushl $err ; \
jmp 1f
.text
.code32
.globl pmm_init
entry_idt:
// Table
// IDTR offset + 0 : entry 0
// IDTR offset + 8 : entry 1
//
// Gate Descriptor
// 63 ~ 48 : offset low
// 47 ~ 32 : info
// 31 ~ 16 : segment selector
// 15 ~ 0 : offset high
movw %ax, (%ebx)
movw $S32TEXT, 2(%ebx)
movw $((0x80|SDT_SYS386TGT) << 8), 4(%ebx)
shr $16, %eax
movw %ax, 6(%ebx)
addl $8, %ebx
ret
.align 8, 0x90
pmm_init:
movl $idt, %ebx
movl $Idtr, %eax
movw $(640 - 1), (%eax)
movl %ebx, 2(%eax)
/* interal interrupts 0~31 */
idte(de); idte(db); idte(nmi); idte(bp); idte(of); idte(br)
idte(ud); idte(nm); idte(df); idte(fo); idte(ts); idte(np)
idte(ss); idte(gp); idte(pf); idte(xx); idte(mf); idte(ac)
idte(mc)
idte(xx); idte(xx); idte(xx); idte(xx); idte(xx); idte(xx)
idte(xx); idte(xx); idte(xx); idte(xx); idte(xx); idte(xx)
idte(xx)
lidt Idtr
ret
.bss
.align 8, 0x90
idt:
.space 640
.globl Idtr
Idtr:
.word 0
.long 0
.word 0
.text
.align 8
gdt:
/* 0x00 : null */
.space 8
/* 0x08 : flat code */
.word 0xFFFF # lolimit
.word 0 # lobase
.byte 0 # midbase
.byte SDT_MEMERAC | 0 | 0x80 # RXAC, dpl = 0, present
.byte 0xf | 0 | 0x40 | 0x80 # hilimit, xx, 32bit, 4k granularity
.byte 0 # hibase
/* 0x10 : flat data */
.word 0xFFFF # lolimit
.word 0 # lobase
.byte 0 # midbase
.byte SDT_MEMRWA | 0 | 0x80 # RWA, dpl = 0, present
.byte 0xf | 0 | 0x40 | 0x80 # hilimit, xx, 32bit, 4k granularity
.byte 0 # hibase
/* 0x18 : 16 bit code */
.word 0xFFFF # lolimit
.word (LINKADDR & 0xffff) # lobase
.byte (LINKADDR >> 16) & 0xff # midbase
.byte SDT_MEMERAC | 0 | 0x80 # RXAC, dpl = 0, present
.byte 0x0 | 0 | 0 | 0 # hilimit, xx, 16bit, byte granularity
.byte (LINKADDR >> 20) & 0xff # hibase
/* 0x20 : 16 bit data */
.word 0xFFFF # lolimit
.word (LINKADDR & 0xffff) # lobase
.byte (LINKADDR >> 16) & 0xff # midbase
.byte SDT_MEMRWA | 0 | 0x80 # RWA, dpl = 0, present
.byte 0x0 | 0 | 0 | 0 # hilimit, xx, 16bit, byte granularity
.byte (LINKADDR >> 20) & 0xff # hibase
// Register GDT
.globl Gdtr
Gdtr:
.word . - gdt -1
.long gdt
.word 0
// ENTRY Reserved
IPROC(xx):
pushl $1
pushl $T_RESERVED
jmp 1f
// trap entry points
IENTRY_ERR(de,T_DIVIDE) /* #DE divide by zero */
IENTRY_ERR(db,T_TRCTRAP) /* #DB debug */
IENTRY_ERR(nmi,T_NMI) /* NMI */
IENTRY_ERR(bp,T_BPTFLT) /* #BP breakpoint */
IENTRY_ERR(of,T_OFLOW) /* #OF overflow */
IENTRY_ERR(br,T_BOUND) /* #BR BOUND range exceeded */
IENTRY_ERR(ud,T_PRIVINFLT) /* #UD invalid opcode */
IENTRY_ERR(nm,T_DNA) /* #NM device not available */
IENTRY_ERR(df,T_DOUBLEFLT) /* #DF double fault */
IENTRY_ERR(fo,T_FPOPFLT) /* #FO coprocessor segment overrun */
IENTRY_ERR(ts,T_TSSFLT) /* #TS invalid TSS */
IENTRY_ERR(np,T_SEGNPFLT) /* #NP segment not present */
IENTRY_ERR(ss,T_STKFLT) /* #SS stack fault */
IENTRY_ERR(gp,T_PROTFLT) /* #GP general protection */
IENTRY_ERR(pf,T_PAGEFLT) /* #PF page fault */
IENTRY_ERR(mf,T_ARITHTRAP) /* #MF floating point error */
IENTRY_ERR(ac,T_ALIGNFLT) /* #AC alignment check */
IENTRY_ERR(mc,T_MACHK) /* #MC machine check */
1:
jmp alltraps
// in boot mode don't want handle trap
alltraps:
hlt
iret
// bios interrupt entry point
// switch to real to protected mode and emulate 16bit mode
.globl EMUh
.align 8, 0x90
EMUh:
pushl %eax
.end