#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};
// 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) {
//
}
#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;
}