]> Zhao Yanbai Git Server - kernel.git/commitdiff
add ENTER_CRITICAL_ZONE and ENTER_CRITICAL_ZONE
authoracevest <zhaoyanbai@126.com>
Sun, 1 Sep 2024 06:01:26 +0000 (14:01 +0800)
committeracevest <zhaoyanbai@126.com>
Sun, 1 Sep 2024 06:01:26 +0000 (14:01 +0800)
include/irq.h
kernel/irq.c
kernel/printk.c

index bec6002b828f1989569c514e7bba62d515541660..b0002ba7ab765d9c3b50ad3cf8e90beae5633852 100644 (file)
@@ -76,6 +76,18 @@ bool irq_disabled();
         __asm__ __volatile__("pushl %0; popfl" ::"g"(x) : "memory", "cc"); \
     } while (0)
 
+void enter_critical_zone();
+void exit_critical_zone();
+
+#define ENTER_CRITICAL_ZONE    \
+    do {                       \
+        enter_critical_zone(); \
+    } while (0)
+#define EXIT_CRITICAL_ZONE    \
+    do {                      \
+        exit_critical_zone(); \
+    } while (0)
+
 #define IRQ_CLOCK 0x00
 #define IRQ_KEYBOARD 0x01
 #define IRQ_CASCADE 0x02
index 770f4581a68e6a3c5121a1d32c2c31bf3b7fa84b..83cfada5abfa4a30e7b608735edb30d174e97ee1 100644 (file)
@@ -336,3 +336,8 @@ int disable_no_irq_chip(unsigned int irq) { return 0; }
 
 irq_chip_t no_irq_chip = {.name = "none", .enable = enable_no_irq_chip, .disable = disable_no_irq_chip};
 irq_desc_t no_irq_desc = {.chip = &no_irq_chip, .action = NULL, .status = 0, .depth = 0};
+
+// 单CPU
+static volatile uint32_t __critical_zone_eflags;
+void enter_critical_zone() { irq_save(__critical_zone_eflags); }
+void exit_critical_zone() { irq_restore(__critical_zone_eflags); }
index 6a0904dbfb1dbc7d7eb2e54bfbe5d248f9d48a2c..74fd9a1d83770029e545f5bf466dbd9788357f45 100644 (file)
@@ -25,37 +25,40 @@ void serial_write(const char *buf, size_t size);
 char pkbuf[1024];
 extern tty_t *const default_tty;
 int printk(const char *fmtstr, ...) {
-    unsigned long iflags;
-    irq_save(iflags);
+    ENTER_CRITICAL_ZONE;
+
     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);
-    irq_restore(iflags);
+
+    EXIT_CRITICAL_ZONE;
     return 0;
 }
 
 extern tty_t *const debug_tty;
 char pdbuf[1024];
 int printd(const char *fmtstr, ...) {
-    unsigned long iflags;
-    irq_save(iflags);
+    ENTER_CRITICAL_ZONE;
+
     char *args = (char *)(((char *)&fmtstr) + 4);
     int size = vsprintf(pdbuf, fmtstr, args);
     tty_write(debug_tty, pdbuf, (size_t)size);
     serial_write(pdbuf, (size_t)size);
-    irq_restore(iflags);
+
+    EXIT_CRITICAL_ZONE;
     return 0;
 }
 
 char plobuf[1024];
 extern tty_t *const monitor_tty;
 int printlo(unsigned int xpos, unsigned int ypos, const char *fmtstr, ...) {
-    unsigned long iflags;
-    irq_save(iflags);
+    ENTER_CRITICAL_ZONE;
+
     char *args = (char *)(((char *)&fmtstr) + 4);
     int size = vsprintf(plobuf, fmtstr, args);
     tty_write_at(monitor_tty, xpos, ypos, plobuf, (size_t)size);
-    irq_restore(iflags);
+
+    EXIT_CRITICAL_ZONE;
     return 0;
 }