فهرست منبع

Merge remote-tracking branch 'origin/paging' into paging

greatbridf 3 سال پیش
والد
کامیت
68225b9fab
4فایلهای تغییر یافته به همراه103 افزوده شده و 10 حذف شده
  1. 7 0
      include/types/size.h
  2. 19 3
      src/boot.s
  3. 76 6
      src/kernel/stdio.c
  4. 1 1
      src/kernel_main.c

+ 7 - 0
include/types/size.h

@@ -2,5 +2,12 @@
 
 #include "stdint.h"
 
+#define __32bit_system
+
+#ifdef __32bit_system
 typedef uint32_t ptr_t;
 typedef int32_t diff_t;
+#elif
+typedef uint64_t ptr_t;
+typedef int64_t diff_t;
+#endif

+ 19 - 3
src/boot.s

@@ -169,7 +169,7 @@ loader_halt:
     jmp loader_halt
 
 asm_gdt_descriptor:
-    .word (3 * 8) - 1 # size
+    .word (5 * 8) - 1 # size
     .long 0x7e00+(asm_gdt_table-loader_start)  # address
 
 .globl asm_gdt_descriptor
@@ -179,7 +179,7 @@ asm_gdt_descriptor:
 asm_gdt_table:
     .8byte 0         # null descriptor
 
-    # code segment
+    # kernel code segment
     .word 0xffff     # limit 0 :15
     .word 0x0000     # base  0 :15
     .byte 0x00       # base  16:23
@@ -187,7 +187,7 @@ asm_gdt_table:
     .byte 0b11001111 # flag and limit 16:20
     .byte 0x00       # base 24:31
 
-    # data segment
+    # kernel data segment
     .word 0xffff     # limit 0 :15
     .word 0x0000     # base  0 :15
     .byte 0x00       # base  16:23
@@ -195,6 +195,22 @@ asm_gdt_table:
     .byte 0b11001111 # flag and limit 16:20
     .byte 0x00       # base 24:31
 
+    # user code segment
+    .word 0xffff     # limit 0 :15
+    .word 0x0000     # base  0 :15
+    .byte 0x00       # base  16:23
+    .byte 0xfa       # access
+    .byte 0b11001111 # flag and limit 16:20
+    .byte 0x00       # base 24:31
+
+    # kernel data segment
+    .word 0xffff     # limit 0 :15
+    .word 0x0000     # base  0 :15
+    .byte 0x00       # base  16:23
+    .byte 0xf2       # access
+    .byte 0b11001111 # flag and limit 16:20
+    .byte 0x00       # base 24:31
+
 asm_mem_size_info:
     .word 0x12
     .word 0x34

+ 76 - 6
src/kernel/stdio.c

@@ -187,7 +187,7 @@ snprint_decimal64(
 }
 
 ssize_t
-snprint_hex(
+snprint_hex32(
     char* buf,
     size_t buf_size,
     uint32_t num,
@@ -234,6 +234,54 @@ snprint_hex(
     return n_write;
 }
 
+ssize_t
+snprint_hex64(
+    char* buf,
+    size_t buf_size,
+    uint64_t num,
+    int32_t capitalized)
+{
+    ssize_t n_write = 0;
+
+    do_write_if_free(buf, buf_size, '0');
+    if (capitalized) {
+        do_write_if_free(buf, buf_size, 'X');
+    } else {
+        do_write_if_free(buf, buf_size, 'x');
+    }
+    n_write += 2;
+
+    char* orig_buf = buf;
+
+    do {
+        if (capitalized) {
+            do_write_if_free(buf, buf_size, X_to_c(num % 16));
+        } else {
+            do_write_if_free(buf, buf_size, x_to_c(num % 16));
+        }
+        num /= 16;
+        ++n_write;
+    } while (num != 0);
+
+    // prepend trailing '\0'
+    if (buf_size > 0)
+        *buf = 0x00;
+
+    // move buf pointer to the last digit of number
+    --buf;
+
+    // reverse output
+    while (orig_buf < buf) {
+        char c = *buf;
+        *buf = *orig_buf;
+        *orig_buf = c;
+        --buf;
+        ++orig_buf;
+    }
+
+    return n_write;
+}
+
 static inline ssize_t
 snprint_char(
     char* buf,
@@ -268,12 +316,12 @@ snprintf(
                 break;
 
             case 'x':
-                n_tmp_write = snprint_hex(buf, buf_size, *(uint32_t*)arg_ptr, 0);
+                n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 0);
                 arg_ptr += sizeof(uint32_t);
                 break;
 
             case 'X':
-                n_tmp_write = snprint_hex(buf, buf_size, *(uint32_t*)arg_ptr, 1);
+                n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 1);
                 arg_ptr += sizeof(uint32_t);
                 break;
 
@@ -282,8 +330,17 @@ snprintf(
                 switch (*(++fmt)) {
                 // long long aka int64
                 case 'l':
-                    ++fmt;
-                    n_tmp_write = snprint_decimal64(buf, buf_size, *(int64_t*)arg_ptr);
+                    switch (*(++fmt)) {
+                    case 'd':
+                        n_tmp_write = snprint_decimal64(buf, buf_size, *(int64_t*)arg_ptr);
+                        break;
+                    case 'x':
+                        n_tmp_write = snprint_hex64(buf, buf_size, *(int64_t*)arg_ptr, 0);
+                        break;
+                    case 'X':
+                        n_tmp_write = snprint_hex64(buf, buf_size, *(int64_t*)arg_ptr, 1);
+                        break;
+                    }
                     arg_ptr += sizeof(int64_t);
                     break;
                 // long int aka int32
@@ -291,6 +348,15 @@ snprintf(
                     n_tmp_write = snprint_decimal32(buf, buf_size, *(int32_t*)arg_ptr);
                     arg_ptr += sizeof(int32_t);
                     break;
+                case 'x':
+                    n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 0);
+                    arg_ptr += sizeof(uint32_t);
+                    break;
+
+                case 'X':
+                    n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 1);
+                    arg_ptr += sizeof(uint32_t);
+                    break;
                 }
                 break;
 
@@ -308,7 +374,11 @@ snprintf(
 
             // pointer
             case 'p':
-                n_tmp_write = snprint_hex(buf, buf_size, *(ptr_t*)arg_ptr, 0);
+#ifdef __32bit_system
+                n_tmp_write = snprint_hex32(buf, buf_size, *(ptr_t*)arg_ptr, 0);
+#else
+                n_tmp_write = snprint_hex64(buf, buf_size, *(ptr_t*)arg_ptr, 0);
+#endif
                 arg_ptr += sizeof(ptr_t);
                 break;
 

+ 1 - 1
src/kernel_main.c

@@ -59,7 +59,7 @@ void kernel_main(void)
     if (asm_e820_mem_map_entry_size == 20) {
         for (uint32_t i = 0; i < asm_e820_mem_map_count; ++i) {
             printkf(
-                "[mem] entry %d: %lld ~ %lld, type: %d\n",
+                "[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,