[eros-cvs] cvs commit: eros/src/base/sys/key mk_VoidKey.cxx mk_Discrim.cxx pk_NumberKey.cxx
shap@eros.cs.jhu.edu
shap@eros.cs.jhu.edu
Sat, 27 Jan 2001 23:43:47 -0500
shap 01/01/27 23:43:47
Modified: src/base/sys files.common
src/base/sys/arch/i486/kernel UserContext.cxx
src/base/sys/disk MiscKey.def
src/base/sys/eros DiscrimKey.h Invoke.h StdKeyType.h
src/base/sys/kernel kern_Invoke.cxx kern_Key.cxx
src/base/sys/kerninc Key.hxx
src/base/sys/key mk_Discrim.cxx pk_NumberKey.cxx
Added: src/base/sys/key mk_VoidKey.cxx
Log:
Added void key implementation. Revised segment walk logic to treat
slots containing void as invalid addresses. Added new result code
RC_Void to be returned by void key. As Number key is no longer void
key, revised number key to return RC_OK and AKT_Number. AKT_Number is
now 8 as opposed to KT+1. Discrim now considers void key to be
discrete. There is now a single, global VoidKey in the kernel for use
in returning non-existent capabilities from kernel invocations.
Revision Changes Path
1.24 +1 -0 eros/src/base/sys/files.common
Index: files.common
===================================================================
RCS file: /cvs/eros/src/base/sys/files.common,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- files.common 2001/01/15 20:17:32 1.23
+++ files.common 2001/01/28 04:43:46 1.24
@@ -103,6 +103,7 @@
file("key/mk_ConsoleCreator.cxx")
file("key/mk_SchedCreator.cxx")
file("key/mk_SysTrace.cxx")
+file("key/mk_VoidKey.cxx")
file("kernel/kern_Key.cxx")
file("pci/pci_PCI.cxx")
file("pci/pci_dev.cxx")
1.248 +6 -0 eros/src/base/sys/arch/i486/kernel/UserContext.cxx
Index: UserContext.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/arch/i486/kernel/UserContext.cxx,v
retrieving revision 1.247
retrieving revision 1.248
diff -u -r1.247 -r1.248
--- UserContext.cxx 2001/01/20 19:36:16 1.247
+++ UserContext.cxx 2001/01/28 04:43:46 1.248
@@ -1678,6 +1678,9 @@
/* Process everything but the per-object processing first: */
switch(keyType) {
case KtMisc:
+ if ( (pSegKey->subType == MiscKeyType::Void) )
+ goto invalid_addr;
+
if ( (pSegKey->subType != MiscKeyType::TimePage) )
goto seg_malformed;
@@ -2001,6 +2004,9 @@
/* Process everything but the per-object processing first: */
switch(keyType) {
case KtMisc:
+ if ( (pSegKey->subType == MiscKeyType::Void) )
+ goto invalid_addr;
+
if ( (pSegKey->subType != MiscKeyType::TimePage) )
goto seg_malformed;
1.35 +1 -0 eros/src/base/sys/disk/MiscKey.def
Index: MiscKey.def
===================================================================
RCS file: /cvs/eros/src/base/sys/disk/MiscKey.def,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- MiscKey.def 2001/01/15 20:17:33 1.34
+++ MiscKey.def 2001/01/28 04:43:46 1.35
@@ -56,6 +56,7 @@
we're not really going to pay attention anyway. */
DEF_MISCKEY(LogFrame)
DEF_MISCKEY(DevicePrivs)
+DEF_MISCKEY(Void)
#undef DEF_MISCKEY
#undef OLD_MISCKEY
1.13 +5 -4 eros/src/base/sys/eros/DiscrimKey.h
Index: DiscrimKey.h
===================================================================
RCS file: /cvs/eros/src/base/sys/eros/DiscrimKey.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- DiscrimKey.h 1999/10/14 00:20:05 1.12
+++ DiscrimKey.h 2001/01/28 04:43:46 1.13
@@ -35,10 +35,11 @@
#define OC_Discrim_Verify 2
#define OC_Discrim_Compare 3
-#define Discrim_Class_Number 0
-#define Discrim_Class_Resume 1
-#define Discrim_Class_Memory 2
-#define Discrim_Class_Sched 3
+#define Discrim_Class_Void 0
+#define Discrim_Class_Number 1
+#define Discrim_Class_Resume 2
+#define Discrim_Class_Memory 3
+#define Discrim_Class_Sched 4
#define Discrim_Class_Other 255
uint32_t discrim_classify(uint32_t krDiscrim, uint32_t krObject);
1.38 +1 -0 eros/src/base/sys/eros/Invoke.h
Index: Invoke.h
===================================================================
RCS file: /cvs/eros/src/base/sys/eros/Invoke.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- Invoke.h 1999/10/14 00:20:05 1.37
+++ Invoke.h 2001/01/28 04:43:46 1.38
@@ -101,6 +101,7 @@
/* see ObRef introduction */
#define RC_OK 0u
+#define RC_Void (KT+1)
#define RC_UnknownRequest (KT+2)
#define RC_RequestError (KT+3)
#define RC_NoAccess (KT+4)
1.21 +1 -1 eros/src/base/sys/eros/StdKeyType.h
Index: StdKeyType.h
===================================================================
RCS file: /cvs/eros/src/base/sys/eros/StdKeyType.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- StdKeyType.h 1999/10/14 00:20:20 1.20
+++ StdKeyType.h 2001/01/28 04:43:46 1.21
@@ -59,7 +59,7 @@
#define AKT_Space 0x302
#define AKT_Process 0x304
#define AKT_Range 0x305
-#define AKT_Number ((KT)+1)
+#define AKT_Number 0x8
#define AKT_Device 0x400
1.207 +2 -2 eros/src/base/sys/kernel/kern_Invoke.cxx
Index: kern_Invoke.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/kernel/kern_Invoke.cxx,v
retrieving revision 1.206
retrieving revision 1.207
diff -u -r1.206 -r1.207
--- kern_Invoke.cxx 2001/01/10 13:16:42 1.206
+++ kern_Invoke.cxx 2001/01/28 04:43:46 1.207
@@ -625,7 +625,7 @@
(inv.key->subType != MiscKeyType::Returner)) &&
(inv.exit.code != RC_OK &&
inv.entry.code != OC_KeyType &&
- inv.exit.code != (uint32_t)AKT_Number) ) )
+ inv.exit.code != (uint32_t)RC_Void) ) )
MsgLog::dprintf(true, "Before DeliverResult() (invokee=0x%08x)\n",
inv.invokee);
#endif
@@ -1048,7 +1048,7 @@
(inv.key->subType != MiscKeyType::Returner)) &&
(inv.exit.code != RC_OK &&
inv.entry.code != OC_KeyType &&
- inv.exit.code != (uint32_t)AKT_Number) ) )
+ inv.exit.code != (uint32_t)RC_Void) ) )
MsgLog::dprintf(true, "Before DeliverResult() (invokee=0x%08x)\n",
inv.invokee);
#endif
1.115 +17 -0 eros/src/base/sys/kernel/kern_Key.cxx
Index: kern_Key.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/kernel/kern_Key.cxx,v
retrieving revision 1.114
retrieving revision 1.115
diff -u -r1.114 -r1.115
--- kern_Key.cxx 2001/01/10 13:16:42 1.114
+++ kern_Key.cxx 2001/01/28 04:43:46 1.115
@@ -73,6 +73,8 @@
Key Key::ZeroNumberKey; /* default constructor */
+Key Key::VoidKey(KtMisc, MiscKeyType::Void); /* default constructor */
+
/* NOTE: if we are running OB_MOD_CHECK, the key prepare logic does an
* incremental recomputation on the check field in the containing object.
*/
@@ -591,6 +593,21 @@
Key::Key()
{
KS_ZeroInitKey();
+}
+
+Key::Key(KeyType kt, uint16_t ty)
+{
+ InitType(KtMisc);
+ SetUnprepared();
+ subType = ty;
+ if (ty == MiscKeyType::TimePage)
+ keyData = (EROS_PAGE_BLSS | SEGMODE_RO);
+ else
+ keyData = 0;
+
+ nk.value[2] = 0;
+ nk.value[1] = 0;
+ nk.value[0] = 0;
}
#ifndef NDEBUG
1.59 +2 -0 eros/src/base/sys/kerninc/Key.hxx
Index: Key.hxx
===================================================================
RCS file: /cvs/eros/src/base/sys/kerninc/Key.hxx,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- Key.hxx 2001/01/08 20:47:36 1.58
+++ Key.hxx 2001/01/28 04:43:46 1.59
@@ -117,6 +117,7 @@
#if 0
Key(KeyType kt, uint8_t db); /* This is wrong - need more args. */
#endif
+ Key(KeyType kt, uint16_t subType);
Key();
#if 0
@@ -214,6 +215,7 @@
#endif
static Key ZeroNumberKey;
+ static Key VoidKey;
} ;
1.22 +7 -0 eros/src/base/sys/key/mk_Discrim.cxx
Index: mk_Discrim.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/key/mk_Discrim.cxx,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- mk_Discrim.cxx 2001/01/08 20:57:52 1.21
+++ mk_Discrim.cxx 2001/01/28 04:43:46 1.22
@@ -53,6 +53,12 @@
case KtSched:
inv.exit.code = Discrim_Class_Sched;
break;
+ case KtMisc:
+ if (inv.entry.key[0]->subType == MiscKeyType::Void) {
+ inv.exit.code = Discrim_Class_Void;
+ break;
+ }
+ /* FALL THROUGH */
default:
inv.exit.code = Discrim_Class_Other;
break;
@@ -83,6 +89,7 @@
break;
case KtMisc:
if (inv.entry.key[0]->subType == MiscKeyType::Discrim ||
+ inv.entry.key[0]->subType == MiscKeyType::Void ||
inv.entry.key[0]->subType == MiscKeyType::Returner)
inv.exit.code = 0;
break;
1.29 +2 -2 eros/src/base/sys/key/pk_NumberKey.cxx
Index: pk_NumberKey.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/key/pk_NumberKey.cxx,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- pk_NumberKey.cxx 2001/01/08 20:57:52 1.28
+++ pk_NumberKey.cxx 2001/01/28 04:43:46 1.29
@@ -36,7 +36,7 @@
* as though any of these operations can actually fail...
*/
- inv.exit.code = AKT_Number;
+ inv.exit.code = RC_OK;
switch(inv.entry.code) {
case OC_Number_Value:
@@ -44,11 +44,11 @@
inv.exit.w1 = inv.key->nk.value[0];
inv.exit.w2 = inv.key->nk.value[1];
inv.exit.w3 = inv.key->nk.value[2];
- inv.exit.code = RC_OK;
return;
}
case KT:
inv.exit.w1 = inv.key->keyData;
+ inv.exit.code = AKT_Number;
return;
}
}
1.1 eros/src/base/sys/key/mk_VoidKey.cxx
Index: mk_VoidKey.cxx
===================================================================
/*
* Copyright (C) 2001, Jonathan S. Shapiro.
*
* This file is part of the EROS Operating System.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2,
* or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <kerninc/kernel.hxx>
#include <kerninc/Key.hxx>
#include <kerninc/Invocation.hxx>
#include <kerninc/MsgLog.hxx>
#include <kerninc/Persist.hxx>
#include <kerninc/Machine.hxx>
#include <kerninc/Thread.hxx>
#include <eros/PageKey.h>
#include <eros/Invoke.h>
#include <eros/StdKeyType.h>
#include <eros/memory.h>
#include <disk/MiscKeyType.hxx>
void
VoidKey(Invocation& inv)
{
COMMIT_POINT();
inv.exit.code = RC_Void;
return;
}