[eros-cvs] cvs commit: eros/src/base/sys/libkey lk_discrim_classify.c lk_discrim_compare.c lk_discrim_verify.c lk_dscrm_classify.c

shap@eros.cs.jhu.edu shap@eros.cs.jhu.edu
Tue, 24 Apr 2001 11:43:29 -0400


shap        01/04/24 11:43:29

  Modified:    src/base/domain/cons_front cons_front.c
               src/base/domain/constructor constructor.c
               src/base/domain/keyset keyset.c
               src/base/sys/eros DiscrimKey.h
               src/base/sys/key mk_Discrim.cxx
               src/base/sys/libkey lk_discrim_classify.c
                        lk_discrim_compare.c lk_discrim_verify.c
                        lk_dscrm_classify.c
  Log:
  Discrim key now returns results (except AKT) in W1

Revision  Changes    Path
1.25      +10 -5     eros/src/base/domain/cons_front/cons_front.c

Index: cons_front.c
===================================================================
RCS file: /cvs/eros/src/base/domain/cons_front/cons_front.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- cons_front.c	2001/04/01 23:05:53	1.24
+++ cons_front.c	2001/04/24 15:43:28	1.25
@@ -294,19 +294,21 @@
 uint32_t 
 stash_reader (uint16_t keyNum, uint32_t rdbytes, uint32_t eventMask)
 {
-
+  uint32_t obClass;
   /*
    * stash the reader's return key and number of bytes
    * 
    * return 1 on succ; 0 if too many already stashed
    */
   
-  if (discrim_classify(KR_DISCRIM, keyNum) != Discrim_Class_Resume) {
+  discrim_classify(KR_DISCRIM, keyNum, &obClass);
+  if (obClass != Discrim_Class_Resume)
     return 0; /* not a resume key */
-  }
+
   if (stash_event_mask != 0) {
     return 0;
-  } else {
+  }
+  else {
     copy_key_reg(KR_RETURNER, keyNum, KR_STASHEDKEY);
     copy_key_reg(KR_RETURNER, keyNum, KR_ZERO);
     
@@ -323,8 +325,11 @@
 uint32_t
 verify_stashed_key(void)
 {
+  uint32_t obClass;
+  
   /* make sure the current stashed key is still valid */
-  if (discrim_classify(KR_DISCRIM, KR_STASHEDKEY) != Discrim_Class_Resume) {
+  discrim_classify(KR_DISCRIM, KR_STASHEDKEY, &obClass);
+  if (obClass != Discrim_Class_Resume) {
     stash_wants_rdbytes = 0;
     stash_event_mask = 0;
     return 0; /* not a resume key */



1.30      +10 -3     eros/src/base/domain/constructor/constructor.c

Index: constructor.c
===================================================================
RCS file: /cvs/eros/src/base/domain/constructor/constructor.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- constructor.c	2001/04/01 23:05:54	1.29
+++ constructor.c	2001/04/24 15:43:28	1.30
@@ -104,9 +104,11 @@
 CheckDiscretion(uint32_t kr, ConstructorInfo *ci)
 {
   uint32_t keyInfo;
+  uint32_t isDiscrete;
   
   node_copy(KR_CONSTIT, KC_DISCRIM, KR_SCRATCH);
-  if (discrim_verify(KR_SCRATCH, kr))
+  discrim_verify(KR_SCRATCH, kr, &isDiscrete);
+  if (isDiscrete)
     return;
 
   node_copy(KR_CONSTIT, KC_DCC, KR_SCRATCH);
@@ -328,12 +330,14 @@
 is_not_discreet(uint32_t kr, ConstructorInfo *ci)
 {
   uint32_t keyInfo;
+  uint32_t isDiscrete;
   
   node_copy(KR_CONSTIT, KC_DISCRIM, KR_SCRATCH);
   
   DEBUG kdprintf(KR_OSTREAM, "constructor: is_not_discreet(): discrim_verify\n");
 
-  if (discrim_verify(KR_SCRATCH, kr))
+  discrim_verify(KR_SCRATCH, kr, &isDiscrete);
+  if (isDiscrete)
     return 0;			/* ok */
 
   DEBUG kdprintf(KR_OSTREAM, "constructor: is_not_discreet(): proccre_amplify\n");
@@ -362,11 +366,14 @@
   DEBUG kdprintf(KR_OSTREAM, "constructor: insert constituent %d\n", ndx);
 
   if (ndx == 19) {
+    uint32_t obClass;
+    
     /* This copy IS redundant with the one in is_not_discreet(), but
        this path is not performance critical and clarity matters too. */
     node_copy(KR_CONSTIT, KC_DISCRIM, KR_SCRATCH);
   
-    if (discrim_classify(KR_SCRATCH, kr) != Discrim_Class_Number)
+    discrim_classify(KR_SCRATCH, kr, &obClass);
+    if (obClass != Discrim_Class_Number)
       return RC_RequestError;
   }
 



1.30      +4 -1      eros/src/base/domain/keyset/keyset.c

Index: keyset.c
===================================================================
RCS file: /cvs/eros/src/base/domain/keyset/keyset.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- keyset.c	2001/04/01 23:05:54	1.29
+++ keyset.c	2001/04/24 15:43:28	1.30
@@ -309,6 +309,7 @@
 {
   Message msg;
   uint32_t result;
+  uint32_t isEqual;
 
   /* it's got to be a KEYDATA 0u start key */
   result = proccre_amplify_gate(KR_DOMCRE, krOtherSet, KR_SCRATCH2);
@@ -320,7 +321,9 @@
     return KT; /* nice try, fool. */
   }
 
-  if (discrim_compare(KR_DISCRIM, KR_SELF, KR_SCRATCH2) == 1)
+  discrim_compare(KR_DISCRIM, KR_SELF, KR_SCRATCH2, &isEqual);
+  
+  if (isEqual)
     return RC_Internal_KeyToSelf;
 
   DEBUG(protocol)



1.14      +6 -3      eros/src/base/sys/eros/DiscrimKey.h

Index: DiscrimKey.h
===================================================================
RCS file: /cvs/eros/src/base/sys/eros/DiscrimKey.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- DiscrimKey.h	2001/01/28 04:43:46	1.13
+++ DiscrimKey.h	2001/04/24 15:43:28	1.14
@@ -42,8 +42,11 @@
 #define Discrim_Class_Sched   4
 #define Discrim_Class_Other   255
 
-uint32_t discrim_classify(uint32_t krDiscrim, uint32_t krObject);
-uint32_t discrim_verify(uint32_t krDiscrim, uint32_t krObject);
-uint32_t discrim_compare(uint32_t krDiscrim, uint32_t krOb1, uint32_t krOb2);
+uint32_t discrim_classify(uint32_t krDiscrim, uint32_t krObject,
+			  uint32_t *obClass);
+uint32_t discrim_verify(uint32_t krDiscrim, uint32_t krObject,
+			uint32_t *isDiscrete);
+uint32_t discrim_compare(uint32_t krDiscrim, uint32_t krOb1, uint32_t krOb2,
+			 uint32_t *isEqual);
 
 #endif /* __DISCRIM_H__ */



1.25      +20 -18    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.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- mk_Discrim.cxx	2001/02/09 04:04:43	1.24
+++ mk_Discrim.cxx	2001/04/24 15:43:29	1.25
@@ -37,30 +37,32 @@
 
     COMMIT_POINT();
   
+    inv.exit.code = RC_OK;	/* until proven otherwise */
+
     switch(inv.entry.key[0]->GetType()) {
     case KtNumber:
-      inv.exit.code = Discrim_Class_Number;
+      inv.exit.w1 = Discrim_Class_Number;
       break;
     case KtResume:
-      inv.exit.code = Discrim_Class_Resume;
+      inv.exit.w1 = Discrim_Class_Resume;
       break;
     case KtDataPage:
     case KtCapPage:
     case KtNode:
     case KtSegment:
-      inv.exit.code = Discrim_Class_Memory;
+      inv.exit.w1 = Discrim_Class_Memory;
       break;
     case KtSched:
-      inv.exit.code = Discrim_Class_Sched;
+      inv.exit.w1 = Discrim_Class_Sched;
       break;
     case KtMisc:
       if (inv.entry.key[0]->subType == MiscKeyType::Void) {
-	inv.exit.code = Discrim_Class_Void;
+	inv.exit.w1 = Discrim_Class_Void;
 	break;
       }
       /* FALL THROUGH */
     default:
-      inv.exit.code = Discrim_Class_Other;
+      inv.exit.w1 = Discrim_Class_Other;
       break;
     }
 
@@ -75,7 +77,7 @@
     switch(inv.entry.key[0]->GetType()) {
     case KtDataPage:
       if (inv.entry.key[0]->IsReadOnly())
-	inv.exit.code = 1;
+	inv.exit.w1 = 1;
       break;
     case KtCapPage:
     case KtSegment:
@@ -83,16 +85,16 @@
       if (inv.entry.key[0]->IsReadOnly() &&
 	  inv.entry.key[0]->IsNoCall() &&
 	  inv.entry.key[0]->IsWeak())	  
-	inv.exit.code = 1;
+	inv.exit.w1 = 1;
       break;
     case KtNumber:
-      inv.exit.code = 1;
+      inv.exit.w1 = 1;
       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 = 1;
+	inv.exit.w1 = 1;
       break;
     default:
       break;
@@ -101,7 +103,7 @@
     return;
 
   case OC_Discrim_Compare:
-    inv.exit.code = 1;
+    inv.exit.w1 = 1;
 
     inv.entry.key[0]->Prepare();
     inv.entry.key[1]->Prepare();
@@ -109,24 +111,24 @@
     COMMIT_POINT();
   
     if (inv.entry.key[0]->GetType() != inv.entry.key[1]->GetType())
-      inv.exit.code = 0;
+      inv.exit.w1 = 0;
     else if ( inv.entry.key[0]->IsObjectKey() ) {
       if ( inv.entry.key[0]->ok.pObj != inv.entry.key[1]->ok.pObj )
-	inv.exit.code = 0;
+	inv.exit.w1 = 0;
     }
     else {
       if (inv.entry.key[0]->nk.value[0] != inv.entry.key[0]->nk.value[0])
-	inv.exit.code = 0;
+	inv.exit.w1 = 0;
       if (inv.entry.key[0]->nk.value[1] != inv.entry.key[0]->nk.value[1])
-	inv.exit.code = 0;
+	inv.exit.w1 = 0;
       if (inv.entry.key[0]->nk.value[2] != inv.entry.key[0]->nk.value[2])
-	inv.exit.code = 0;
+	inv.exit.w1 = 0;
     }
 	     
     if (inv.entry.key[0]->subType != inv.entry.key[1]->subType)
-      inv.exit.code = 0;
+      inv.exit.w1 = 0;
     if (inv.entry.key[0]->keyData != inv.entry.key[1]->keyData)
-      inv.exit.code = 0;
+      inv.exit.w1 = 0;
 
     return;
     



1.14      +7 -2      eros/src/base/sys/libkey/lk_discrim_classify.c

Index: lk_discrim_classify.c
===================================================================
RCS file: /cvs/eros/src/base/sys/libkey/lk_discrim_classify.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- lk_discrim_classify.c	1999/10/14 00:20:39	1.13
+++ lk_discrim_classify.c	2001/04/24 15:43:29	1.14
@@ -24,8 +24,9 @@
 
 /* Copy key from node slot to key register */
 uint32_t
-discrim_classify(uint32_t krDiscrim, uint32_t krOb)
+discrim_classify(uint32_t krDiscrim, uint32_t krOb, uint32_t *obClass)
 {
+  uint32_t result;
   Message msg;
 
   msg.snd_w1 = 0;
@@ -47,6 +48,10 @@
   msg.snd_invKey = krDiscrim;
   msg.snd_code = OC_Discrim_Classify;
 
-  return CALL(&msg);
+  result = CALL(&msg);
+
+  (*obClass) = msg.rcv_w1;
+
+  return result;
 }
 



1.14      +8 -2      eros/src/base/sys/libkey/lk_discrim_compare.c

Index: lk_discrim_compare.c
===================================================================
RCS file: /cvs/eros/src/base/sys/libkey/lk_discrim_compare.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- lk_discrim_compare.c	1999/10/14 00:20:40	1.13
+++ lk_discrim_compare.c	2001/04/24 15:43:29	1.14
@@ -24,8 +24,11 @@
 
 /* Copy key from node slot to key register */
 uint32_t
-discrim_compare(uint32_t krDiscrim, uint32_t krOb1, uint32_t krOb2)
+discrim_compare(uint32_t krDiscrim, uint32_t krOb1, uint32_t krOb2,
+		uint32_t* isEqual)
 {
+  uint32_t result;
+  
   Message msg;
 
   msg.snd_w1 = 0;
@@ -47,6 +50,9 @@
   msg.snd_invKey = krDiscrim;
   msg.snd_code = OC_Discrim_Compare;
 
-  return CALL(&msg);
+  result = CALL(&msg);
+
+  (*isEqual) = msg.rcv_w1;
+  return result;
 }
 



1.14      +7 -2      eros/src/base/sys/libkey/lk_discrim_verify.c

Index: lk_discrim_verify.c
===================================================================
RCS file: /cvs/eros/src/base/sys/libkey/lk_discrim_verify.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- lk_discrim_verify.c	1999/10/14 00:20:40	1.13
+++ lk_discrim_verify.c	2001/04/24 15:43:29	1.14
@@ -24,8 +24,9 @@
 
 /* Copy key from node slot to key register */
 uint32_t
-discrim_verify(uint32_t krDiscrim, uint32_t krOb)
+discrim_verify(uint32_t krDiscrim, uint32_t krOb, uint32_t *isDiscrete)
 {
+  uint32_t result;
   Message msg;
 
   msg.snd_w1 = 0;
@@ -47,6 +48,10 @@
   msg.snd_invKey = krDiscrim;
   msg.snd_code = OC_Discrim_Verify;
 
-  return CALL(&msg);
+  result = CALL(&msg);
+
+  (*isDiscrete) = msg.rcv_w1;
+  
+  return result;
 }
 



1.14      +7 -2      eros/src/base/sys/libkey/lk_dscrm_classify.c

Index: lk_dscrm_classify.c
===================================================================
RCS file: /cvs/eros/src/base/sys/libkey/lk_dscrm_classify.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- lk_dscrm_classify.c	1999/10/14 00:20:41	1.13
+++ lk_dscrm_classify.c	2001/04/24 15:43:29	1.14
@@ -24,8 +24,9 @@
 
 /* Copy key from node slot to key register */
 uint32_t
-discrim_classify(uint32_t krDiscrim, uint32_t krKey)
+discrim_classify(uint32_t krDiscrim, uint32_t krKey, uint32_t *obClass)
 {
+  uint32_t result;
   Message msg;
 
   msg.snd_w1 = 0;
@@ -47,6 +48,10 @@
   msg.snd_invKey = krDiscrim;
   msg.snd_code = OC_Discrim_Classify;
 
-  return CALL(&msg);
+  result = CALL(&msg);
+
+  (*obClass) = msg.rcv_w1;
+
+  return result;
 }