fix gcc warnings & improved makefile echos
authorMinep <zelong56@gmail.com>
Sat, 26 Feb 2022 18:06:55 +0000 (18:06 +0000)
committerMinep <zelong56@gmail.com>
Sat, 26 Feb 2022 18:06:55 +0000 (18:06 +0000)
lunaix-os/config/make-cc
lunaix-os/hal/cpu.c
lunaix-os/includes/hal/cpu.h
lunaix-os/includes/lunaix/mm/page.h
lunaix-os/kernel/asm/x86/interrupts.c
lunaix-os/kernel/k_main.c
lunaix-os/kernel/mm/pmm.c
lunaix-os/kernel/mm/vmm.c
lunaix-os/libs/libc/stdlib/itoa.c
lunaix-os/makefile

index f3ce340ae14c890a64eba149cdacbe270965f6fe..643b4eee1dbefc44c9c9e0f86d9f0c4534b62f8a 100644 (file)
@@ -4,6 +4,6 @@ AS := i686-elf-as
 
 ARCH_OPT := -D__ARCH_IA32
 O := -O2
 
 ARCH_OPT := -D__ARCH_IA32
 O := -O2
-W := -Wall -Wextra
+W := -Wall -Wextra -Wno-unknown-pragmas
 CFLAGS := -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT)
 LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
\ No newline at end of file
 CFLAGS := -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT)
 LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
\ No newline at end of file
index b2ef65704e00512b7a31652f3130fc0e78e3ffe6..d57ae26d4a07447957ad2da56a3adc801afd771c 100644 (file)
@@ -4,7 +4,7 @@
 
 void cpu_get_model(char* model_out) {
     uint32_t* out = (uint32_t*)model_out;
 
 void cpu_get_model(char* model_out) {
     uint32_t* out = (uint32_t*)model_out;
-    reg32 eax, ebx, edx, ecx;
+    reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
     
     __get_cpuid(0, &eax, &ebx, &ecx, &edx);
 
     
     __get_cpuid(0, &eax, &ebx, &ecx, &edx);
 
@@ -27,7 +27,7 @@ void cpu_get_brand(char* brand_out) {
         brand_out[1] = '\0';
     }
     uint32_t* out = (uint32_t*) brand_out;
         brand_out[1] = '\0';
     }
     uint32_t* out = (uint32_t*) brand_out;
-    reg32 eax, ebx, edx, ecx;
+    reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
     for (uint32_t i = 2, j = 0; i < 5; i++)
     {
         __get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx);
     for (uint32_t i = 2, j = 0; i < 5; i++)
     {
         __get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx);
@@ -40,6 +40,8 @@ void cpu_get_brand(char* brand_out) {
     brand_out[48] = '\0';
 }
 
     brand_out[48] = '\0';
 }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wreturn-type"
 reg32 cpu_r_cr0() {
     asm volatile ("mov %cr0, %eax");
 }
 reg32 cpu_r_cr0() {
     asm volatile ("mov %cr0, %eax");
 }
