diff --git a/SPEC.md b/SPEC.md index 022759cd17b39e70c3c302061cfe4c5714641a9d..9494d4fddd53de3d53c4cc6bc9d6ed94de20417c 100644 --- a/SPEC.md +++ b/SPEC.md @@ -51,7 +51,7 @@ * `_EVENT_TRAP`:系统调用自陷(无cause),系统调用参数将`_RegSet`转换为`intptr_t*`后按次序排列。第一个参数为返回值。 * `_RegSet *_make(_Area kstack, void *entry, void *arg);`创建一个内核上下文,参数arg。 * `void _trap();`在内核态自陷。线程需要睡眠/让出CPU时使用。 -* `int _interrupt(int enable);`设置中断状态(enable非0时打开)。返回设置前的中断状态。 +* `int _istatus(int enable);`设置中断状态(enable非0时打开)。返回设置前的中断状态。 ## Protection Extension @@ -69,4 +69,4 @@ * `int _cpu();`返回当前CPU的编号(从0开始)。 * `intptr_t _atomic_xchg(volatile void *addr, intptr_t newval);`原子交换两数。 * `void _barrier();`保证内存顺序一致性。 -* `extern int _NR_CPU;`处理器数量。在`_mpe_init()`调用后有效。 \ No newline at end of file +* `extern int _NR_CPU;`处理器数量。在`_mpe_init()`调用后有效。 diff --git a/am/am.h b/am/am.h index 2c8e4ff2f6b83c379b97eecc200e5b430a80271c..4c316e939b02648c4859e0db32c72468adb434b5 100755 --- a/am/am.h +++ b/am/am.h @@ -104,14 +104,10 @@ extern _Screen _screen; // [2] Asynchronous Extension (ASYE) // ======================================================================= -void _asye_init(); -void _listen(_RegSet* (*l)(_Event ev, _RegSet *regs)); +void _asye_init(_RegSet* (*l)(_Event ev, _RegSet *regs)); _RegSet *_make(_Area kstack, void *entry, void *arg); void _trap(); -void _idle(); -void _ienable(); -void _idisable(); -int _istatus(); +int _istatus(int enable); // ======================================================================= // [3] Protection Extension (PTE) diff --git a/am/arch/x86-qemu/src/asye.cpp b/am/arch/x86-qemu/src/asye.cpp index cb3a4acabcf5267f5bf3e0402da1566af8f48a45..5aad06aa9358b06f0a7e7b92333e720fd5b8ecca 100644 --- a/am/arch/x86-qemu/src/asye.cpp +++ b/am/arch/x86-qemu/src/asye.cpp @@ -171,7 +171,7 @@ void irq_handle(TrapFrame *tf) { static GateDesc idt[NR_IRQ]; -void _asye_init() { +void _asye_init(_RegSet*(*h)(_Event, _RegSet*)) { smp_init(); lapic_init(); ioapic_enable(IRQ_KBD, 0); @@ -204,14 +204,6 @@ void _asye_init() { // -------------------- system call -------------------------- idt[0x80] = GATE(STS_TG32, KSEL(SEG_KCODE), vecsys, DPL_USER); set_idt(idt, sizeof(idt)); - -} - -void _idle() { - hlt(); -} - -void _listen(_RegSet*(*h)(_Event, _RegSet*)) { H = h; } @@ -230,12 +222,13 @@ void _trap() { asm volatile("int $0x80"); } -void _idisable() { - cli(); -} -void _ienable() { - sti(); -} -int _istatus() { - return (get_efl() & FL_IF) != 0; +int _istatus(int enable) { + int ret = (get_efl() & FL_IF) != 0; + if (enable) { + sti(); + } else { + cli(); + } + return ret; } + diff --git a/tests/asyetest/main.c b/tests/asyetest/main.c index fd28471b32b2d58c61efbe544d539dc8c0b76672..8c552a1b4c2424263b304cd8012ed88028407728 100644 --- a/tests/asyetest/main.c +++ b/tests/asyetest/main.c @@ -29,9 +29,8 @@ _RegSet* handler(_Event ev, _RegSet *regs) { int main(){ _ioe_init(); - _asye_init(); - _listen(handler); - _ienable(); + _asye_init(handler); + assert(!_istatus(1)); _make(_heap, main, 0); while (1) _trap(); return 0;