[eros-cvs] cvs commit: eros/src/base/sys/arch/i486/kernel PageFault.cxx UserContext.cxx
shap@eros.cs.jhu.edu
shap@eros.cs.jhu.edu
Sat, 20 Jan 2001 14:36:16 -0500
shap 01/01/20 14:36:16
Modified: src/base/sys/arch/i486/kernel PageFault.cxx UserContext.cxx
Log:
Add some missing assertion checks to the PageFault handlers.
Fix WalkSeg() and WalkSeg64() so that if the slot being traversed
contains a node key or segment key, and the LSS of this segment key is
out of range, that we generate a malformed segment fault. In this
context, "out of range" means keyBlss<=EROS_PAGE_BLSS and
keyBlss!=RedSegBlss.
Revision Changes Path
1.160 +12 -4 eros/src/base/sys/arch/i486/kernel/PageFault.cxx
Index: PageFault.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/arch/i486/kernel/PageFault.cxx,v
retrieving revision 1.159
retrieving revision 1.160
diff -u -r1.159 -r1.160
--- PageFault.cxx 2001/01/10 13:16:41 1.159
+++ PageFault.cxx 2001/01/20 19:36:16 1.160
@@ -861,6 +861,10 @@
if ( !proc_WalkSeg(this, wi, EROS_PAGE_BLSS, &thePTE, 0, true) )
return false;
+ assert(wi.segObj);
+ assert(wi.segObj->obType == ObType::PtCapPage ||
+ wi.segObj->obType == ObType::PtDataPage);
+
kpa_t pageAddr = 0;
uint32_t flags = DATA_PAGE_FLAGS;
@@ -880,8 +884,8 @@
pageAddr = VTOP(ObjectCache::ObHdrToPage(wi.segObj));
if (pageAddr == 0)
- MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!!\n",
- wi.segObj, pageAddr);
+ MsgLog::dprintf(true, "wi.segObj 0x%08x at addr 0x%08x!! (wi=0x%08x)\n",
+ wi.segObj, pageAddr, &wi);
assert ((pageAddr & EROS_PAGE_MASK) == 0);
assert (pageAddr < (kpa_t) start || pageAddr >= (kpa_t) end);
@@ -1139,6 +1143,10 @@
if ( !proc_WalkSeg(this, wi, EROS_PAGE_BLSS, &thePTE, 0, true) )
return false;
+ assert(wi.segObj);
+ assert(wi.segObj->obType == ObType::PtCapPage ||
+ wi.segObj->obType == ObType::PtDataPage);
+
if (isWrite)
PTE_SET(thePDE, PTE_W);
if (isCap)
@@ -1163,8 +1171,8 @@
pageAddr = VTOP(ObjectCache::ObHdrToPage(pPageHdr));
if (pageAddr == 0)
- MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!!\n",
- pPageHdr, pageAddr);
+ MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!! (wi=0x%08x)\n",
+ pPageHdr, pageAddr, &wi);
assert ((pageAddr & EROS_PAGE_MASK) == 0);
assert (pageAddr < (kpa_t) start || pageAddr >= (kpa_t) end);
1.247 +8 -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.246
retrieving revision 1.247
diff -u -r1.246 -r1.247
--- UserContext.cxx 2001/01/16 12:54:44 1.246
+++ UserContext.cxx 2001/01/20 19:36:16 1.247
@@ -1732,6 +1732,10 @@
wi.segObjIsRed = false;
if ( keyType == KtNode || keyType == KtSegment ) {
+ if (wi.segBlss <= EROS_PAGE_BLSS &&
+ wi.segBlss != BLSS::RedSeg)
+ goto seg_malformed;
+
segNode = (Node *) wi.segObj;
if (segNode->PrepAsSegment() == false)
@@ -2053,6 +2057,10 @@
if ( keyType == KtNode || keyType == KtSegment ) {
segNode = (Node *) wi.segObj;
+ if (wi.segBlss <= EROS_PAGE_BLSS &&
+ wi.segBlss != BLSS::RedSeg)
+ goto seg_malformed;
+
if (segNode->PrepAsSegment() == false)
goto seg_thru_process;