From 42b7c01685f6294f63bcc00498112b7dbda20474 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 9 Mar 2012 11:39:46 +0100 Subject: [PATCH] Unify policy name for Native_capability_tpl. This commit unifies the policy name for the template argument for Native_capability_tpl to Cap_dst_policy, like suggested by Norman in the discussion resulting from issue #145. Moreover, it takes the memcpy operation for copying a Native_capability out of the template, which is included by a significant bunch of files, and separates it in a library, analog to the suggestion in issue #145. --- base-codezero/include/base/native_types.h | 16 ++++++++++----- base-codezero/lib/mk/ipc.mk | 1 + base-fiasco/include/base/native_types.h | 21 ++++++++++++-------- base-fiasco/lib/mk/ipc.mk | 1 + base-foc/include/base/native_types.h | 23 +++++++++++----------- base-foc/lib/mk/ipc.inc | 2 +- base-foc/src/base/ipc/pager.cc | 2 +- base-foc/src/base/lock/lock_helper.h | 2 +- base-foc/src/core/platform_pd.cc | 2 +- base-host/include/base/native_types.h | 5 +++-- base-host/lib/mk/ipc.mk | 1 + base-linux/include/base/native_types.h | 5 +++-- base-linux/lib/mk/ipc.mk | 2 +- base-mb/include/base/native_types.h | 5 +++-- base-mb/lib/mk/ipc.mk | 2 +- base-nova/include/base/native_types.h | 5 +++-- base-nova/lib/mk/ipc.mk | 2 +- base-okl4/include/base/native_types.h | 5 +++-- base-okl4/lib/mk/ipc.mk | 1 + base-pistachio/include/base/native_types.h | 21 ++++++++++++-------- base-pistachio/lib/mk/ipc.mk | 1 + base/include/base/native_capability.h | 5 +---- base/lib/mk/cap_copy.mk | 3 +++ base/mk/base-libs.mk | 2 +- base/src/platform/cap_copy.cc | 20 +++++++++++++++++++ 25 files changed, 101 insertions(+), 54 deletions(-) create mode 100644 base/lib/mk/cap_copy.mk create mode 100644 base/src/platform/cap_copy.cc diff --git a/base-codezero/include/base/native_types.h b/base-codezero/include/base/native_types.h index 9c7825309..3506d913d 100644 --- a/base-codezero/include/base/native_types.h +++ b/base-codezero/include/base/native_types.h @@ -27,10 +27,19 @@ namespace Genode { class Platform_thread; - struct Native_thread_id + struct Cap_dst_policy { typedef int Dst; + static bool valid(Dst tid) { return tid != Codezero::NILTHREAD; } + static Dst invalid() { return Codezero::NILTHREAD; } + static void copy(void* dst, Native_capability_tpl* src); + }; + + struct Native_thread_id + { + typedef Cap_dst_policy::Dst Dst; + Dst tid; /** @@ -51,9 +60,6 @@ namespace Genode { Native_thread_id(Dst l4id) : tid(l4id), running_lock(0) { } Native_thread_id(Dst l4id, Codezero::l4_mutex *rl) : tid(l4id), running_lock(rl) { } - - static bool valid(Dst tid) { return tid != Codezero::NILTHREAD; } - static Dst invalid() { return Codezero::NILTHREAD; } }; struct Native_thread @@ -107,7 +113,7 @@ namespace Genode { inline bool operator == (Native_thread_id t1, Native_thread_id t2) { return t1.tid == t2.tid; } inline bool operator != (Native_thread_id t1, Native_thread_id t2) { return t1.tid != t2.tid; } - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef int Native_connection_state; } diff --git a/base-codezero/lib/mk/ipc.mk b/base-codezero/lib/mk/ipc.mk index 9e662a419..302770253 100644 --- a/base-codezero/lib/mk/ipc.mk +++ b/base-codezero/lib/mk/ipc.mk @@ -1,4 +1,5 @@ SRC_CC = ipc.cc pager.cc INC_DIR += $(REP_DIR)/include/codezero/dummies +LIBS = cap_copy vpath %.cc $(REP_DIR)/src/base/ipc diff --git a/base-fiasco/include/base/native_types.h b/base-fiasco/include/base/native_types.h index 48e1e70e2..7016e90f0 100644 --- a/base-fiasco/include/base/native_types.h +++ b/base-fiasco/include/base/native_types.h @@ -18,13 +18,6 @@ namespace Fiasco { #include - - struct Thread_id_check - { - typedef l4_threadid_t Dst; - static bool valid(Dst id) { return !l4_is_invalid_id(id); } - static Dst invalid() { return L4_INVALID_ID;} - }; } namespace Genode { @@ -35,6 +28,18 @@ namespace Genode { typedef Fiasco::l4_threadid_t Native_thread_id; + struct Cap_dst_policy + { + typedef Fiasco::l4_threadid_t Dst; + static bool valid(Dst id) { return !Fiasco::l4_is_invalid_id(id); } + static Dst invalid() + { + using namespace Fiasco; + return L4_INVALID_ID; + } + static void copy(void* dst, Native_capability_tpl* src); + }; + struct Native_thread { Native_thread_id l4id; @@ -66,7 +71,7 @@ namespace Genode { */ typedef struct { } Native_utcb; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef Fiasco::l4_threadid_t Native_connection_state; } diff --git a/base-fiasco/lib/mk/ipc.mk b/base-fiasco/lib/mk/ipc.mk index 6e6443bb9..aac0969d0 100644 --- a/base-fiasco/lib/mk/ipc.mk +++ b/base-fiasco/lib/mk/ipc.mk @@ -1,3 +1,4 @@ SRC_CC = ipc.cc pager.cc +LIBS = cap_copy vpath %.cc $(REP_DIR)/src/base/ipc diff --git a/base-foc/include/base/native_types.h b/base-foc/include/base/native_types.h index ca6358823..cb49ee33d 100644 --- a/base-foc/include/base/native_types.h +++ b/base-foc/include/base/native_types.h @@ -8,16 +8,6 @@ namespace Fiasco { #include #include - struct Thread_id_check - { - typedef l4_cap_idx_t Dst; - - static bool valid(Dst idx) { - return !(idx & Fiasco::L4_INVALID_CAP_BIT) && idx != 0; } - - static Dst invalid() { return L4_INVALID_CAP;} - }; - enum Cap_selectors { TASK_CAP = L4_BASE_TASK_CAP, PARENT_CAP = 0x8UL << L4_CAP_SHIFT, @@ -38,6 +28,17 @@ namespace Fiasco { namespace Genode { + struct Cap_dst_policy + { + typedef Fiasco::l4_cap_idx_t Dst; + + static bool valid(Dst idx) { + return !(idx & Fiasco::L4_INVALID_CAP_BIT) && idx != 0; } + + static Dst invalid() { return Fiasco::L4_INVALID_CAP;} + static void copy(void* dst, Native_capability_tpl* src); + }; + typedef volatile int Native_lock; typedef Fiasco::l4_cap_idx_t Native_thread_id; typedef Fiasco::l4_cap_idx_t Native_thread; @@ -45,7 +46,7 @@ namespace Genode { typedef Fiasco::l4_utcb_t* Native_utcb; typedef int Native_connection_state; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; } #endif /* _INCLUDE__BASE__NATIVE_TYPES_H_ */ diff --git a/base-foc/lib/mk/ipc.inc b/base-foc/lib/mk/ipc.inc index 9a9abfc51..6c85c3682 100644 --- a/base-foc/lib/mk/ipc.inc +++ b/base-foc/lib/mk/ipc.inc @@ -1,4 +1,4 @@ -LIBS = syscalls +LIBS = syscalls cap_copy SRC_CC += ipc.cc pager.cc INC_DIR += $(REP_DIR)/src/base/lock diff --git a/base-foc/src/base/ipc/pager.cc b/base-foc/src/base/ipc/pager.cc index d61905a7c..3eb900d0e 100644 --- a/base-foc/src/base/ipc/pager.cc +++ b/base-foc/src/base/ipc/pager.cc @@ -98,7 +98,7 @@ void Ipc_pager::reply_and_wait_for_fault() void Ipc_pager::acknowledge_wakeup() { - l4_cap_idx_t dst = Thread_id_check::valid(_last) ? _last : L4_SYSF_REPLY; + l4_cap_idx_t dst = Cap_dst_policy::valid(_last) ? _last : L4_SYSF_REPLY; /* answer wakeup call from one of core's region-manager sessions */ l4_ipc_send(dst, l4_utcb(), l4_msgtag(0, 0, 0, 0), L4_IPC_SEND_TIMEOUT_0); diff --git a/base-foc/src/base/lock/lock_helper.h b/base-foc/src/base/lock/lock_helper.h index 906f0dd0a..399be8169 100644 --- a/base-foc/src/base/lock/lock_helper.h +++ b/base-foc/src/base/lock/lock_helper.h @@ -81,7 +81,7 @@ static inline Genode::Native_thread_id thread_invalid_id() */ static inline bool thread_id_valid(Genode::Native_thread_id tid) { - return Fiasco::Thread_id_check::valid(tid); + return Genode::Cap_dst_policy::valid(tid); } diff --git a/base-foc/src/core/platform_pd.cc b/base-foc/src/core/platform_pd.cc index 0041bb1be..cdd1cd1a4 100644 --- a/base-foc/src/core/platform_pd.cc +++ b/base-foc/src/core/platform_pd.cc @@ -43,7 +43,7 @@ static addr_t core_utcb_base() { void Platform_pd::_create_pd(bool syscall) { - if (!Thread_id_check::valid(_l4_task_cap)) + if (!Cap_dst_policy::valid(_l4_task_cap)) _l4_task_cap = cap_alloc()->alloc(); if (syscall) { diff --git a/base-host/include/base/native_types.h b/base-host/include/base/native_types.h index 3e52b2d59..819170aa2 100644 --- a/base-host/include/base/native_types.h +++ b/base-host/include/base/native_types.h @@ -18,10 +18,11 @@ namespace Genode { - struct Empty_thread_id { + struct Cap_dst_policy { typedef int Dst; static bool valid(Dst) { return false; } static Dst invalid() { return false; } + static void copy(void* dst, Native_capability_tpl* src); }; typedef volatile int Native_lock; @@ -29,7 +30,7 @@ namespace Genode { typedef Native_thread Native_thread_id; typedef struct { } Native_utcb; typedef int Native_connection_state; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; } #endif /* _INCLUDE__BASE__NATIVE_TYPES_H_ */ diff --git a/base-host/lib/mk/ipc.mk b/base-host/lib/mk/ipc.mk index 524cb1f03..6e3e9b51a 100644 --- a/base-host/lib/mk/ipc.mk +++ b/base-host/lib/mk/ipc.mk @@ -1,3 +1,4 @@ SRC_CC = ipc.cc +LIBS = cap_copy vpath ipc.cc $(REP_DIR)/src/base/ipc diff --git a/base-linux/include/base/native_types.h b/base-linux/include/base/native_types.h index ee5e35364..ace87146d 100644 --- a/base-linux/include/base/native_types.h +++ b/base-linux/include/base/native_types.h @@ -93,10 +93,11 @@ namespace Genode { inline bool operator != (Native_thread_id t1, Native_thread_id t2) { return (t1.tid != t2.tid) || (t1.pid != t2.pid); } - struct Thread_id_check { + struct Cap_dst_policy { typedef long Dst; static bool valid(Dst id) { return id != 0; } static Dst invalid() { return 0; } + static void copy(void* dst, Native_capability_tpl* src); }; /** @@ -104,7 +105,7 @@ namespace Genode { */ typedef struct { } Native_utcb; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef int Native_connection_state; /* socket descriptor */ } diff --git a/base-linux/lib/mk/ipc.mk b/base-linux/lib/mk/ipc.mk index f8b81bade..8f972ae80 100644 --- a/base-linux/lib/mk/ipc.mk +++ b/base-linux/lib/mk/ipc.mk @@ -1,5 +1,5 @@ REQUIRES = linux SRC_CC = ipc.cc -LIBS = syscall rpath +LIBS = syscall rpath cap_copy vpath ipc.cc $(REP_DIR)/src/base/ipc diff --git a/base-mb/include/base/native_types.h b/base-mb/include/base/native_types.h index b818e690f..6dbfe51b3 100755 --- a/base-mb/include/base/native_types.h +++ b/base-mb/include/base/native_types.h @@ -30,16 +30,17 @@ namespace Genode { Native_thread_id my_thread_id(); - struct Thread_id_check + struct Cap_dst_policy { typedef Kernel::Thread_id Dst; static bool valid(Dst tid) { return tid != Kernel::INVALID_THREAD_ID; } static Dst invalid() { return Kernel::INVALID_THREAD_ID; } + static void copy(void* dst, Native_capability_tpl* src); }; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef int Native_connection_state; } diff --git a/base-mb/lib/mk/ipc.mk b/base-mb/lib/mk/ipc.mk index 8c5d5d845..50249b5a6 100755 --- a/base-mb/lib/mk/ipc.mk +++ b/base-mb/lib/mk/ipc.mk @@ -1,6 +1,6 @@ SRC_CC = ipc.cc SRC_CC += pager.cc -LIBS += thread_context +LIBS += thread_context cap_copy vpath ipc.cc $(REP_DIR)/src/base/ipc vpath pager.cc $(REP_DIR)/src/base/ipc diff --git a/base-nova/include/base/native_types.h b/base-nova/include/base/native_types.h index fe5ec0072..6c1528b28 100644 --- a/base-nova/include/base/native_types.h +++ b/base-nova/include/base/native_types.h @@ -53,14 +53,15 @@ namespace Genode { long _utcb[UTCB_SIZE/sizeof(long)]; }; - struct Portal_checker + struct Cap_dst_policy { typedef int Dst; static bool valid(Dst pt) { return pt != 0; } static Dst invalid() { return 0; } + static void copy(void* dst, Native_capability_tpl* src); }; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef int Native_connection_state; } diff --git a/base-nova/lib/mk/ipc.mk b/base-nova/lib/mk/ipc.mk index 7116e3dd9..c76e486f8 100644 --- a/base-nova/lib/mk/ipc.mk +++ b/base-nova/lib/mk/ipc.mk @@ -1,5 +1,5 @@ SRC_CC = ipc.cc pager.cc -LIBS = thread_context +LIBS = thread_context cap_copy INC_DIR += $(REP_DIR)/src/platform vpath ipc.cc $(REP_DIR)/src/base/ipc diff --git a/base-okl4/include/base/native_types.h b/base-okl4/include/base/native_types.h index b183f58cc..a3684c420 100644 --- a/base-okl4/include/base/native_types.h +++ b/base-okl4/include/base/native_types.h @@ -78,14 +78,15 @@ namespace Genode { */ typedef struct { } Native_utcb; - struct Thread_id_checker + struct Cap_dst_policy { typedef Okl4::L4_ThreadId_t Dst; static bool valid(Dst tid) { return !Okl4::L4_IsNilThread(tid); } static Dst invalid() { return Okl4::L4_nilthread; } + static void copy(void* dst, Native_capability_tpl* src); }; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef Okl4::L4_ThreadId_t Native_connection_state; } diff --git a/base-okl4/lib/mk/ipc.mk b/base-okl4/lib/mk/ipc.mk index 6e6443bb9..aac0969d0 100644 --- a/base-okl4/lib/mk/ipc.mk +++ b/base-okl4/lib/mk/ipc.mk @@ -1,3 +1,4 @@ SRC_CC = ipc.cc pager.cc +LIBS = cap_copy vpath %.cc $(REP_DIR)/src/base/ipc diff --git a/base-pistachio/include/base/native_types.h b/base-pistachio/include/base/native_types.h index d20e89c4c..77e95dd4f 100644 --- a/base-pistachio/include/base/native_types.h +++ b/base-pistachio/include/base/native_types.h @@ -18,13 +18,6 @@ namespace Pistachio { #include - - struct Cap_dst_policy - { - typedef L4_ThreadId_t Dst; - static bool valid(Dst tid) { return !L4_IsNilThread(tid); } - static Dst invalid() { return L4_nilthread; } - }; } namespace Genode { @@ -35,6 +28,18 @@ namespace Genode { typedef Pistachio::L4_ThreadId_t Native_thread_id; + struct Cap_dst_policy + { + typedef Pistachio::L4_ThreadId_t Dst; + static bool valid(Dst tid) { return !Pistachio::L4_IsNilThread(tid); } + static Dst invalid() + { + using namespace Pistachio; + return L4_nilthread; + } + static void copy(void* dst, Native_capability_tpl* src); + }; + struct Native_thread { Native_thread_id l4id; @@ -66,7 +71,7 @@ namespace Genode { */ typedef struct { } Native_utcb; - typedef Native_capability_tpl Native_capability; + typedef Native_capability_tpl Native_capability; typedef Pistachio::L4_ThreadId_t Native_connection_state; } diff --git a/base-pistachio/lib/mk/ipc.mk b/base-pistachio/lib/mk/ipc.mk index 6e6443bb9..aac0969d0 100644 --- a/base-pistachio/lib/mk/ipc.mk +++ b/base-pistachio/lib/mk/ipc.mk @@ -1,3 +1,4 @@ SRC_CC = ipc.cc pager.cc +LIBS = cap_copy vpath %.cc $(REP_DIR)/src/base/ipc diff --git a/base/include/base/native_capability.h b/base/include/base/native_capability.h index 3a4c4cf1c..02ab65d8e 100644 --- a/base/include/base/native_capability.h +++ b/base/include/base/native_capability.h @@ -18,8 +18,6 @@ #ifndef _INCLUDE__BASE__NATIVE_CAPABILITY_H_ #define _INCLUDE__BASE__NATIVE_CAPABILITY_H_ -#include - namespace Genode { /** @@ -102,8 +100,7 @@ namespace Genode { /** * Copy this capability to another PD */ - void copy_to(void* dst) { - memcpy(dst, this, sizeof(Native_capability_tpl)); } + void copy_to(void* dst) { POLICY::copy(dst, this); } /***************************************** diff --git a/base/lib/mk/cap_copy.mk b/base/lib/mk/cap_copy.mk new file mode 100644 index 000000000..7282125a6 --- /dev/null +++ b/base/lib/mk/cap_copy.mk @@ -0,0 +1,3 @@ +SRC_CC = cap_copy.cc + +vpath cap_copy.cc $(BASE_DIR)/src/platform diff --git a/base/mk/base-libs.mk b/base/mk/base-libs.mk index 33f2e1449..fa84aafbc 100644 --- a/base/mk/base-libs.mk +++ b/base/mk/base-libs.mk @@ -6,7 +6,7 @@ # BASE_LIBS = alarm allocator_avl avl_tree cxx env heap \ ipc lock slab timed_semaphore thread signal \ - log_console slab + log_console slab cap_copy # # Name of Genode's dynamic linker diff --git a/base/src/platform/cap_copy.cc b/base/src/platform/cap_copy.cc new file mode 100644 index 000000000..d5f4e1d0c --- /dev/null +++ b/base/src/platform/cap_copy.cc @@ -0,0 +1,20 @@ +/* + * \brief Copy a platform-capability to another protection domain. + * \author Stefan Kalkowski + * \date 2012-03-09 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#include +#include + +using namespace Genode; + +void Cap_dst_policy::copy(void* dst, Native_capability_tpl* src) { + memcpy(dst, src, sizeof(Native_capability_tpl)); }