diff --git a/repos/base-nova/include/nova/syscall-generic.h b/repos/base-nova/include/nova/syscall-generic.h index 4f25b22e7b..5a0cb5770f 100644 --- a/repos/base-nova/include/nova/syscall-generic.h +++ b/repos/base-nova/include/nova/syscall-generic.h @@ -73,6 +73,9 @@ namespace Nova { NOVA_CREATE_CELL= 0x14, NOVA_CELL_CTRL = 0x15, NOVA_CONS_CTRL = 0x16, + NOVA_CPUID = 0x17, + NOVA_RESERVE_CPU= 0x18, + NOVA_CREATE_HAB = 0x19, }; /** @@ -591,7 +594,7 @@ namespace Nova { public: - enum { DEFAULT_QUANTUM = 1500, DEFAULT_PRIORITY = 64 }; + enum { DEFAULT_QUANTUM = 10000, DEFAULT_PRIORITY = 64 }; Qpd(mword_t quantum = DEFAULT_QUANTUM, mword_t priority = DEFAULT_PRIORITY) diff --git a/repos/base-nova/include/spec/64bit/nova/syscalls.h b/repos/base-nova/include/spec/64bit/nova/syscalls.h index dfb1892a79..3ddc692e6f 100644 --- a/repos/base-nova/include/spec/64bit/nova/syscalls.h +++ b/repos/base-nova/include/spec/64bit/nova/syscalls.h @@ -155,7 +155,7 @@ namespace Nova { ALWAYS_INLINE inline uint8_t call(mword_t pt) { - return syscall_1(NOVA_CALL, 0, pt, 0); + return syscall_1(NOVA_CALL, 0, 0, pt); } @@ -441,9 +441,10 @@ namespace Nova { } ALWAYS_INLINE - inline uint8_t yield(bool release_core = true) + inline uint8_t yield(bool release_core = true, bool block = true) { - return syscall_0(NOVA_YIELD, release_core, 0); + Nova::uint8_t flags = block ? release_core : 3; + return syscall_0(NOVA_YIELD, flags, 0); } ALWAYS_INLINE @@ -453,15 +454,27 @@ namespace Nova { } ALWAYS_INLINE - inline uint8_t alloc_cores(mword_t count) + inline uint8_t alloc_cores(mword_t count, mword_t &allocated) { - return syscall_1(NOVA_ALLOC_CORES, 0, 0, count); + return syscall_5(NOVA_ALLOC_CORES, 0, 0, count, allocated); } ALWAYS_INLINE - inline uint8_t core_allocation(mword_t &allocation) + inline uint8_t wake_core(mword_t core) { - return syscall_5(NOVA_CORE_ALLOC, 0, 0, allocation, allocation); + return syscall_1(NOVA_RESERVE_CPU, 0, 0, core); + } + + ALWAYS_INLINE + inline uint8_t core_allocation(mword_t &allocation, bool mask = false) + { + return syscall_5(NOVA_CORE_ALLOC, static_cast(mask), 0, allocation, allocation); + } + + ALWAYS_INLINE + inline uint8_t cpu_id(mword_t &cpuid) + { + return syscall_5(NOVA_CPUID, 0, 0, cpuid, cpuid); } ALWAYS_INLINE @@ -476,6 +489,12 @@ namespace Nova { return syscall_2(NOVA_CELL_CTRL, Cell_op::GROW, pd, mask, index); } + ALWAYS_INLINE + inline uint8_t create_habitat(mword_t start_cpu, mword_t size) + { + return syscall_2(NOVA_CREATE_HAB, 0, 0, start_cpu, size); + } + ALWAYS_INLINE inline uint8_t acquire_console() {