# HG changeset patch # User John Tsiombikas # Date 1297835425 -7200 # Node ID 78d5c304ddd075368204e1eb1328cf466548d976 # Parent 611b2d66420bd94f9f0c7c45101dfd1e18200501 minor changes diff -r 611b2d66420b -r 78d5c304ddd0 src/segm-asm.S --- a/src/segm-asm.S Wed Feb 16 07:26:03 2011 +0200 +++ b/src/segm-asm.S Wed Feb 16 07:50:25 2011 +0200 @@ -1,27 +1,25 @@ .data + .align 4 +/* memory reserved for setup_selectors */ off:.long 0 seg:.short 0 - - .align - .short 0 -gdt_lim: - .short 0 -gdt_addr: - .long 0 +/* memory reserved for set_gdt */ +lim:.short 0 +addr:.long 0 .text /* setup_selectors(uint16_t code, uint16_t data) * loads the requested selectors to all the selector registers */ .globl setup_selectors setup_selectors: - /* setup data selectors */ + /* set data selectors directly */ movl 8(%esp), %eax movw %ax, %ss movw %ax, %es movw %ax, %ds movw %ax, %gs movw %ax, %fs - /* setup code selector */ + /* set cs using a long jump */ movl 4(%esp), %eax movw %ax, (seg) movl $ldcs, (off) @@ -34,8 +32,8 @@ .globl set_gdt set_gdt: movl 4(%esp), %eax - movl %eax, (gdt_addr) + movl %eax, (addr) movw 8(%esp), %ax - movw %ax, (gdt_lim) - lgdt (gdt_lim) + movw %ax, (lim) + lgdt (lim) ret diff -r 611b2d66420b -r 78d5c304ddd0 src/segm.c --- a/src/segm.c Wed Feb 16 07:26:03 2011 +0200 +++ b/src/segm.c Wed Feb 16 07:50:25 2011 +0200 @@ -1,6 +1,7 @@ #include #include "segm.h" +/* bits for the 3rd 16bt part of the descriptor */ #define BIT_ACCESSED (1 << 8) #define BIT_WR (1 << 9) #define BIT_RD (1 << 9) @@ -10,6 +11,7 @@ #define BIT_NOSYS (1 << 12) #define BIT_PRESENT (1 << 15) +/* bits for the last 16bit part of the descriptor */ #define BIT_BIG (1 << 6) #define BIT_DEFAULT (1 << 6) #define BIT_GRAN (1 << 7) @@ -18,7 +20,12 @@ static void segm_desc(desc_t *desc, uint32_t base, uint32_t limit, int dpl, int type); +/* these functions are implemented in segm-asm.S */ +void setup_selectors(uint16_t code, uint16_t data); +void set_gdt(uint32_t addr, uint16_t limit); + +/* our global descriptor table */ static desc_t gdt[4]; @@ -33,6 +40,7 @@ setup_selectors(selector(SEGM_KCODE, 0), selector(SEGM_KDATA, 0)); } +/* constructs a GDT selector based on index and priviledge level */ uint16_t selector(int idx, int rpl) { return (idx << 3) | (rpl & 3); diff -r 611b2d66420b -r 78d5c304ddd0 src/segm.h --- a/src/segm.h Wed Feb 16 07:26:03 2011 +0200 +++ b/src/segm.h Wed Feb 16 07:50:25 2011 +0200 @@ -12,10 +12,5 @@ uint16_t selector(int idx, int rpl); -/* these functions are implemented in segm-asm.S */ -void setup_selectors(uint16_t code, uint16_t data); -void set_gdt(uint32_t addr, uint16_t limit); - - #endif /* SEGM_H_ */