]> Zhao Yanbai Git Server - kernel.git/commitdiff
优化printk逻辑
authoracevest <zhaoyanbai@126.com>
Mon, 26 Jan 2026 08:53:39 +0000 (16:53 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 26 Jan 2026 08:53:39 +0000 (16:53 +0800)
drivers/sata.c
include/printk.h
include/system.h
include/types.h
kernel/printk.c
kernel/setup.c
kernel/system.c

index 2f959abda68bcd14561206cc508dee4944ad11b2..36a9543b25e3cc4580e4c45917a51b723d996296 100644 (file)
@@ -15,8 +15,6 @@
 #include <string.h>
 #include <system.h>
 
-int sata_irq_triggered = 0;
-
 int max_sata_devices = 0;
 sata_device_t sata_devices[MAX_SATA_DEVICES] = {0};
 
@@ -109,21 +107,22 @@ void init_sata_device(ahci_hba_t* hba, ahci_port_t* port, int port_index) {
     // printk("sector %08x\n", (uint32_t*)sector);
 }
 
+uint64_t sata_irq_cnt = 0;
 void sata_irq_handler(unsigned int irq, pt_regs_t* regs, void* dev_id) {
-    sata_irq_triggered = 1;
-
     for (int i = 0; i < max_sata_devices; i++) {
         sata_device_t* sata = sata_devices + i;
         ahci_port_t* port = sata->port;
         assert(port != NULL);
 
+        sata_irq_cnt += 1;
+
         //
         uint32_t interrupt_status = port->interrupt_status;
         if (0 == interrupt_status) {
             continue;
         }
 
-        printk("SATA[%u] IRQ[%u] is %08x\n", i, irq, interrupt_status);
+        printk("SATA[%u] IRQ[%u] is %08x cnt %lu\n", i, irq, interrupt_status, sata_irq_cnt);
         if (interrupt_status & AHCI_INTERRUPT_STATUS_DHRS) {
             //
         }
index 338ea7f1d7b1c9a2a155d406d9307c1b27e5a9a1..4cbed8355eda7dd86dc2a88820be18b79a3c90b3 100644 (file)
@@ -52,8 +52,13 @@ enum {
     MPO_HPET = 1,
     MPO_AP_CLOCK = 20,
     MPO_DISK = 36,
-    MPO_KEYBOARD = 54,
+    MPO_KEYBOARD = 60,
     MPO_IDE = 1,
 };
 
 int sprintf(char* str, const char* fmtstr, ...);
+
+#include <types.h>
+typedef int (*printk_t)(const char* fmtstr, va_list args);
+void set_printk(printk_t pk);
+int _printk(const char* fmtstr, va_list args);
index 74c4de2560f7f1dc6d181cd40c95dcbf67de01f8..a0ca51a57a902571e2d5490e9d16acc8bcb1ee6b 100644 (file)
@@ -260,13 +260,13 @@ void io_mfence();
 
 paddr_t get_rcba_paddr();
 
-extern uint32_t preempt_count;
+extern int preempt_count;
 
-void enter_critical_zone();
+void enter_critical_zone(const char* msg);
 void leave_critical_zone();
 bool in_critical_zone();
 
-#define ENTER_CRITICAL_ZONE(x) enter_critical_zone()
+#define ENTER_CRITICAL_ZONE(x) enter_critical_zone(__FILE__ ":" __STRING(x))
 #define LEAVE_CRITICAL_ZONE(x) leave_critical_zone()
 #define IN_CRITICAL_ZONE() in_critical_zone()
 
index 10b30fef76fbb183fb7a4fbd93fc5834611e5c91..069c70fb179a2fb0998f8519f536ecd6dc72640a 100644 (file)
@@ -71,4 +71,10 @@ typedef enum { false, true } bool;
 //=========================================================================
 typedef void (*pf_intr)();
 
+//
+typedef char* va_list;
+#define va_start(ap, last) ((ap) = (va_list) & (last) + sizeof(last))
+#define va_arg(ap, type) (*(type*)(((ap) += sizeof(type)) - sizeof(type)))
+#define va_end(ap) ((ap) = (va_list)0)
+
 #endif  //_TYPES_H
index 8966a61b9621c0ea18db664f46e3054c1569a6fc..ef1a57d772905c4b553bdd1fa39873255c81432a 100644 (file)
 #include <irq.h>
 #include <system.h>
 #include <tty.h>
+
 int vsprintf(char* buf, const char* fmt, char* args);
 
 void serial_write(const char* buf, size_t size);
 
 extern tty_t* const default_tty;
-int printk(const char* fmtstr, ...) {
-    static char pkbuf[1024];
 
-    ENTER_CRITICAL_ZONE(EFLAGS);
+int _printk(const char* fmtstr, va_list args) {
+    char* pkbuf = kmalloc(1024, 0);
 
-    char* args = (char*)(((char*)&fmtstr) + 4);
     int size = vsprintf(pkbuf, fmtstr, args);
+
     tty_write(default_tty, pkbuf, (size_t)size);
     serial_write(pkbuf, (size_t)size);
 
-    LEAVE_CRITICAL_ZONE(EFLAGS);
+    kfree(pkbuf);
+    return 0;
+}
+
+static char _early_pkbuf[1024];
+int _early_printk(const char* fmtstr, va_list args) {
+    uint32_t eflags;
+    irq_save(eflags);
+
+    int size = vsprintf(_early_pkbuf, fmtstr, args);
+
+    tty_write(default_tty, _early_pkbuf, (size_t)size);
+    serial_write(_early_pkbuf, (size_t)size);
+
+    irq_restore(eflags);
+    return 0;
+}
+
+typedef int (*printk_t)(const char* fmtstr, va_list args);
+static printk_t _printk_func = _early_printk;
+
+void set_printk(printk_t pk) {
+    _printk_func = pk;
+}
+
+int printk(const char* fmtstr, ...) {
+    va_list args;
+    va_start(args, fmtstr);
+
+    _printk_func(fmtstr, args);
+
+    va_end(args);
     return 0;
 }
 
 extern tty_t* const debug_tty;
 int printd(const char* fmtstr, ...) {
-    static char pdbuf[1024];
-    ENTER_CRITICAL_ZONE(EFLAGS);
+    char* pdbuf = kmalloc(1024, 0);
 
-    char* args = (char*)(((char*)&fmtstr) + 4);
+    va_list args;
+    va_start(args, fmtstr);
     int size = vsprintf(pdbuf, fmtstr, args);
+    va_end(args);
+
     tty_write(debug_tty, pdbuf, (size_t)size);
     serial_write(pdbuf, (size_t)size);
 
-    LEAVE_CRITICAL_ZONE(EFLAGS);
+    kfree(pdbuf);
+
     return 0;
 }
 
 extern tty_t* const monitor_tty;
 int printlo(unsigned int xpos, unsigned int ypos, const char* fmtstr, ...) {
     static char plobuf[1024];
-    char* args = (char*)(((char*)&fmtstr) + 4);
 
-    unsigned long eflags;
+    va_list args;
+    va_start(args, fmtstr);
+
+    uint32_t eflags;
     irq_save(eflags);
 
     int size = vsprintf(plobuf, fmtstr, args);
 
+    va_end(args);
+
     tty_write_at(monitor_tty, xpos, ypos, plobuf, (size_t)size);
 
     irq_restore(eflags);
-
     return 0;
 }
index 68218d7063f305d3e94cf0a38912696c21411330..d358b52f703e8e94ce916d642822b195034c70a8 100644 (file)
@@ -130,6 +130,8 @@ void setup_kernel() {
 
     init_mm();
 
+    set_printk(_printk);
+
     init_buffer();
 
     void init_mount();
@@ -161,7 +163,7 @@ void setup_kernel() {
     print_kernel_version();
     boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
-    extern tty_t* const monitor_tty;
+    // extern tty_t* const monitor_tty;
     // tty_switch(monitor_tty);
 
     boot_delay(DEFAULT_BOOT_DELAY_TICKS);
index 18f5b2ab41edf3d19364650133c64f08047ef355..45ee42377be3cae7ad3a3e496a6cb83a04a93242 100644 (file)
@@ -253,9 +253,11 @@ paddr_t get_rcba_paddr() {
 }
 
 //
-uint32_t preempt_count = 0;
+int preempt_count = 0;
 
-void enter_critical_zone() {
+// char preempt_debug_msg[100][100] = {{0}};
+void enter_critical_zone(const char* msg) {
+    // strcpy(preempt_debug_msg[preempt_count], msg);
     preempt_count++;
 }