This commit is contained in:
rsc 2007-08-08 09:12:53 +00:00
parent 5d0fe3445b
commit 3fd50978a8
2 changed files with 17 additions and 20 deletions

3
BUGS
View file

@ -1,9 +1,6 @@
index: index:
SEG_NULL, SEG_ASM not in the index SEG_NULL, SEG_ASM not in the index
mmu.h:
funny \ alignment in mmu.h
proc.c: proc.c:
as a consequence of the implementation of proc_kill, as a consequence of the implementation of proc_kill,
any loop calling sleep should check for p->killed any loop calling sleep should check for p->killed

34
mmu.h
View file

@ -47,12 +47,12 @@ struct segdesc {
// Normal segment // Normal segment
#define SEG(type, base, lim, dpl) (struct segdesc) \ #define SEG(type, base, lim, dpl) (struct segdesc) \
{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \ { ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \
type, 1, dpl, 1, (uint) (lim) >> 28, 0, 0, 1, 1, \ type, 1, dpl, 1, (uint) (lim) >> 28, 0, 0, 1, 1, \
(uint) (base) >> 24 } (uint) (base) >> 24 }
#define SEG16(type, base, lim, dpl) (struct segdesc) \ #define SEG16(type, base, lim, dpl) (struct segdesc) \
{ (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \ { (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \
type, 1, dpl, 1, (uint) (lim) >> 16, 0, 0, 1, 0, \ type, 1, dpl, 1, (uint) (lim) >> 16, 0, 0, 1, 0, \
(uint) (base) >> 24 } (uint) (base) >> 24 }
#define DPL_USER 0x3 // User DPL #define DPL_USER 0x3 // User DPL
@ -81,9 +81,9 @@ struct segdesc {
// Task state segment format // Task state segment format
struct taskstate { struct taskstate {
uint link; // Old ts selector uint link; // Old ts selector
uint esp0; // Stack pointers and segment selectors uint esp0; // Stack pointers and segment selectors
ushort ss0; // after an increase in privilege level ushort ss0; // after an increase in privilege level
ushort padding1; ushort padding1;
uint *esp1; uint *esp1;
ushort ss1; ushort ss1;
@ -91,10 +91,10 @@ struct taskstate {
uint *esp2; uint *esp2;
ushort ss2; ushort ss2;
ushort padding3; ushort padding3;
void *cr3; // Page directory base void *cr3; // Page directory base
uint *eip; // Saved state from last task switch uint *eip; // Saved state from last task switch
uint eflags; uint eflags;
uint eax; // More saved state (registers) uint eax; // More saved state (registers)
uint ecx; uint ecx;
uint edx; uint edx;
uint ebx; uint ebx;
@ -102,7 +102,7 @@ struct taskstate {
uint *ebp; uint *ebp;
uint esi; uint esi;
uint edi; uint edi;
ushort es; // Even more saved state (segment selectors) ushort es; // Even more saved state (segment selectors)
ushort padding4; ushort padding4;
ushort cs; ushort cs;
ushort padding5; ushort padding5;
@ -116,8 +116,8 @@ struct taskstate {
ushort padding9; ushort padding9;
ushort ldt; ushort ldt;
ushort padding10; ushort padding10;
ushort t; // Trap on task switch ushort t; // Trap on task switch
ushort iomb; // I/O map base address ushort iomb; // I/O map base address
}; };
// Gate descriptors for interrupts and traps // Gate descriptors for interrupts and traps
@ -141,16 +141,16 @@ struct gatedesc {
// - dpl: Descriptor Privilege Level - // - dpl: Descriptor Privilege Level -
// the privilege level required for software to invoke // the privilege level required for software to invoke
// this interrupt/trap gate explicitly using an int instruction. // this interrupt/trap gate explicitly using an int instruction.
#define SETGATE(gate, istrap, sel, off, d) \ #define SETGATE(gate, istrap, sel, off, d) \
{ \ { \
(gate).off_15_0 = (uint) (off) & 0xffff; \ (gate).off_15_0 = (uint) (off) & 0xffff; \
(gate).ss = (sel); \ (gate).ss = (sel); \
(gate).args = 0; \ (gate).args = 0; \
(gate).rsv1 = 0; \ (gate).rsv1 = 0; \
(gate).type = (istrap) ? STS_TG32 : STS_IG32; \ (gate).type = (istrap) ? STS_TG32 : STS_IG32; \
(gate).s = 0; \ (gate).s = 0; \
(gate).dpl = (d); \ (gate).dpl = (d); \
(gate).p = 1; \ (gate).p = 1; \
(gate).off_31_16 = (uint) (off) >> 16; \ (gate).off_31_16 = (uint) (off) >> 16; \
} }