📄 key.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 + -