|
@@ -36,47 +36,6 @@ static struct tty* console = NULL;
|
|
|
#define INIT_OK() printkf("ok\n")
|
|
|
#define INIT_FAILED() printkf("failed\n")
|
|
|
|
|
|
-static inline void show_mem_info(char* buf)
|
|
|
-{
|
|
|
- uint32_t mem_size = 0;
|
|
|
- mem_size += 1024 * asm_mem_size_info.n_1k_blks;
|
|
|
- mem_size += 64 * 1024 * asm_mem_size_info.n_64k_blks;
|
|
|
-
|
|
|
- printkf(
|
|
|
- "Memory size: %d bytes (%d MB), 16k blocks: %d, 64k blocks: %d\n",
|
|
|
- mem_size,
|
|
|
- mem_size / 1024 / 1024,
|
|
|
- (int32_t)asm_mem_size_info.n_1k_blks,
|
|
|
- (int32_t)asm_mem_size_info.n_64k_blks);
|
|
|
-
|
|
|
- printkf(
|
|
|
- "mem_map_entry_count: %d , mem_map_entry_size: %d \n",
|
|
|
- asm_e820_mem_map_count,
|
|
|
- asm_e820_mem_map_entry_size);
|
|
|
-
|
|
|
- if (asm_e820_mem_map_entry_size == 20) {
|
|
|
- for (uint32_t i = 0; i < asm_e820_mem_map_count; ++i) {
|
|
|
- printkf(
|
|
|
- "[mem] entry %d: %llx ~ %llx, type: %d\n",
|
|
|
- i,
|
|
|
- e820_mem_map_20[i].base,
|
|
|
- e820_mem_map_20[i].base + e820_mem_map_20[i].len,
|
|
|
- e820_mem_map_20[i].type);
|
|
|
- }
|
|
|
- } else {
|
|
|
- for (uint32_t i = 0; i < asm_e820_mem_map_count; ++i) {
|
|
|
- printkf(
|
|
|
- "[mem] entry %d: %lld ~ %lld, type: %d, acpi_attr: %d\n",
|
|
|
- i,
|
|
|
- e820_mem_map_24[i].in.base,
|
|
|
- e820_mem_map_24[i].in.base + e820_mem_map_24[i].in.len,
|
|
|
- e820_mem_map_24[i].in.type,
|
|
|
- e820_mem_map_24[i].acpi_extension_attr);
|
|
|
- }
|
|
|
- }
|
|
|
- printkf("kernel size: %x\n", kernel_size);
|
|
|
-}
|
|
|
-
|
|
|
static inline void check_a20_status(void)
|
|
|
{
|
|
|
uint32_t result;
|
|
@@ -97,12 +56,79 @@ static inline void halt_on_init_error(void)
|
|
|
asm_hlt();
|
|
|
}
|
|
|
|
|
|
+uint8_t e820_mem_map[1024];
|
|
|
+uint32_t e820_mem_map_count;
|
|
|
+uint32_t e820_mem_map_entry_size;
|
|
|
+size_t kernel_size;
|
|
|
+struct mem_size_info mem_size_info;
|
|
|
+
|
|
|
+static inline void save_loader_data(void)
|
|
|
+{
|
|
|
+ memcpy(e820_mem_map, asm_e820_mem_map, sizeof(e820_mem_map));
|
|
|
+ e820_mem_map_count = asm_e820_mem_map_count;
|
|
|
+ e820_mem_map_entry_size = asm_e820_mem_map_entry_size;
|
|
|
+ kernel_size = asm_kernel_size;
|
|
|
+ memcpy(&mem_size_info, &asm_mem_size_info, sizeof(struct mem_size_info));
|
|
|
+}
|
|
|
+
|
|
|
+static inline void show_mem_info(char* buf)
|
|
|
+{
|
|
|
+ uint32_t mem_size = 0;
|
|
|
+ mem_size += 1024 * mem_size_info.n_1k_blks;
|
|
|
+ mem_size += 64 * 1024 * mem_size_info.n_64k_blks;
|
|
|
+
|
|
|
+ printkf(
|
|
|
+ "Memory size: %d bytes (%d MB), 16k blocks: %d, 64k blocks: %d\n",
|
|
|
+ mem_size,
|
|
|
+ mem_size / 1024 / 1024,
|
|
|
+ (int32_t)mem_size_info.n_1k_blks,
|
|
|
+ (int32_t)mem_size_info.n_64k_blks);
|
|
|
+
|
|
|
+ printkf(
|
|
|
+ "mem_map_entry_count: %d , mem_map_entry_size: %d \n",
|
|
|
+ e820_mem_map_count,
|
|
|
+ e820_mem_map_entry_size);
|
|
|
+
|
|
|
+ if (e820_mem_map_entry_size == 20) {
|
|
|
+ struct e820_mem_map_entry_20* entry = (struct e820_mem_map_entry_20*)e820_mem_map;
|
|
|
+ for (uint32_t i = 0; i < e820_mem_map_count; ++i, ++entry) {
|
|
|
+ if (entry->type != 1)
|
|
|
+ {
|
|
|
+ printkf(
|
|
|
+ "[mem] entry %d: %llx ~ %llx, type: %d\n",
|
|
|
+ i,
|
|
|
+ entry->base,
|
|
|
+ entry->base + entry->len,
|
|
|
+ entry->type);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ struct e820_mem_map_entry_24* entry = (struct e820_mem_map_entry_24*)e820_mem_map;
|
|
|
+ for (uint32_t i = 0; i < e820_mem_map_count; ++i, ++entry) {
|
|
|
+ if (entry->in.type != 1)
|
|
|
+ {
|
|
|
+ printkf(
|
|
|
+ "[mem] entry %d: %lld ~ %lld, type: %d, acpi_attr: %d\n",
|
|
|
+ i,
|
|
|
+ entry->in.base,
|
|
|
+ entry->in.base + entry->in.len,
|
|
|
+ entry->in.type,
|
|
|
+ entry->acpi_extension_attr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ printkf("kernel size: %x\n", kernel_size);
|
|
|
+}
|
|
|
+
|
|
|
void kernel_main(void)
|
|
|
{
|
|
|
MAKE_BREAK_POINT();
|
|
|
+ save_loader_data();
|
|
|
|
|
|
char buf[KERNEL_MAIN_BUF_SIZE];
|
|
|
|
|
|
+ init_serial_port(PORT_SERIAL0);
|
|
|
+
|
|
|
struct tty early_console;
|
|
|
if (make_serial_tty(&early_console, PORT_SERIAL0) != GB_OK) {
|
|
|
halt_on_init_error();
|
|
@@ -142,14 +168,6 @@ void kernel_main(void)
|
|
|
// vga_printk(k_malloc_buf, 0x0fu);
|
|
|
k_free(k_malloc_buf);
|
|
|
|
|
|
- INIT_START("serial ports");
|
|
|
- int result = init_serial_port(PORT_SERIAL0);
|
|
|
- if (result == 0) {
|
|
|
- INIT_OK();
|
|
|
- } else {
|
|
|
- INIT_FAILED();
|
|
|
- }
|
|
|
-
|
|
|
void* kernel_stack = k_malloc(KERNEL_STACK_SIZE);
|
|
|
init_gdt_with_tss(kernel_stack + KERNEL_STACK_SIZE - 1, KERNEL_STACK_SEGMENT);
|
|
|
printkf("new GDT and TSS loaded\n");
|