mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 06:28:22 +00:00
Initial commit
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
objects := $(patsubst %.c,%.o,$(wildcard *.c))
|
||||
subdirs=boot
|
||||
OBJPATH=$(OBJDIR)/arch/${TARGET}/
|
||||
export
|
||||
|
||||
all: $(objects) $(subdirs)
|
||||
for subdir in $(subdirs) ; do $(MAKE) -C $${subdir} ; done
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
mkdir -p $(OBJPATH)
|
||||
cp $@ $(OBJPATH)/$@
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
objects := $(patsubst %.c,%.o,$(wildcard *.c))
|
||||
OBJPATH=$(OBJDIR)/arch/$(TARGET)/boot
|
||||
export
|
||||
|
||||
all: $(objects)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
mkdir -p $(OBJPATH)
|
||||
cp $@ $(OBJPATH)/$@
|
||||
@@ -0,0 +1,9 @@
|
||||
extern void kmain();
|
||||
|
||||
extern void _start(){
|
||||
|
||||
kmain();
|
||||
|
||||
asm("cli;hlt;");
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#include <arch/cls.h>
|
||||
#include <arch/msr.h>
|
||||
#include <stdint.h>
|
||||
|
||||
cls_t bspcls;
|
||||
|
||||
|
||||
void arch_setcls(void* addr){
|
||||
wrmsr(MSR_GSBASE, (uint64_t)addr);
|
||||
}
|
||||
|
||||
void* arch_getcls(){
|
||||
return (void*)rdmsr(MSR_GSBASE);
|
||||
}
|
||||
|
||||
void bsp_setcls(){
|
||||
arch_setcls(&bspcls);
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
#include <arch/cls.h>
|
||||
#include <arch/gdt.h>
|
||||
#include <arch/ist.h>
|
||||
|
||||
static void setseg(segdesc __seg_gs *seg, uint32_t limit, uint32_t offset, uint8_t flags, uint8_t access){
|
||||
|
||||
}
|
||||
|
||||
static void setsys64(sys64 __seg_gs *e, uint32_t limit, uint64_t offset, uint8_t flags, uint8_t access){
|
||||
|
||||
}
|
||||
|
||||
static void reloadgdtr(){
|
||||
gdtr_t gdtr;
|
||||
gdtr.offset = (uint64_t)&cls->gdt + arch_getcls();
|
||||
gdtr.size = sizeof(gdt_t) - 1;
|
||||
|
||||
asm("lgdt (%%rax)" : : "a"(&gdtr) : "memory");
|
||||
}
|
||||
|
||||
void gdt_bspinit(){
|
||||
|
||||
gdt_t __seg_gs *gdt = &cls->gdt;
|
||||
|
||||
setseg(&gdt->null, 0, 0, 0, 0);
|
||||
|
||||
setseg(&gdt->kcode16, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ);
|
||||
|
||||
setseg(&gdt->kdata16, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE);
|
||||
|
||||
setseg(&gdt->kcode32, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_PMODE, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_CODE_READ);
|
||||
|
||||
setseg(&gdt->kdata32, 0xFFFFF, 0, FLAGS_PAGE_GRANULARITY | FLAGS_PMODE, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE);
|
||||
|
||||
setseg(&gdt->kcode64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ);
|
||||
|
||||
setseg(&gdt->kdata64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE);
|
||||
|
||||
|
||||
setseg(&gdt->kcode64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_EXEC | ACCESS_CODE_READ | ACCESS_DPL3);
|
||||
|
||||
setseg(&gdt->kdata64, 0, 0, FLAGS_PAGE_GRANULARITY | FLAGS_LONG, ACCESS_PRESENT | ACCESS_SEGMENT | ACCESS_DATA_WRITE | ACCESS_DPL3);
|
||||
|
||||
// TODO get this working right
|
||||
|
||||
//setsys64(&gdt->ist, sizeof(ist_t), (uint64_t)(arch_getcls()), FLAGS_LONG, SYSTEM_TYPE_IST | ACCESS_PRESENT);
|
||||
|
||||
reloadgdtr();
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef _CLS_H_INCLUDE
|
||||
#define _CLS_H_INCLUDE
|
||||
|
||||
#include <arch/gdt.h>
|
||||
#include <arch/ist.h>
|
||||
|
||||
// cpu level storage
|
||||
// this will be pointed to by GS and will contain per cpu info
|
||||
|
||||
typedef struct{
|
||||
gdt_t gdt;
|
||||
ist_t ist;
|
||||
} cls_t;
|
||||
|
||||
void bsp_setcls();
|
||||
void arch_setcls(void* addr);
|
||||
void* arch_getcls();
|
||||
|
||||
static cls_t __seg_gs *cls = 0;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,57 @@
|
||||
#ifndef _GDT_H_INCLUDE
|
||||
#define _GDT_H_INCLUDE
|
||||
|
||||
#define ACCESS_PRESENT (1 << 7)
|
||||
#define ACCESS_DPL3 (3 << 5)
|
||||
#define ACCESS_SEGMENT (1 << 4)
|
||||
#define ACCESS_EXEC (1 << 3)
|
||||
#define ACCESS_DIR (1 << 2)
|
||||
#define ACCESS_CONFORM (1 << 2)
|
||||
#define ACCESS_CODE_READ (1 << 1)
|
||||
#define ACCESS_DATA_WRITE (1 << 1)
|
||||
|
||||
#define FLAGS_LONG (1 << 1)
|
||||
#define FLAGS_PMODE (1 << 2)
|
||||
#define FLAGS_PAGE_GRANULARITY (1 << 3)
|
||||
|
||||
#define SYSTEM_TYPE_IST 0x9
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct{
|
||||
uint16_t size;
|
||||
uint64_t offset;
|
||||
} __attribute__((packed)) gdtr_t;
|
||||
|
||||
typedef struct{
|
||||
uint16_t limit;
|
||||
uint16_t offset1;
|
||||
uint8_t offset2;
|
||||
uint8_t access;
|
||||
uint8_t flags;
|
||||
uint8_t offset3;
|
||||
} __attribute__((packed)) segdesc;
|
||||
|
||||
typedef struct{
|
||||
uint16_t limit;
|
||||
uint16_t offset1;
|
||||
uint8_t offset2;
|
||||
uint8_t access;
|
||||
uint8_t flags;
|
||||
uint8_t offset3;
|
||||
uint32_t offset4;
|
||||
uint32_t reserved;
|
||||
} __attribute__((packed)) sys64;
|
||||
|
||||
typedef struct{
|
||||
segdesc null;
|
||||
segdesc kcode16;
|
||||
segdesc kdata16;
|
||||
segdesc kcode32;
|
||||
segdesc kdata32;
|
||||
segdesc kcode64;
|
||||
segdesc kdata64;
|
||||
sys64 ist;
|
||||
} gdt_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef _IST_H_INCLUDE
|
||||
#define _IST_H_INCLUDE
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct{
|
||||
uint32_t IOPB;
|
||||
uint64_t reserved3;
|
||||
uint64_t ist7;
|
||||
uint64_t ist6;
|
||||
uint64_t ist5;
|
||||
uint64_t ist4;
|
||||
uint64_t ist3;
|
||||
uint64_t ist2;
|
||||
uint64_t ist1;
|
||||
uint64_t reserved2;
|
||||
uint64_t rsp2;
|
||||
uint64_t rsp1;
|
||||
uint64_t rsp0;
|
||||
uint64_t reserved;
|
||||
} __attribute((packed)) ist_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef _MSR_H_INCLUDE
|
||||
#define _MSR_H_INCLUDE
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define MSR_FSBASE 0xC0000100
|
||||
#define MSR_GSBASE 0xC0000101
|
||||
#define MSR_KERNELGSBASE 0xC0000102
|
||||
|
||||
static inline uint64_t rdmsr(uint32_t which){
|
||||
uint64_t low,high;
|
||||
asm volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(which));
|
||||
return (high << 32) | low;
|
||||
|
||||
}
|
||||
|
||||
static inline void wrmsr(uint32_t which, uint64_t value){
|
||||
uint32_t low = value & 0xFFFFFFFF;
|
||||
uint32_t high = (value >> 32) & 0xFFFFFFFF;
|
||||
asm volatile("wrmsr" : : "a"(low), "d"(high), "c"(which));
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <limine.h>
|
||||
#include <kernel/console.h>
|
||||
#include <arch/cls.h>
|
||||
|
||||
static volatile struct limine_terminal_request liminettyr = {
|
||||
.id = LIMINE_TERMINAL_REQUEST,
|
||||
.revision = 0
|
||||
};
|
||||
|
||||
struct limine_terminal_response* liminetty;
|
||||
|
||||
void liminewrite(char* str, size_t c){
|
||||
|
||||
liminetty->write(liminetty->terminals[0], str, c);
|
||||
|
||||
}
|
||||
|
||||
void kmain(){
|
||||
if(!liminettyr.response)
|
||||
return;
|
||||
|
||||
liminetty = liminettyr.response;
|
||||
liminetty->write += 0xFFFF800000000000;
|
||||
|
||||
console_setwritehook(liminewrite);
|
||||
|
||||
bsp_setcls();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user