From 8e7d055e6a4b2fd88df3d46fc6da3c457bf6502e Mon Sep 17 00:00:00 2001 From: Utkarsh Maheshwari Date: Sat, 18 May 2019 14:47:37 +0530 Subject: [PATCH] WIP: try change to 64 bit --- kernel/arch/generic/include/types.h | 2 +- kernel/arch/x86/include/types.h | 17 ++++---------- kernel/include/generic/{ll64.h => lp64.h} | 4 ++-- kernel/include/ll64.h | 8 +++---- kernel/include/multiboot.h | 9 ++++---- kernel/include/page_frame.h | 4 ++-- kernel/interrupt/interrupt.c | 8 +++---- kernel/interrupt/interrupt.h | 2 +- kernel/kernel.c | 5 ++++- kernel/linker.ld | 3 ++- kernel/makefile | 4 ++-- kernel/mm/page_frame.c | 27 ++++++++++++++++------- makefile | 2 +- 13 files changed, 51 insertions(+), 44 deletions(-) rename kernel/include/generic/{ll64.h => lp64.h} (82%) diff --git a/kernel/arch/generic/include/types.h b/kernel/arch/generic/include/types.h index 34b8549..bf32f74 100644 --- a/kernel/arch/generic/include/types.h +++ b/kernel/arch/generic/include/types.h @@ -1,7 +1,7 @@ #ifndef TYPES_H_SNRJBAVH #define TYPES_H_SNRJBAVH -#include "include/generic/ll64.h" +#include "include/generic/lp64.h" #define __kernel_size_t __u32 diff --git a/kernel/arch/x86/include/types.h b/kernel/arch/x86/include/types.h index 752cea4..c1125d6 100644 --- a/kernel/arch/x86/include/types.h +++ b/kernel/arch/x86/include/types.h @@ -3,24 +3,15 @@ #include "arch/generic/include/types.h" -/* TODO: Setup compiler toolchain and remove this */ -#if 0 - #ifdef CONFIG_64BIT # define BITS_PER_LONG 64 -# define __kernel_ulong_t __u64 -# define __kernel_long_t __s64 -#else -# define BITS_PER_LONG 32 -# define __kernel_ulong_t __u32 -# define __kernel_long_t __s32 -#endif +typedef __u64 __kernel_ulong_t; +typedef __s64 __kernel_long_t; #else - # define BITS_PER_LONG 32 -# define __kernel_ulong_t unsigned long -# define __kernel_long_t unsigned long +typedef __u32 __kernel_ulong_t; +typedef __s32 __kernel_long_t; #endif diff --git a/kernel/include/generic/ll64.h b/kernel/include/generic/lp64.h similarity index 82% rename from kernel/include/generic/ll64.h rename to kernel/include/generic/lp64.h index eb88b33..2097a57 100644 --- a/kernel/include/generic/ll64.h +++ b/kernel/include/generic/lp64.h @@ -13,8 +13,8 @@ typedef unsigned short __u16; typedef __signed__ int __s32; typedef unsigned int __u32; -typedef __signed__ long long __s64; -typedef unsigned long long __u64; +typedef __signed__ long __s64; +typedef unsigned long __u64; #endif /* end of include guard: LL64_H_UV2JD7IF */ diff --git a/kernel/include/ll64.h b/kernel/include/ll64.h index 470e42c..7fcf4a6 100644 --- a/kernel/include/ll64.h +++ b/kernel/include/ll64.h @@ -1,6 +1,6 @@ -#ifndef LL64_H_Q0MBWVFF -#define LL64_H_Q0MBWVFF +#ifndef LP64_H_Q0MBWVFF +#define LP64_H_Q0MBWVFF -#include +#include -#endif /* end of include guard: LL64_H_Q0MBWVFF */ +#endif /* end of include guard: LP64_H_Q0MBWVFF */ diff --git a/kernel/include/multiboot.h b/kernel/include/multiboot.h index 0646e59..a02879e 100644 --- a/kernel/include/multiboot.h +++ b/kernel/include/multiboot.h @@ -129,11 +129,12 @@ void multiboot_dump_info (multiboot_info_t *info, uint32_t multiboot_magic); #endif #define FOREACH_MEMORY_MAP(MMAP, INFO) \ - for(multiboot_memory_map_t *MMAP = \ + for( \ + multiboot_memory_map_t *MMAP = \ (multiboot_memory_map_t *)(uintptr_t)INFO->mmap_addr; \ (uintptr_t)MMAP < INFO->mmap_addr + INFO->mmap_len; \ - MMAP = (multiboot_memory_map_t *) \ - ((uintptr_t)MMAP + MMAP->size + sizeof(MMAP->size)) \ - ) + MMAP = \ + (multiboot_memory_map_t *)(MMAP + MMAP->size + sizeof(MMAP->size)) \ + ) #endif /* end of include guard: MULTIBOOT_H_RKNBOMGQ */ diff --git a/kernel/include/page_frame.h b/kernel/include/page_frame.h index 74c639b..3eb1688 100644 --- a/kernel/include/page_frame.h +++ b/kernel/include/page_frame.h @@ -8,10 +8,10 @@ * Initializes the memory frames bitmap, which will be used later by alloc/free * functions. It also allocates some pages to store the said bitmap. * - * @param void * base address where kernel ends + * @param uintptr_t base address where kernel ends * @param multiboot_into_t multiboot info */ -void page_frame_init (void * base_address, +void page_frame_init (uintptr_t base_address, multiboot_info_t *multiboot_info); /** diff --git a/kernel/interrupt/interrupt.c b/kernel/interrupt/interrupt.c index cd405fc..aa62aab 100644 --- a/kernel/interrupt/interrupt.c +++ b/kernel/interrupt/interrupt.c @@ -9,13 +9,13 @@ extern void double_fault_handler_int(void); void isr_set_keyboard(void) { - uint32_t keyboard_address = (uint32_t)&keyboard_handler_int; + uintptr_t keyboard_address = (uintptr_t)&keyboard_handler_int; idt_set_gate(0x21, keyboard_address, 0x08, 0x8e); } void isr_set_double_fault(void) { - idt_set_gate(0x08, (uint32_t)&double_fault_handler_int, 0x08, 0x8f); + idt_set_gate(0x08, (uintptr_t)&double_fault_handler_int, 0x08, 0x8f); } void isr_init_keyboard(void) @@ -28,7 +28,7 @@ void isr_init_keyboard(void) idt_t idt[IDT_SIZE]; -void idt_set_gate(int offset, uint32_t base, uint16_t selector, +void idt_set_gate(int offset, uintptr_t base, uint16_t selector, uint8_t type_attr) { idt[offset].offset_1 = base & 0xffff; @@ -42,7 +42,7 @@ void idt_init(void) { klog_status_init("IDT"); - uint32_t idt_address = (uint32_t)&idt; + uintptr_t idt_address = (uintptr_t)&idt; idt_ptr_t idt_pointer = { .limit = (sizeof(idt_t) * IDT_SIZE) - 1, .base = idt_address diff --git a/kernel/interrupt/interrupt.h b/kernel/interrupt/interrupt.h index b7e09df..d6e1f1f 100644 --- a/kernel/interrupt/interrupt.h +++ b/kernel/interrupt/interrupt.h @@ -60,7 +60,7 @@ typedef struct _idt_ptr_t { #define IDT_SIZE 256 void idt_init(void); -void idt_set_gate(int offset, uint32_t base, uint16_t selector, +void idt_set_gate(int offset, uintptr_t base, uint16_t selector, uint8_t type_attr); void isr_init_keyboard(void); diff --git a/kernel/kernel.c b/kernel/kernel.c index d64fd33..537afc6 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -24,7 +24,10 @@ extern void kmain(multiboot_info_t *multiboot_info, uint32_t multiboot_magic) multiboot_dump_info(multiboot_info, multiboot_magic); #endif - page_frame_init(&endkernel, multiboot_info); + klog(LOG_DEBUG, "uintptr_t: %x\n", sizeof(uintptr_t)); + klog(LOG_DEBUG, "unsigned long: %x\n", sizeof(unsigned long)); + klog(LOG_DEBUG, "unsigned long long: %x\n", sizeof(unsigned long long)); + page_frame_init((uintptr_t)&endkernel, multiboot_info); #ifdef DEBUG page_frame_dump_map(); void *page1 = NULL, *page2 = NULL; diff --git a/kernel/linker.ld b/kernel/linker.ld index 844684b..cb034bc 100644 --- a/kernel/linker.ld +++ b/kernel/linker.ld @@ -11,8 +11,9 @@ SECTIONS *(.text) } - .data ALIGN(0x1000) : { + .data : { *(.data) + . = ALIGN(4096); } .bss : { diff --git a/kernel/makefile b/kernel/makefile index 9d9ceb9..3d81edc 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -1,5 +1,5 @@ ifndef TARGET - TARGET = i686-elf + TARGET = x86_64-elf endif CC = ../.deps/cross/bin/$(TARGET)-gcc @@ -47,7 +47,7 @@ $(BIN): $(OBJS) $(INCLUDE) $(ASM_OBJS) $(BUILD_DIR) $(LD) -T linker.ld $(OBJS) $(ASM_OBJS) -o $@ $(ASM_OBJS): %_asm.o:%.asm $(INCLUDE_DIR)/asm/*.asm - $(CC_ASM) -f elf32 $< -o $@ + $(CC_ASM) -f elf64 $< -o $@ $(OBJS):%.o: %.c $(INCLUDE) $(INCLUDE_DIR)/* $(CC) $(CC_FLAGS) $(CD_FLAGS) -I. -I${INCLUDE_DIR} -c $< -o $@ diff --git a/kernel/mm/page_frame.c b/kernel/mm/page_frame.c index 1a6b83f..0b6dfbf 100644 --- a/kernel/mm/page_frame.c +++ b/kernel/mm/page_frame.c @@ -21,7 +21,10 @@ static uint32_t frames_bitmap_pages; /* size of each frame that is allocated in bytes */ -#define FRAME_SIZE (4096 / 8) /* 4KB */ +#define FRAME_SIZE (4096 / 8) /* 4KB */ +#define BITMAP_SIZE (8 * sizeof(*frames_bitmap)) + +#define FRAME_SIZE_KB 4 /* value in bitmap for used/free */ #define FRAME_FREE 0 @@ -56,25 +59,33 @@ static inline void memory_mark_free(uintptr_t low_address, } -void page_frame_init (void *base_address, multiboot_info_t *multiboot_info) +void page_frame_init(uintptr_t base_address, multiboot_info_t *multiboot_info) { klog_status_init("page_frame"); /* calculate and allocate space for frames_bitmap */ - frames_bitmap = base_address; - num_frames = (multiboot_info->mem_upper) / sizeof(*frames_bitmap); - frames_bitmap_size = (num_frames + 32 - 1) / 32; - memset(frames_bitmap, -1, frames_bitmap_size); + frames_bitmap = (void *)base_address; + num_frames = (multiboot_info->mem_upper + FRAME_SIZE_KB - 1) / FRAME_SIZE_KB; + frames_bitmap_size = (num_frames + BITMAP_SIZE - 1) / BITMAP_SIZE; + memset(frames_bitmap, FRAME_USED, + frames_bitmap_size * sizeof(*frames_bitmap)); /* start memory allocation after frames_bitmap. doing this ensures that there * is memory allocated for the bitmap. */ frames_bitmap_pages = (frames_bitmap_size + FRAME_SIZE - 1) / FRAME_SIZE; - memory_base_address = (uintptr_t)(base_address + (FRAME_SIZE * frames_bitmap_pages)); + memory_base_address = + base_address + (FRAME_SIZE * frames_bitmap_pages); /* mark all free pages */ FOREACH_MEMORY_MAP(mmap, multiboot_info) { if (mmap->type == MULTIBOOT_MEM_TYPE_FREE) { - memory_mark_free(mmap->base_addr_low, mmap->len_low); + klog(LOG_DEBUG, "size: %x\n", sizeof(uintptr_t)); + klog(LOG_DEBUG, "size: %x\n", sizeof(uint32_t)); + klog(LOG_DEBUG, "size: %x\n", sizeof(uint64_t)); + uintptr_t address = 0// ((uintptr_t)mmap->base_addr_high << 32) + + mmap->base_addr_low; + /*klog(LOG_DEBUG, "Free memory at 0x%x\n", address);*/ + memory_mark_free(address, address + mmap->len_low); } } diff --git a/makefile b/makefile index f99b653..7794c59 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ GCC_VERSION = 5.4.0 BINUTILS_VERSION = 2.29 DEPS_PREFIX = $(shell pwd)/.deps/cross -TARGET = i686-elf +TARGET = x86_64-elf BUILD_DIR = build DISK_IMG = $(BUILD_DIR)/disk.img