⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.h

📁 C++ 编写的EROS RTOS
💻 H
字号:
#ifndef __KEY_H__#define __KEY_H__/* * Copyright (C) 1998, 1999, Jonathan S. Shapiro. * * This file is part of the EROS Operating System runtime library. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA. */#ifndef __STDKEYTYPE_H__#include <eros/StdKeyType.h>#endif/*   The 'keyData' field of the key is used for a number of purposes:       o In start keys, it provides the process with an indicator of       which key was invoked.       o In segmode keys, it contains the biased log segment size and       the permissions, organized as follows:            bit position: 15  14  13 12:5 4:0                        RO  NC  WK   0   blss         bits 12:5 are reserved.  RO and NC stand for "read only" and       "don't call" respectively.  TY indicates whether a segment key       is a red or black segment key.        o In schedule keys, it holds the priority.       o In the old key format, it was used to hold the key subtype in       device and miscellaneous keys.  In the new format, this       information is now stored in the 'subType' field.*//* User-visible attributes of a key: */#define SEGMODE_RO		__U(0x8000)#define SEGMODE_NC		__U(0x4000)#define SEGMODE_WEAK		__U(0x2000)#define SEGMODE_BLSS_MASK	__U(0x1fff)#define SEGMODE_ATTRIBUTE_MASK  __U(0xe000)/* Slots of a Red Segment:   12: By CONVENTION where the red seg keeper puts its space bank   13: Keeper Key (variable - determined by format key)   14: Background Key (variable - determined by format key)   15: Format Key   *//* Slots of a process root. Changes here should be matched in the * architecture-dependent layout files and also in the mkimage grammar * restriction checking logic. */#define ProcSched             0#define ProcKeeper            1#define ProcAddrSpace         2#define ProcCapSpace          3	/* unimplemented */#define ProcGenKeys           3 /* for now */#define ProcIoSpace           4	/* unimplemented */#define ProcSymSpace          5#define ProcBrand             6#define ProcTrapCode          7#define ProcPCandSP           8#define ProcFirstRootRegSlot  7#define ProcLastRootRegSlot   31#if 0#define ProcSndBlock          9#define ProcOrderAndInvoke    10#define ProcRcvBlock          11#endif/* #define ProcAltMsgBuf         6 */#ifdef KT_Wrapper#define WrapperSpace          0#define WrapperBackground     29#define WrapperKeeper         30#define WrapperFormat         31#define WRAPPER_SEND_NODE     __U(0x10000000)#define WRAPPER_SEND_WORD     __U(0x20000000)#define WRAPPER_KEEPER        __U(0x40000000)#define WRAPPER_BACKGROUND    __U(0x80000000)#define WRAPPER_SET_BLSS(nkv, blss) \  do { \    (nkv).value[0] &= ~SEGMODE_BLSS_MASK; \    (nkv).value[0] |= (uint32_t)(blss); \  } while (0) #define WRAPPER_GET_BLSS(nkv) \      ( (nkv).value[0] & SEGMODE_BLSS_MASK )#endif/* #define NEW_SEGMENT_LOGIC */#define REDSEG_SEND_NODE      __U(1)#define REDSEG_SEND_UNALTERED __U(0)#ifndef KT_Wrapper#ifndef NEW_SEGMENT_LOGIC/* #define RedSegBank           12 */#define RedSegBackground     29#define RedSegKeeper         30#define RedSegFormat         31#define REDSEG_SET_INITIAL_SLOTS(nkv, i) \  do { \    (nkv).value[0] &= ~EROS_NODE_SLOT_MASK; \    (nkv).value[0] |= (i); \  } while (0) #define REDSEG_GET_INITIAL_SLOTS(nkv) ( (nkv).value[0] & EROS_NODE_SLOT_MASK )#define REDSEG_SET_RESERVED_SLOTS(nkv, r) ( (void) 0 )#define REDSEG_GET_RESERVED_SLOTS(nkv) EROS_NODE_SLOT_MASK#define REDSEG_SET_KPR_SLOT(nkv, s) \  do { \    (nkv).value[0] &= ~(EROS_NODE_SLOT_MASK << (2*EROS_NODE_LGSIZE)); \    (nkv).value[0] |= ( (uint32_t)(s)<<(2*EROS_NODE_LGSIZE) ); \  } while (0) #define REDSEG_GET_KPR_SLOT(nkv) ( ((nkv).value[0] >> (2*EROS_NODE_LGSIZE)) & EROS_NODE_SLOT_MASK )#define REDSEG_SET_BG_SLOT(nkv, s) \  do { \    (nkv).value[0] &= ~(EROS_NODE_SLOT_MASK << (3*EROS_NODE_LGSIZE)); \    (nkv).value[0] |= ( (uint32_t)(s)<<(3*EROS_NODE_LGSIZE) ); \  } while (0) #define REDSEG_GET_BG_SLOT(nkv) ( ((nkv).value[0] >> (3*EROS_NODE_LGSIZE)) & EROS_NODE_SLOT_MASK )#define REDSEG_SET_BLSS(nkv, blss) \  do { \    (nkv).value[0] &= ((1u << (4*EROS_NODE_LGSIZE)) - 1u); \    (nkv).value[0] |= ((uint32_t)(blss) << (4*EROS_NODE_LGSIZE)); \  } while (0) #define REDSEG_GET_BLSS(nkv) \      ( (nkv).value[0] >> (4*EROS_NODE_LGSIZE) )#define REDSEG_SET_SENDNODE(nkv, val) \  do { \    (nkv).value[0] &= ~(EROS_NODE_SLOT_MASK << (EROS_NODE_LGSIZE)); \    (nkv).value[0] |= ( (uint32_t)(val)<<(EROS_NODE_LGSIZE) ); \  } while (0) #define REDSEG_GET_SENDNODE(nkv) ( ((nkv).value[0] >> (EROS_NODE_LGSIZE)) & EROS_NODE_SLOT_MASK )#else#error "Macros not debugged yet for 32 slots"#define nRedSegWorkingSet     28#define nRedSegBackground     29#define nRedSegKeeper         30#define nRedSegFormat         31    /* NOTE that the following are not defined in terms of node size,       and therefore do not require adjustment... */#define REDSEG_SET_INITIAL_SLOTS(nkv, i) \  do { \    (nkv).value[0] &= ~0xffu; \    (nkv).value[0] |= (i); \  } while (0) #define REDSEG_GET_INITIAL_SLOTS(nkv) ( (nkv).value[0] & 0xffu )#define REDSEG_SET_RESERVED_SLOTS(nkv, r) \  do { \    (nkv).value[0] &= ~0xff00u; \    (nkv).value[0] |= ( (uint32_t)(r) << 8 ); \  } while (0) #define REDSEG_GET_RESERVED_SLOTS(nkv) ( ((nkv).value[0] >>8 ) & 0xffu )#define REDSEG_SET_KPR_SLOT(nkv, s) \  do { \    assert (s == nRedSegKeeper); \    if (REDSEG_GET_RESERVED_SLOTS(nkv) > s) \      REDSEG_SET_RESERVED_SLOTS(nkv, s) \  } while (0) #define REDSEG_GET_KPR_SLOT(nkv) ( nRedSegKeeper )#define REDSEG_SET_BG_SLOT(nkv, s) \  do { \    assert (s == nRedSegBackground); \    if (REDSEG_GET_RESERVED_SLOTS(nkv) > s) \      REDSEG_SET_RESERVED_SLOTS(nkv, s) \  } while (0) #define REDSEG_GET_BG_SLOT(nkv) ( nRedSegBackground )#define REDSEG_SET_WS_SLOT(nkv, s) \  do { \    assert (s == nRedSegWorkingSet); \    if (REDSEG_GET_RESERVED_SLOTS(nkv) > s) \      REDSEG_SET_RESERVED_SLOTS(nkv, s) \  } while (0) #define REDSEG_GET_BG_SLOT(nkv) ( nRedSegWorkingSet )#define REDSEG_SET_BLSS(nkv, blss) \  do { \    (nkv).value[0] &= 0x8000fffffu; \    (nkv).value[0] |= ((uint32_t)(blss) << 16); \  } while (0) #define REDSEG_GET_BLSS(nkv) ( ((nkv).value[0] >> 16) & 0x7fffu )#define REDSEG_SET_SENDNODE(nkv, val) \  do { \    (nkv).value[0] &= ~0x80000000u; \    (nkv).value[0] |= ((uint32_t)(val) << 31); \  } while (0) #define REDSEG_GET_SENDNODE(nkv) ( ((nkv).value[0] >> 31 ) & 0x1u )#endif#define RedSegBLSS	     1#endif#endif /* __KEY_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -