p = p->hash_next;
}
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
return page;
}
p = page_hash_table[hash];
page->hash_next = p;
page_hash_table[hash] = page;
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
}
void add_page_to_inode(address_space_t* mapping, page_t* page) {
ENTER_CRITICAL_ZONE(EFLAGS);
list_add(&page->list, &mapping->pages);
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
}
page_t* get_cached_page(address_space_t* mapping, uint32_t index) {
ENTER_CRITICAL_ZONE(EFLAGS);
list_add(&page->list, &mapping->pages);
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
}
return page;
if (p->f_state == 0) {
p->f_state = 1;
fp = p;
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
break;
}
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
}
}
__asm__ __volatile__("pushl %0; popfl" ::"g"(x) : "memory", "cc"); \
} while (0)
-void enter_critical_zone();
-void exit_critical_zone();
-
-#define ENTER_CRITICAL_ZONE(x) \
- volatile uint32_t __critical_zone_eflags_##x = 0; \
- irq_save(__critical_zone_eflags_##x);
-
-#define EXIT_CRITICAL_ZONE(x) irq_restore(__critical_zone_eflags_##x);
-
#define IRQ_CLOCK 0x00
#define IRQ_KEYBOARD 0x01
#define IRQ_CASCADE 0x02
void io_mfence();
paddr_t get_rcba_paddr();
+
+extern uint32_t preempt_count;
+
+void enter_critical_zone();
+void leave_critical_zone();
+bool in_critical_zone();
+
+#define ENTER_CRITICAL_ZONE(x) enter_critical_zone()
+#define LEAVE_CRITICAL_ZONE(x) leave_critical_zone()
+#define IN_CRITICAL_ZONE() in_critical_zone()
+
#endif
#define DISABLE_IDE 1
enable_irq();
// 如果需要调度程序
- schedule();
+ if (!IN_CRITICAL_ZONE()) {
+ schedule();
+ }
#endif
}
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
-// 这里的代码有BUG,如果嵌套调用的话
-// __critical_zone_eflags的值会被统一设置为最里层时的eflags
-// 意味着如果IF置位了的话,必定会丢失这个信息
-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);
-}
-
void irq_set_chip(unsigned int irq, irq_chip_t* chip) {
assert(irq < NR_IRQS);
assert(chip != NULL);
tty_write(default_tty, pkbuf, (size_t)size);
serial_write(pkbuf, (size_t)size);
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
return 0;
}
tty_write(debug_tty, pdbuf, (size_t)size);
serial_write(pdbuf, (size_t)size);
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
return 0;
}
tty_write_at(monitor_tty, xpos, ypos, plobuf, (size_t)size);
- EXIT_CRITICAL_ZONE(EFLAGS);
+ LEAVE_CRITICAL_ZONE(EFLAGS);
return 0;
}
return rcba_paddr;
}
+
+//
+uint32_t preempt_count = 0;
+
+void enter_critical_zone() {
+ preempt_count++;
+}
+
+void leave_critical_zone() {
+ preempt_count--;
+}
+
+bool in_critical_zone() {
+ return preempt_count > 0;
+}