Some vague attempts at GDT stuff
This commit is contained in:
parent
e04489a8c3
commit
f15f5f4fc4
3 changed files with 76 additions and 0 deletions
34
arch/i386/gdt.S
Normal file
34
arch/i386/gdt.S
Normal file
|
@ -0,0 +1,34 @@
|
|||
.globl set_gdt
|
||||
.type set_gdt,%function
|
||||
|
||||
gdtr:
|
||||
.word 0
|
||||
.int 0
|
||||
|
||||
set_gdt:
|
||||
.fnstart
|
||||
mov 4(%esp), %eax
|
||||
mov %eax, 2($gdtr)
|
||||
mov 8(%esp), %ax
|
||||
mov %ax, $gdtr
|
||||
lgdt $gdtr
|
||||
ret
|
||||
.fnend
|
||||
|
||||
.globl reload_segments
|
||||
.type reload_segments,%function
|
||||
|
||||
reload_segments:
|
||||
.fnstart
|
||||
jmp 0x08:reload_CS
|
||||
.fnend
|
||||
|
||||
reload_CS:
|
||||
mov 0x10, %ax
|
||||
mov %ax, %ds
|
||||
mov %ax, %es
|
||||
mov %ax, %fs
|
||||
mov %ax, %gs
|
||||
mov %ax, %ss
|
||||
ret
|
||||
|
28
arch/i386/gdt.c
Normal file
28
arch/i386/gdt.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
void encode_gdt_entry(unsigned short int * target, struct GDT source) {
|
||||
if((source.limit > 65536) && ((source.limit & 0xFFF) != 0xFFF)) {
|
||||
/* This needs to error out. */
|
||||
return;
|
||||
}
|
||||
if(source.limit > 65536) {
|
||||
/* Granularity adjustments */
|
||||
source.limit = source.limit >> 12;
|
||||
target[6] = 0xC0;
|
||||
}
|
||||
else {
|
||||
target[6] = 0x40;
|
||||
}
|
||||
|
||||
/* Encode limit */
|
||||
target[0] = source.limit & 0xFF;
|
||||
target[1] = (source.limit >> 8) & 0xFF;
|
||||
target[6] |= (source.limit >> 16) & 0xF;
|
||||
|
||||
/* Encode base */
|
||||
target[2] = source.base & 0xFF;
|
||||
target[3] = (source.base >> 8) & 0xFF;
|
||||
target[4] = (source.base >> 16) & 0xFF;
|
||||
target[7] = (source.base >> 24) & 0xFF;
|
||||
|
||||
/* Encode type */
|
||||
target[5] = source.type;
|
||||
}
|
14
arch/i386/gdt.h
Normal file
14
arch/i386/gdt.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
#ifndef _ARCH_I386_GDT_H
|
||||
#define _ARCH_I386_GDT_H
|
||||
|
||||
struct GDT {
|
||||
unsigned int limit;
|
||||
unsigned long int base;
|
||||
unsigned short int type;
|
||||
};
|
||||
|
||||
void encode_gdt_entry(unsigned short int *, struct GDT);
|
||||
extern void set_gdt(void);
|
||||
extern void reload_segments(void);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue