[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;
}