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