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 {
|
typedef struct {
|
||||||
uint16_t size;
|
uint16_t size;
|
||||||
uint16_t offset_upper;
|
|
||||||
uint16_t offset_lower;
|
uint16_t offset_lower;
|
||||||
|
uint16_t offset_upper;
|
||||||
uint16_t _reserved;
|
uint16_t _reserved;
|
||||||
} gdtr_t;
|
} gdtr_t;
|
||||||
#define gdt_build_gdtr(size, offset) \
|
|
||||||
{(size), ((offset >> 16u) & 0xFFFFu), (offset & 0xFFFFu), 0u}
|
|
||||||
|
|
||||||
typedef uint64_t gdt_entry_t;
|
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)( \
|
||||||
(((gdt_entry_t)base << 32) & 0xFF00000000000000ull) | /* Base 0:15 */ \
|
(((gdt_entry_t)base << 32) & 0xFF00000000000000ull) | /* Base 0:15 */ \
|
||||||
(((gdt_entry_t)gr & 0x1u) << 55) | /* Granularity (0 = bytes, 1 = blocks) */ \
|
(((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)base << 16) & 0x000000FFFFFF0000ull) | /* Base 0:23 */ \
|
||||||
((gdt_entry_t)limit & 0x000000000000FFFFull)) /* Limit 0:15 */
|
((gdt_entry_t)limit & 0x000000000000FFFFull)) /* Limit 0:15 */
|
||||||
|
|
||||||
|
void gdt_init(void);
|
||||||
|
void gdt_set(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,9 +2,11 @@
|
|||||||
#include "fb.h"
|
#include "fb.h"
|
||||||
#include "mbinfo.h"
|
#include "mbinfo.h"
|
||||||
#include "klog.h"
|
#include "klog.h"
|
||||||
|
#include "gdt.h"
|
||||||
|
|
||||||
void hos_main(uint32_t mbinfo_addr)
|
void hos_main(uint32_t mbinfo_addr)
|
||||||
{
|
{
|
||||||
|
gdt_init();
|
||||||
if (!mbinfo_init(mbinfo_addr))
|
if (!mbinfo_init(mbinfo_addr))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user