@@ -51,6 +53,7 @@ reg32 cpu_r_cr2() {
 reg32 cpu_r_cr3() {
     asm volatile ("mov %cr3, %eax");
 }
 reg32 cpu_r_cr3() {
     asm volatile ("mov %cr3, %eax");
 }
+#pragma GCC diagnostic push
 
 void cpu_w_cr0(reg32 v) {
     asm volatile (
 
 void cpu_w_cr0(reg32 v) {
     asm volatile (
index 2a06f298e2b0e55c277c09b72e4726c3d3668d42..af8863e0b1194d2524cb8e7b707f807d3542310e 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __LUNAIX_CPU_H
 #define __LUNAIX_CPU_H
 
 #ifndef __LUNAIX_CPU_H
 #define __LUNAIX_CPU_H
 
-typedef unsigned long reg32;
+typedef unsigned int reg32;
 typedef unsigned short reg16;
 
 typedef struct {
 typedef unsigned short reg16;
 
 typedef struct {
index c9818396870b7d3e3c9337b4f3a6def5409f73df..29232580b6afeca0fb4e8a45da68f1bc1ace96cc 100644 (file)
@@ -54,8 +54,8 @@
 // 用来获取特定的页表的虚拟地址
 #define PT_VADDR(pd_offset)           (PT_BASE_VADDR | (pd_offset << 12))
 
 // 用来获取特定的页表的虚拟地址
 #define PT_VADDR(pd_offset)           (PT_BASE_VADDR | (pd_offset << 12))
 
-typedef unsigned int ptd_t;
-typedef unsigned int pt_t;
+typedef unsigned long ptd_t;
+typedef unsigned long pt_t;
 typedef unsigned int pt_attr;
 
 
 typedef unsigned int pt_attr;
 
 
index 39682a38a2c850e8df3b1e4a7dee6da55eec347c..686c43de3ec6771cf4cda3a0780d63743ce19772 100644 (file)
@@ -2,7 +2,6 @@
 #include <libc/stdio.h>
 
 void isr0 (isr_param* param) {
 #include <libc/stdio.h>
 
 void isr0 (isr_param* param) {
-    tty_clear();
     printf("[PANIC] Exception (%d) CS=0x%X, EIP=0x%X", param->vector, param->cs, param->eip);
 }
 
     printf("[PANIC] Exception (%d) CS=0x%X, EIP=0x%X", param->vector, param->cs, param->eip);
 }
 
index 3a7e200f562e1d8ed15e9705c01e7c42dcb82f59..731ba9b14e8266b2b5132b077638e739b70289a3 100644 (file)
@@ -15,9 +15,9 @@
 
 #include <libc/stdio.h>
 
 
 #include <libc/stdio.h>
 
-extern void __kernel_start;
-extern void __kernel_end;
-extern void __init_hhk_end;
+extern uint8_t __kernel_start;
+extern uint8_t __kernel_end;
+extern uint8_t __init_hhk_end;
 
 void
 _kernel_init(multiboot_info_t* mb_info)
 
 void
 _kernel_init(multiboot_info_t* mb_info)
@@ -35,12 +35,12 @@ _kernel_init(multiboot_info_t* mb_info)
 
 #pragma region INIT_MM
     // 初始化物理内存管理器
 
 #pragma region INIT_MM
     // 初始化物理内存管理器
-    pmm_init(MEM_1MB + mb_info->mem_upper << 10);
+    pmm_init(MEM_1MB + (mb_info->mem_upper << 10));
     vmm_init();
 #pragma endregion
 
     // 初始化VGA
     vmm_init();
 #pragma endregion
 
     // 初始化VGA
-    tty_init(VGA_BUFFER_PADDR);
+    tty_init((void*)VGA_BUFFER_PADDR);
     tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
 
     printf("[KERNEL] === Initialization === \n");
     tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
 
     printf("[KERNEL] === Initialization === \n");
@@ -82,17 +82,21 @@ _kernel_init(multiboot_info_t* mb_info)
     // 重映射VGA文本缓冲区(以后会变成显存,i.e., framebuffer)
     for (size_t i = 0; i < vga_buf_pgs; i++)
     {
     // 重映射VGA文本缓冲区(以后会变成显存,i.e., framebuffer)
     for (size_t i = 0; i < vga_buf_pgs; i++)
     {
-        vmm_map_page(VGA_BUFFER_VADDR + (i << 12), VGA_BUFFER_PADDR + (i << 12), PG_PREM_RW, PG_PREM_RW);
+        vmm_map_page(
+            (void*)(VGA_BUFFER_VADDR + (i << 12)), 
+            (void*)(VGA_BUFFER_PADDR + (i << 12)), 
+            PG_PREM_RW, PG_PREM_RW
+        );
     }
     
     // 更新VGA缓冲区位置至虚拟地址
     }
     
     // 更新VGA缓冲区位置至虚拟地址
-    tty_set_buffer(VGA_BUFFER_VADDR);
+    tty_set_buffer((void*)VGA_BUFFER_VADDR);
 
     printf("[MM] Mapped VGA to %p.\n", VGA_BUFFER_VADDR);
 
     // 为内核创建一个专属栈空间。
     for (size_t i = 0; i < (K_STACK_SIZE >> 12); i++) {
 
     printf("[MM] Mapped VGA to %p.\n", VGA_BUFFER_VADDR);
 
     // 为内核创建一个专属栈空间。
     for (size_t i = 0; i < (K_STACK_SIZE >> 12); i++) {
-        vmm_alloc_page(K_STACK_START + (i << 12), PG_PREM_RW, PG_PREM_RW);
+        vmm_alloc_page((void*)(K_STACK_START + (i << 12)), PG_PREM_RW, PG_PREM_RW);
     }
     printf("[MM] Allocated %d pages for stack start at %p\n", K_STACK_SIZE>>12, K_STACK_START);
 
     }
     printf("[MM] Allocated %d pages for stack start at %p\n", K_STACK_SIZE>>12, K_STACK_START);
 
@@ -107,7 +111,7 @@ _kernel_post_init() {
 
     // 清除 hhk_init 与前1MiB的映射
     for (size_t i = 0; i < hhk_init_pg_count; i++) {
 
     // 清除 hhk_init 与前1MiB的映射
     for (size_t i = 0; i < hhk_init_pg_count; i++) {
-        vmm_unmap_page((i << 12));
+        vmm_unmap_page((void*)(i << 12));
     }
     printf("[KERNEL] === Post Initialization Done === \n\n");
 }
     }
     printf("[KERNEL] === Post Initialization Done === \n\n");
 }
@@ -115,7 +119,7 @@ _kernel_post_init() {
 void
 _kernel_main()
 {
 void
 _kernel_main()
 {
-    char* buf[64];
+    char buf[64];
     
     printf("Hello higher half kernel world!\nWe are now running in virtual "
            "address space!\n\n");
     
     printf("Hello higher half kernel world!\nWe are now running in virtual "
            "address space!\n\n");
@@ -123,7 +127,7 @@ _kernel_main()
     cpu_get_brand(buf);
     printf("CPU: %s\n\n", buf);
 
     cpu_get_brand(buf);
     printf("CPU: %s\n\n", buf);
 
-    uintptr_t k_start = vmm_v2p(&__kernel_start);
+    void* k_start = vmm_v2p(&__kernel_start);
     printf("The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
     // __asm__("int $0\n");
 }
\ No newline at end of file
     printf("The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
     // __asm__("int $0\n");
 }
\ No newline at end of file
index 47087fdd3dad383b518d547137e9a1a68162f67e..304d19dc47192f49606d546a777916bf90207034 100644 (file)
@@ -93,7 +93,7 @@ void*
 pmm_alloc_page()
 {
     // Next fit approach. Maximize the throughput!
 pmm_alloc_page()
 {
     // Next fit approach. Maximize the throughput!
-    uintptr_t good_page_found = NULL;
+    uintptr_t good_page_found = (uintptr_t)NULL;
     size_t old_pg_ptr = pg_lookup_ptr;
     size_t upper_lim = max_pg;
     uint8_t chunk = 0;
     size_t old_pg_ptr = pg_lookup_ptr;
     size_t upper_lim = max_pg;
     uint8_t chunk = 0;
index 364332e186ee7621ecea955a90f64030c21c5dbc..a076a976cbbe2fa9f495bc9cafcc6af932f7b328 100644 (file)
@@ -1,52 +1,57 @@
+#include <libc/string.h>
 #include <lunaix/mm/page.h>
 #include <lunaix/mm/page.h>
-#include <lunaix/mm/vmm.h>
 #include <lunaix/mm/pmm.h>
 #include <lunaix/mm/pmm.h>
-#include <libc/string.h>
+#include <lunaix/mm/vmm.h>
 
 // TODO: Move these nasty inline asm stuff into hal
 //      These should be arch dependent
 
 // TODO: Move these nasty inline asm stuff into hal
 //      These should be arch dependent
-ptd_t* get_pd() {
+ptd_t*
+get_pd()
+{
     ptd_t* pd;
     ptd_t* pd;
-    #ifdef __ARCH_IA32
-    __asm__(
-        "movl %%cr3, %0\n"
-        "andl $0xfffff000, %0"
-        : "=r"(pd)
-    );
-    #endif
-    return P2V(pd);
+#ifdef __ARCH_IA32
+    __asm__("movl %%cr3, %0\n"
+            "andl $0xfffff000, %0"
+            : "=r"(pd));
+#endif
+    return (ptd_t*)P2V(pd);
 }
 
 }
 
-void set_pd(ptd_t* pd) {
-    #ifdef __ARCH_IA32
-    __asm__(
-        "movl %0, %%eax\n"
-        "andl $0xfffff000, %%eax\n"
-        "movl %%eax, %%cr3\n"
-        :
-        : "r" (pd)
-    );
-    #endif
+void
+set_pd(ptd_t* pd)
+{
+#ifdef __ARCH_IA32
+    __asm__("movl %0, %%eax\n"
+            "andl $0xfffff000, %%eax\n"
+            "movl %%eax, %%cr3\n"
+            :
+            : "r"(pd));
+#endif
 }
 
 }
 
-void vmm_init() {
+void
+vmm_init()
+{
     // TODO: something here?
 }
 
     // TODO: something here?
 }
 
-ptd_t* vmm_init_pd() {
+ptd_t*
+vmm_init_pd()
+{
     ptd_t* dir = pmm_alloc_page();
     ptd_t* dir = pmm_alloc_page();
-    for (size_t i = 0; i < 1024; i++)
-    {
+    for (size_t i = 0; i < 1024; i++) {
         dir[i] = 0;
     }
         dir[i] = 0;
     }
-    
+
     // 自己映射自己,方便我们在软件层面进行查表地址转换
     dir[1023] = PDE(T_SELF_REF_PERM, dir);
 
     return dir;
 }
 
     // 自己映射自己,方便我们在软件层面进行查表地址转换
     dir[1023] = PDE(T_SELF_REF_PERM, dir);
 
     return dir;
 }
 
-void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
+void*
+vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr)
+{
     // 显然,对空指针进行映射没有意义。
     if (!pa || !va) {
         return NULL;
     // 显然,对空指针进行映射没有意义。
     if (!pa || !va) {
         return NULL;
@@ -57,8 +62,8 @@ void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
     ptd_t* ptd = (ptd_t*)PTD_BASE_VADDR;
 
     // 在页表与页目录中找到一个可用的空位进行映射(位于va或其附近)
     ptd_t* ptd = (ptd_t*)PTD_BASE_VADDR;
 
     // 在页表与页目录中找到一个可用的空位进行映射(位于va或其附近)
-    ptd_t* pde = ptd[pd_offset];
-    pt_t* pt = (uintptr_t)PT_VADDR(pd_offset);
+    ptd_t pde = ptd[pd_offset];
+    pt_t* pt = (pt_t*)PT_VADDR(pd_offset);
     while (pde && pd_offset < 1024) {
         if (pt_offset == 1024) {
             pd_offset++;
     while (pde && pd_offset < 1024) {
         if (pt_offset == 1024) {
             pd_offset++;
@@ -69,11 +74,11 @@ void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
         // 页表有空位,只需要开辟一个新的 PTE
         if (pt && !pt[pt_offset]) {
             pt[pt_offset] = PTE(tattr, pa);
         // 页表有空位,只需要开辟一个新的 PTE
         if (pt && !pt[pt_offset]) {
             pt[pt_offset] = PTE(tattr, pa);
-            return V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
+            return (void*)V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
         }
         pt_offset++;
     }
         }
         pt_offset++;
     }
-    
+
     // 页目录与所有页表已满!
     if (pd_offset > 1024) {
         return NULL;
     // 页目录与所有页表已满!
     if (pd_offset > 1024) {
         return NULL;
@@ -81,21 +86,23 @@ void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
 
     // 页目录有空位,需要开辟一个新的 PDE
     uint8_t* new_pt_pa = pmm_alloc_page();
 
     // 页目录有空位,需要开辟一个新的 PDE
     uint8_t* new_pt_pa = pmm_alloc_page();
-    
+
     // 物理内存已满!
     if (!new_pt_pa) {
         return NULL;
     }
     // 物理内存已满!
     if (!new_pt_pa) {
         return NULL;
     }
-    
+
     ptd[pd_offset] = PDE(dattr, new_pt_pa);
     ptd[pd_offset] = PDE(dattr, new_pt_pa);
-    
+
     memset((void*)PT_VADDR(pd_offset), 0, PM_PAGE_SIZE);
     pt[pt_offset] = PTE(tattr, pa);
 
     memset((void*)PT_VADDR(pd_offset), 0, PM_PAGE_SIZE);
     pt[pt_offset] = PTE(tattr, pa);
 
-    return V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
+    return (void*)V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
 }
 
 }
 
-void* vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr) {
+void*
+vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr)
+{
     void* pp = pmm_alloc_page();
     void* result = vmm_map_page(vpn, pp, dattr, tattr);
     if (!result) {
     void* pp = pmm_alloc_page();
     void* result = vmm_map_page(vpn, pp, dattr, tattr);
     if (!result) {
@@ -104,31 +111,35 @@ void* vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr) {
     return result;
 }
 
     return result;
 }
 
-void vmm_unmap_page(void* vpn) {
+void
+vmm_unmap_page(void* vpn)
+{
     uintptr_t pd_offset = PD_INDEX(vpn);
     uintptr_t pt_offset = PT_INDEX(vpn);
     uintptr_t pd_offset = PD_INDEX(vpn);
     uintptr_t pt_offset = PT_INDEX(vpn);
-    ptd_t* self_pde = PTD_BASE_VADDR;
+    ptd_t* self_pde = (ptd_t*)PTD_BASE_VADDR;
 
     ptd_t pde = self_pde[pd_offset];
 
     if (pde) {
         pt_t* pt = (pt_t*)PT_VADDR(pd_offset);
         uint32_t pte = pt[pt_offset];
 
     ptd_t pde = self_pde[pd_offset];
 
     if (pde) {
         pt_t* pt = (pt_t*)PT_VADDR(pd_offset);
         uint32_t pte = pt[pt_offset];
-        if (IS_CACHED(pte) && pmm_free_page(pte)) {
-            // 刷新TLB
-            #ifdef __ARCH_IA32
-            __asm__("invlpg (%0)" :: "r"((uintptr_t)vpn) : "memory");
-            #endif
+        if (IS_CACHED(pte) && pmm_free_page((void*)pte)) {
+// 刷新TLB
+#ifdef __ARCH_IA32
+            __asm__("invlpg (%0)" ::"r"((uintptr_t)vpn) : "memory");
+#endif
         }
         pt[pt_offset] = 0;
     }
 }
 
         }
         pt[pt_offset] = 0;
     }
 }
 
-void* vmm_v2p(void* va) {
+void*
+vmm_v2p(void* va)
+{
     uintptr_t pd_offset = PD_INDEX(va);
     uintptr_t pt_offset = PT_INDEX(va);
     uintptr_t po = PG_OFFSET(va);
     uintptr_t pd_offset = PD_INDEX(va);
     uintptr_t pt_offset = PT_INDEX(va);
     uintptr_t po = PG_OFFSET(va);
-    ptd_t* self_pde = PTD_BASE_VADDR;
+    ptd_t* self_pde = (ptd_t*)PTD_BASE_VADDR;
 
     ptd_t pde = self_pde[pd_offset];
     if (pde) {
 
     ptd_t pde = self_pde[pd_offset];
     if (pde) {
index d7920b4354b7f6023e8426af211e0ee4826675c5..affc2f5fe6f3d4f969485feb3184a08427f3c73d 100644 (file)
@@ -8,22 +8,16 @@ char*
 __uitoa_internal(unsigned int value, char* str, int base, unsigned int* size)
 {
     unsigned int ptr = 0;
 __uitoa_internal(unsigned int value, char* str, int base, unsigned int* size)
 {
     unsigned int ptr = 0;
-    if (value == 0) {
-        str[0] = '0';
+    do {
+        str[ptr] = base_char[value % base];
+        value = value / base;
         ptr++;
         ptr++;
-    } else {
-        while (value) {
-            str[ptr] = base_char[value % base];
-            value = value / base;
-            ptr++;
-        }
-
-        for (unsigned int i = 0; i < (ptr >> 1); i++) {
-            char c = str[i];
-            str[i] = str[ptr - i - 1];
-            str[ptr - i - 1] = c;
-        }
+    } while (value);
 
 
+    for (unsigned int i = 0; i < (ptr >> 1); i++) {
+        char c = str[i];
+        str[i] = str[ptr - i - 1];
+        str[ptr - i - 1] = c;
     }
     str[ptr] = '\0';
     if (size) {
     }
     str[ptr] = '\0';
     if (size) {
index 625743c9926001bf57b72e5aba57692a3a8b4e22..abcde29f211aee6157a09d3529e784bd343262be 100644 (file)
@@ -20,16 +20,16 @@ $(ISO_DIR):
 
 $(OBJECT_DIR)/%.S.o: %.S
        @mkdir -p $(@D)
 
 $(OBJECT_DIR)/%.S.o: %.S
        @mkdir -p $(@D)
-       @echo "Compiling: $< -> $@"
+       @echo "$@"
        @$(CC) $(INCLUDES) -c $< -o $@
 
 $(OBJECT_DIR)/%.c.o: %.c 
        @mkdir -p $(@D)
        @$(CC) $(INCLUDES) -c $< -o $@
 
 $(OBJECT_DIR)/%.c.o: %.c 
        @mkdir -p $(@D)
-       @echo "Compiling: $< -> $@"
+       @echo "$@"
        @$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
 
 $(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(SRC)
        @$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
 
 $(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(SRC)
-       @echo "Linking ..."
+       @echo "Generating $(BIN_DIR)/$(OS_BIN)"
        @$(CC) -T linker.ld -o $(BIN_DIR)/$(OS_BIN) $(SRC) $(LDFLAGS)
 
 $(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
        @$(CC) -T linker.ld -o $(BIN_DIR)/$(OS_BIN) $(SRC) $(LDFLAGS)
 
 $(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE