set up a GDT to stop using the one GRUB set up
This commit is contained in:
parent
3d30025d3b
commit
87c135b010
16
src/gdt.S
Normal file
16
src/gdt.S
Normal file
@ -0,0 +1,16 @@
|
||||
.global gdt_set
|
||||
.extern gdtr
|
||||
.type gdt_set, @function
|
||||
gdt_set:
|
||||
lgdt gdtr
|
||||
jmp $0x8, $gdt_set_reload
|
||||
gdt_set_reload:
|
||||
mov $0x10, %ax
|
||||
mov %ax, %ds
|
||||
mov %ax, %es
|
||||
mov %ax, %fs
|
||||
mov %ax, %gs
|
||||
mov %ax, %ss
|
||||
ret
|
||||
|
||||
.size gdt_set, . - gdt_set
|
20
src/gdt.c
Normal file
20
src/gdt.c
Normal file
@ -0,0 +1,20 @@
|
||||
#include "gdt.h"
|
||||
|
||||
static const gdt_entry_t gdt_entries[] = {
|
||||
/* Null descriptor */
|
||||
0u,
|
||||
/* Code segment for kernel */
|
||||
gdt_build_entry(0u, 0xFFFFFu, 1u, 0u, 1u, 1u, 0u, 1u, 0u, 1u, 1u, 0u),
|
||||
/* Data segment for kernel */
|
||||
gdt_build_entry(0u, 0xFFFFFu, 1u, 0u, 1u, 0u, 0u, 1u, 0u, 1u, 1u, 0u),
|
||||
};
|
||||
|
||||
gdtr_t gdtr;
|
||||
|
||||
void gdt_init(void)
|
||||
{
|
||||
gdtr.size = sizeof(gdt_entries);
|
||||
gdtr.offset_lower = (uintptr_t)gdt_entries & 0xFFFFu;
|
||||
gdtr.offset_upper = (uintptr_t)gdt_entries >> 16u;
|
||||
gdt_set();
|
||||
}
|
@ -5,15 +5,13 @@
|
||||
|
||||
typedef struct {
|
||||
uint16_t size;
|
||||
uint16_t offset_upper;
|
||||
uint16_t offset_lower;
|
||||
uint16_t offset_upper;
|
||||
uint16_t _reserved;
|
||||
} gdtr_t;
|
||||
#define gdt_build_gdtr(size, offset) \
|
||||
{(size), ((offset >> 16u) & 0xFFFFu), (offset & 0xFFFFu), 0u}
|
||||
|
||||
typedef uint64_t gdt_entry_t;
|
||||
#define gdt_build_entry(base, limit, p, privl, s, ex, dc, rw, ac, gr, sz, l) \
|
||||
#define gdt_build_entry(base, limit, pr, privl, s, ex, dc, rw, ac, gr, sz, l) \
|
||||
(gdt_entry_t)( \
|
||||
(((gdt_entry_t)base << 32) & 0xFF00000000000000ull) | /* Base 0:15 */ \
|
||||
(((gdt_entry_t)gr & 0x1u) << 55) | /* Granularity (0 = bytes, 1 = blocks) */ \
|
||||
@ -30,4 +28,7 @@ typedef uint64_t gdt_entry_t;
|
||||
(((gdt_entry_t)base << 16) & 0x000000FFFFFF0000ull) | /* Base 0:23 */ \
|
||||
((gdt_entry_t)limit & 0x000000000000FFFFull)) /* Limit 0:15 */
|
||||
|
||||
void gdt_init(void);
|
||||
void gdt_set(void);
|
||||
|
||||
#endif
|
||||
|
@ -2,9 +2,11 @@
|
||||
#include "fb.h"
|
||||
#include "mbinfo.h"
|
||||
#include "klog.h"
|
||||
#include "gdt.h"
|
||||
|
||||
void hos_main(uint32_t mbinfo_addr)
|
||||
{
|
||||
gdt_init();
|
||||
if (!mbinfo_init(mbinfo_addr))
|
||||
{
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user