diff --git a/definitions/objects/event.def b/definitions/objects/event.def index 08bc353..02b1cc8 100644 --- a/definitions/objects/event.def +++ b/definitions/objects/event.def @@ -1,4 +1,20 @@ object event : object { uid f441e03da5516b1a + + capabilities [ + signal + ] + + method create [constructor] + + # Assert signals on the event from the given bitset + method signal [cap:signal] { + param signals uint64 + } + + # De-assert signals on the event from the given bitset + method clear [cap:signal] { + param mask uint64 + } } diff --git a/src/kernel/kernel.module b/src/kernel/kernel.module index 62c2ec8..1e95fd3 100644 --- a/src/kernel/kernel.module +++ b/src/kernel/kernel.module @@ -53,6 +53,7 @@ kernel = module("kernel", "syscalls.inc.cog", "syscalls/channel.cpp", "syscalls/endpoint.cpp", + "syscalls/event.cpp", "syscalls/handle.cpp", "syscalls/object.cpp", "syscalls/process.cpp", diff --git a/src/kernel/syscalls/event.cpp b/src/kernel/syscalls/event.cpp new file mode 100644 index 0000000..9a386b7 --- /dev/null +++ b/src/kernel/syscalls/event.cpp @@ -0,0 +1,36 @@ +#include +#include + +#include "objects/event.h" +#include "syscalls/helpers.h" + +using namespace obj; + +namespace syscalls { + +j6_status_t +event_create(j6_handle_t *self) +{ + construct_handle(self); + return j6_status_ok; +} + +j6_status_t +event_signal(event *self, j6_signal_t signals) +{ + if (signals & j6_signal_global_mask) + return j6_err_invalid_arg; + + self->assert_signal(signals); + return j6_status_ok; +} + +j6_status_t +event_clear(event *self, j6_signal_t mask) +{ + self->deassert_signal(~mask); + return j6_status_ok; +} + + +} // namespace syscalls diff --git a/src/kernel/syscalls/object.cpp b/src/kernel/syscalls/object.cpp index 2f60e58..d4179ea 100644 --- a/src/kernel/syscalls/object.cpp +++ b/src/kernel/syscalls/object.cpp @@ -89,16 +89,6 @@ object_wait_many(j6_handle_t * handles, size_t handles_count, uint64_t mask, j6_ return j6_status_ok; } -j6_status_t -object_signal(kobject *self, j6_signal_t signals) -{ - if ((signals & j6_signal_user_mask) != signals) - return j6_err_invalid_arg; - - self->assert_signal(signals); - return j6_status_ok; -} - j6_status_t object_close(kobject *self) { diff --git a/src/libraries/j6/include/j6/signals.h b/src/libraries/j6/include/j6/signals.h index cb9d417..83c9711 100644 --- a/src/libraries/j6/include/j6/signals.h +++ b/src/libraries/j6/include/j6/signals.h @@ -2,73 +2,21 @@ /// \file signals.h /// Collection of constants for the j6_signal_t type -// Signals 0-15 are common to all types -#define j6_signal_no_handles (1ull << 0) -#define j6_signal_closed (1ull << 1) +// Signals 56-63 are common to all types +#define j6_signal_no_handles (1ull << 56) +#define j6_signal_closed (1ull << 57) +#define j6_signal_global_mask 0xff00000000000000 -// Signals 16-47 are defined per-object-type - -// Event signals -#define j7_signal_event00 (1ull << 16) -#define j7_signal_event01 (1ull << 17) -#define j7_signal_event02 (1ull << 18) -#define j7_signal_event03 (1ull << 19) -#define j7_signal_event04 (1ull << 20) -#define j7_signal_event05 (1ull << 21) -#define j7_signal_event06 (1ull << 22) -#define j7_signal_event07 (1ull << 23) -#define j7_signal_event08 (1ull << 24) -#define j7_signal_event09 (1ull << 25) -#define j7_signal_event10 (1ull << 26) -#define j7_signal_event11 (1ull << 27) -#define j7_signal_event12 (1ull << 28) -#define j7_signal_event13 (1ull << 29) -#define j7_signal_event14 (1ull << 30) -#define j7_signal_event15 (1ull << 31) -#define j7_signal_event16 (1ull << 32) -#define j7_signal_event17 (1ull << 33) -#define j7_signal_event18 (1ull << 34) -#define j7_signal_event19 (1ull << 35) -#define j7_signal_event20 (1ull << 36) -#define j7_signal_event21 (1ull << 37) -#define j7_signal_event22 (1ull << 38) -#define j7_signal_event23 (1ull << 39) -#define j7_signal_event24 (1ull << 40) -#define j7_signal_event25 (1ull << 41) -#define j7_signal_event26 (1ull << 42) -#define j7_signal_event27 (1ull << 43) -#define j7_signal_event28 (1ull << 44) -#define j7_signal_event29 (1ull << 45) -#define j7_signal_event30 (1ull << 46) -#define j7_signal_event31 (1ull << 47) +// Signals 0-55 are defined per object type // System signals -#define j6_signal_system_has_log (1ull << 16) +#define j6_signal_system_has_log (1ull << 0) // Channel signals -#define j6_signal_channel_can_send (1ull << 16) -#define j6_signal_channel_can_recv (1ull << 17) +#define j6_signal_channel_can_send (1ull << 0) +#define j6_signal_channel_can_recv (1ull << 1) // Endpoint signals -#define j6_signal_endpoint_can_send (1ull << 16) -#define j6_signal_endpoint_can_recv (1ull << 17) +#define j6_signal_endpoint_can_send (1ull << 0) +#define j6_signal_endpoint_can_recv (1ull << 1) -// Signals 48-63 are user-defined signals -#define j6_signal_user0 (1ull << 48) -#define j6_signal_user1 (1ull << 49) -#define j6_signal_user2 (1ull << 50) -#define j6_signal_user3 (1ull << 51) -#define j6_signal_user4 (1ull << 52) -#define j6_signal_user5 (1ull << 53) -#define j6_signal_user6 (1ull << 54) -#define j6_signal_user7 (1ull << 55) -#define j6_signal_user8 (1ull << 56) -#define j6_signal_user9 (1ull << 57) -#define j6_signal_user10 (1ull << 58) -#define j6_signal_user11 (1ull << 59) -#define j6_signal_user12 (1ull << 60) -#define j6_signal_user13 (1ull << 61) -#define j6_signal_user14 (1ull << 62) -#define j6_signal_user15 (1ull << 63) - -#define j6_signal_user_mask (0xffffull << 48)