소스 검색

feat: print 64bit hex numbers

greatbridf 3 년 전
부모
커밋
3ef0e3e514
2개의 변경된 파일77개의 추가작업 그리고 7개의 파일을 삭제
  1. 76 6
      src/kernel/stdio.c
  2. 1 1
      src/kernel_main.c

+ 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,