From: acevest Date: Mon, 26 Jan 2026 08:53:39 +0000 (+0800) Subject: 优化printk逻辑 X-Git-Url: http://repos.zhaoyanbai.com/?a=commitdiff_plain;h=a2d419862f807271f09f7160cbf47aadeb3be12b;p=kernel.git 优化printk逻辑 --- diff --git a/drivers/sata.c b/drivers/sata.c index 2f959ab..36a9543 100644 --- a/drivers/sata.c +++ b/drivers/sata.c @@ -15,8 +15,6 @@ #include #include -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) { // } diff --git a/include/printk.h b/include/printk.h index 338ea7f..4cbed83 100644 --- a/include/printk.h +++ b/include/printk.h @@ -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 +typedef int (*printk_t)(const char* fmtstr, va_list args); +void set_printk(printk_t pk); +int _printk(const char* fmtstr, va_list args); diff --git a/include/system.h b/include/system.h index 74c4de2..a0ca51a 100644 --- a/include/system.h +++ b/include/system.h @@ -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() diff --git a/include/types.h b/include/types.h index 10b30fe..069c70f 100644 --- a/include/types.h +++ b/include/types.h @@ -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 diff --git a/kernel/printk.c b/kernel/printk.c index 8966a61..ef1a57d 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -18,52 +18,89 @@ #include #include #include + 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; } diff --git a/kernel/setup.c b/kernel/setup.c index 68218d7..d358b52 100644 --- a/kernel/setup.c +++ b/kernel/setup.c @@ -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); diff --git a/kernel/system.c b/kernel/system.c index 18f5b2a..45ee423 100644 --- a/kernel/system.c +++ b/kernel/system.c @@ -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++; }