From 7005e54de2cc0166eb116aba02bf749b3b2961d7 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 12 Apr 2017 11:55:08 +0200 Subject: [PATCH] nova: fix syscall bindings with GCC 6 Fixes #2377 --- repos/base-nova/include/nova/syscall-generic.h | 10 +++++----- repos/base-nova/include/nova/util.h | 4 ++-- repos/base-nova/src/core/echo.cc | 12 ++++++------ repos/base-nova/src/core/include/nova_util.h | 14 +++++++------- repos/base-nova/src/core/ipc_pager.cc | 2 +- repos/base-nova/src/core/pager.cc | 2 +- repos/base-nova/src/include/base/internal/ipc.h | 8 ++++---- repos/base-nova/src/lib/base/rpc_entrypoint.cc | 2 +- repos/base-nova/src/test/platform/ipc.cc | 10 +++++----- repos/base-nova/src/test/platform/main.cc | 6 +++--- .../drivers/platform/spec/x86/device_pd/main.cc | 2 +- repos/ports/include/vmm/utcb_guard.h | 4 ++-- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/repos/base-nova/include/nova/syscall-generic.h b/repos/base-nova/include/nova/syscall-generic.h index 185938b27e..e4d478b8a8 100644 --- a/repos/base-nova/include/nova/syscall-generic.h +++ b/repos/base-nova/include/nova/syscall-generic.h @@ -518,9 +518,6 @@ namespace Nova { */ union { - /* message payload */ - mword_t msg[]; - /* exception state */ struct { mword_t mtd, instr_len, ip, flags; @@ -566,6 +563,9 @@ namespace Nova { } __attribute__((packed)); }; + /* message payload */ + mword_t * msg() { return reinterpret_cast(&mtd); } + struct Item { mword_t crd; mword_t hotspot; @@ -673,7 +673,7 @@ namespace Nova { item += (PAGE_SIZE_BYTE / sizeof(struct Item)) - msg_items(); /* check that there is enough space left on UTCB */ - if (msg + msg_words() >= reinterpret_cast(item)) { + if (msg() + msg_words() >= reinterpret_cast(item)) { items -= 1 << 16; return false; } @@ -707,7 +707,7 @@ namespace Nova { Item * get_item(const unsigned i) { if (i > (PAGE_SIZE_BYTE / sizeof(struct Item))) return 0; Item * item = reinterpret_cast(this) + (PAGE_SIZE_BYTE / sizeof(struct Item)) - i - 1; - if (reinterpret_cast(item) < this->msg) return 0; + if (reinterpret_cast(item) < this->msg()) return 0; return item; } diff --git a/repos/base-nova/include/nova/util.h b/repos/base-nova/include/nova/util.h index 8fa44bbbc5..f4b1e22837 100644 --- a/repos/base-nova/include/nova/util.h +++ b/repos/base-nova/include/nova/util.h @@ -40,7 +40,7 @@ inline void request_event_portal(Genode::addr_t const cap, /* request event-handler portal */ utcb->crd_rcv = Nova::Obj_crd(sel, 0); - utcb->msg[0] = event; + utcb->msg()[0] = event; utcb->set_msg_word(1); Genode::uint8_t res = Nova::call(cap); @@ -85,7 +85,7 @@ inline void translate_remote_pager(Genode::addr_t const cap, }; /* translate one item */ - utcb->msg[0] = 0xaffe; + utcb->msg()[0] = 0xaffe; utcb->set_msg_word(1); Nova::Obj_crd obj_crd(sel, 0); diff --git a/repos/base-nova/src/core/echo.cc b/repos/base-nova/src/core/echo.cc index 6a69222952..77de2c2bb9 100644 --- a/repos/base-nova/src/core/echo.cc +++ b/repos/base-nova/src/core/echo.cc @@ -40,11 +40,11 @@ inline void *echo_stack_top() static void echo_reply() { /* collect map information from calling thread, sent as 3 words */ - Nova::Crd snd_rcv(echo()->utcb()->msg[0]); - Nova::mword_t offset = echo()->utcb()->msg[1]; - bool kern_pd = echo()->utcb()->msg[2]; - bool dma_mem = echo()->utcb()->msg[3]; - bool write_combined = echo()->utcb()->msg[4]; + Nova::Crd snd_rcv(echo()->utcb()->msg()[0]); + Nova::mword_t offset = echo()->utcb()->msg()[1]; + bool kern_pd = echo()->utcb()->msg()[2]; + bool dma_mem = echo()->utcb()->msg()[3]; + bool write_combined = echo()->utcb()->msg()[4]; /* reset message transfer descriptor */ echo()->utcb()->set_msg_word(0); @@ -53,7 +53,7 @@ static void echo_reply() false, dma_mem, write_combined); /* set return code, 0 means failure */ - echo()->utcb()->msg[0] = res; + echo()->utcb()->msg()[0] = res; echo()->utcb()->items += 1; /* during reply the mapping will be established */ diff --git a/repos/base-nova/src/core/include/nova_util.h b/repos/base-nova/src/core/include/nova_util.h index 33558f147c..12c7154d96 100644 --- a/repos/base-nova/src/core/include/nova_util.h +++ b/repos/base-nova/src/core/include/nova_util.h @@ -69,16 +69,16 @@ static int map_local(Nova::Utcb *utcb, Nova::Crd src_crd, Nova::Crd dst_crd, utcb->crd_rcv = dst_crd; /* tell echo thread what to map */ - utcb->msg[0] = src_crd.value(); - utcb->msg[1] = 0; - utcb->msg[2] = kern_pd; - utcb->msg[3] = dma_mem; - utcb->msg[4] = write_combined; + utcb->msg()[0] = src_crd.value(); + utcb->msg()[1] = 0; + utcb->msg()[2] = kern_pd; + utcb->msg()[3] = dma_mem; + utcb->msg()[4] = write_combined; utcb->set_msg_word(5); /* establish the mapping via a portal traversal during reply phase */ Nova::uint8_t res = Nova::call(echo()->pt_sel()); - if (res != Nova::NOVA_OK || utcb->msg_words() != 1 || !utcb->msg[0] || + if (res != Nova::NOVA_OK || utcb->msg_words() != 1 || !utcb->msg()[0] || utcb->msg_items() != 1) { typedef Genode::Hex Hex; @@ -88,7 +88,7 @@ static int map_local(Nova::Utcb *utcb, Nova::Crd src_crd, Nova::Crd dst_crd, "result=", Hex(res), " " "msg=", Hex(utcb->msg_items()), ":", Hex(utcb->msg_words()), ":", - Hex(utcb->msg[0]), " !!! " + Hex(utcb->msg()[0]), " !!! " "utcb=", utcb, " " "kern=", kern_pd); return res > 0 ? res : -1; diff --git a/repos/base-nova/src/core/ipc_pager.cc b/repos/base-nova/src/core/ipc_pager.cc index c6f0330368..58f0e2996b 100644 --- a/repos/base-nova/src/core/ipc_pager.cc +++ b/repos/base-nova/src/core/ipc_pager.cc @@ -32,7 +32,7 @@ Ipc_pager::Ipc_pager(Nova::Utcb * utcb, addr_t pd_dst, addr_t pd_core) _sp(utcb->sp), _fault_type(utcb->qual[0]), _syscall_res(Nova::NOVA_OK), - _normal_ipc((((addr_t)&utcb->qual[2] - (addr_t)utcb->msg) / sizeof(addr_t)) + _normal_ipc((((addr_t)&utcb->qual[2] - (addr_t)utcb->msg()) / sizeof(addr_t)) == utcb->msg_words()) { diff --git a/repos/base-nova/src/core/pager.cc b/repos/base-nova/src/core/pager.cc index 466ba89d80..5efa7b89b2 100644 --- a/repos/base-nova/src/core/pager.cc +++ b/repos/base-nova/src/core/pager.cc @@ -311,7 +311,7 @@ void Pager_object::_invoke_handler(addr_t pager_obj) reply(myself->stack_top()); } - addr_t const event = utcb->msg[0]; + addr_t const event = utcb->msg()[0]; /* check for translated pager portals - required for vCPU in remote PDs */ if (utcb->msg_items() == 1 && utcb->msg_words() == 1 && event == 0xaffe) { diff --git a/repos/base-nova/src/include/base/internal/ipc.h b/repos/base-nova/src/include/base/internal/ipc.h index c5c4f642b8..d928379ee4 100644 --- a/repos/base-nova/src/include/base/internal/ipc.h +++ b/repos/base-nova/src/include/base/internal/ipc.h @@ -44,7 +44,7 @@ static inline Nova::mword_t copy_utcb_to_msgbuf(Nova::Utcb &utcb, return 0; /* the UTCB contains the protocol word followed by the message data */ - mword_t const protocol_word = utcb.msg[0]; + mword_t const protocol_word = utcb.msg()[0]; size_t num_data_words = num_msg_words - 1; if (num_data_words*sizeof(mword_t) > rcv_msg.capacity()) { @@ -55,7 +55,7 @@ static inline Nova::mword_t copy_utcb_to_msgbuf(Nova::Utcb &utcb, } /* read message payload into destination message buffer */ - mword_t *src = (mword_t *)(void *)(&utcb.msg[1]); + mword_t *src = (mword_t *)(void *)(&utcb.msg()[1]); mword_t *dst = (mword_t *)rcv_msg.data(); for (unsigned i = 0; i < num_data_words; i++) *dst++ = *src++; @@ -96,11 +96,11 @@ static inline bool copy_msgbuf_to_utcb(Nova::Utcb &utcb, num_msg_words = NUM_MSG_REGS; } - utcb.msg[0] = protocol_value; + utcb.msg()[0] = protocol_value; /* store message into UTCB message registers */ mword_t *src = (mword_t *)&msg_buf[0]; - mword_t *dst = (mword_t *)(void *)&utcb.msg[1]; + mword_t *dst = (mword_t *)(void *)&utcb.msg()[1]; for (unsigned i = 0; i < num_data_words; i++) *dst++ = *src++; diff --git a/repos/base-nova/src/lib/base/rpc_entrypoint.cc b/repos/base-nova/src/lib/base/rpc_entrypoint.cc index 234fc7fceb..c827d656ef 100644 --- a/repos/base-nova/src/lib/base/rpc_entrypoint.cc +++ b/repos/base-nova/src/lib/base/rpc_entrypoint.cc @@ -90,7 +90,7 @@ void Rpc_entrypoint::_dissolve(Rpc_object_base *obj) _delay_start.unlock(); /* make a IPC to ensure that cap() identifier is not used anymore */ - utcb->msg[0] = 0xdead; + utcb->msg()[0] = 0xdead; utcb->set_msg_word(1); if (uint8_t res = call(_cap.local_name())) error(utcb, " - could not clean up entry point of thread ", this->utcb(), " - res ", res); diff --git a/repos/base-nova/src/test/platform/ipc.cc b/repos/base-nova/src/test/platform/ipc.cc index 105f071b31..bab7c529f9 100644 --- a/repos/base-nova/src/test/platform/ipc.cc +++ b/repos/base-nova/src/test/platform/ipc.cc @@ -36,9 +36,9 @@ long Test::cap_void_manual(Genode::Native_capability dst, /* don't open receive window */ utcb->crd_rcv = Nova::Obj_crd(); /* not used on base-nova */ - utcb->msg[0] = 0; + utcb->msg()[0] = 0; /* method number of RPC interface to be called on server side */ - utcb->msg[1] = 0; + utcb->msg()[1] = 0; utcb->set_msg_word(2); Nova::Crd crd = Genode::Capability_space::crd(arg1); @@ -50,7 +50,7 @@ long Test::cap_void_manual(Genode::Native_capability dst, /* restore original receive window */ utcb->crd_rcv = orig_crd; - local_reply = utcb->msg[1]; - return (res == Nova::NOVA_OK && utcb->msg_words() == 3 && utcb->msg[2]) - ? utcb->msg[0] : Genode::Rpc_exception_code::INVALID_OBJECT; + local_reply = utcb->msg()[1]; + return (res == Nova::NOVA_OK && utcb->msg_words() == 3 && utcb->msg()[2]) + ? utcb->msg()[0] : Genode::Rpc_exception_code::INVALID_OBJECT; } diff --git a/repos/base-nova/src/test/platform/main.cc b/repos/base-nova/src/test/platform/main.cc index 25232f33d0..fd908c851d 100644 --- a/repos/base-nova/src/test/platform/main.cc +++ b/repos/base-nova/src/test/platform/main.cc @@ -438,7 +438,7 @@ class Pager : private Genode::Thread { while (1) { } } - Genode::addr_t map_from = utcb->msg[0]; + Genode::addr_t map_from = utcb->msg()[0]; // Genode::error("pager: got map request ", Genode::Hex(map_from)); utcb->set_msg_word(0); @@ -524,14 +524,14 @@ class Cause_mapping : public Genode::Thread { // touch_read((unsigned char *)_mem_st); - nova_utcb->msg[0] = _mem_st; + nova_utcb->msg()[0] = _mem_st; nova_utcb->set_msg_word(1); nova_utcb->crd_rcv = Nova::Mem_crd(_mem_nd >> 12, 0, _mapping_rwx); Nova::call(_call_to_map.local_name()); //touch_read((unsigned char *)_mem_nd); - nova_utcb->msg[0] = _mem_nd; + nova_utcb->msg()[0] = _mem_nd; nova_utcb->set_msg_word(1); nova_utcb->crd_rcv = Nova::Mem_crd((_mem_nd + 0x1000) >> 12, 0, _mapping_rwx); diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc b/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc index 26074cc124..10477c1426 100644 --- a/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc +++ b/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc @@ -82,7 +82,7 @@ static bool map_eager(Genode::addr_t const page, unsigned log2_order) while (true) { /* setup faked page fault information */ - utcb->set_msg_word(((addr_t)&utcb->qual[2] - (addr_t)utcb->msg) / + utcb->set_msg_word(((addr_t)&utcb->qual[2] - (addr_t)utcb->msg()) / sizeof(addr_t)); utcb->ip = reinterpret_cast(map_eager); utcb->qual[1] = page; diff --git a/repos/ports/include/vmm/utcb_guard.h b/repos/ports/include/vmm/utcb_guard.h index 5cd1c5e57d..20dae3b104 100644 --- a/repos/ports/include/vmm/utcb_guard.h +++ b/repos/ports/include/vmm/utcb_guard.h @@ -45,7 +45,7 @@ class Vmm::Utcb_guard Nova::Utcb *utcb = reinterpret_cast(Thread::myself()->utcb()); - unsigned header_len = (char *)utcb->msg - (char *)utcb; + unsigned header_len = (char *)utcb->msg() - (char *)utcb; unsigned len = header_len + utcb->msg_words() * sizeof(Nova::mword_t); Genode::memcpy(&_backup_utcb, utcb, len); @@ -57,7 +57,7 @@ class Vmm::Utcb_guard { Nova::Utcb *utcb = reinterpret_cast(&_backup_utcb); - unsigned header_len = (char *)utcb->msg - (char *)utcb; + unsigned header_len = (char *)utcb->msg() - (char *)utcb; unsigned len = header_len + utcb->msg_words() * sizeof(Nova::mword_t); Genode::memcpy(Thread::myself()->utcb(), utcb, len); }