git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixed the RTC only firing once.
[tpg/acess2.git]
/
Kernel
/
arch
/
x86
/
mm_virt.c
diff --git
a/Kernel/arch/x86/mm_virt.c
b/Kernel/arch/x86/mm_virt.c
index
2e726cc
..
c930947
100644
(file)
--- a/
Kernel/arch/x86/mm_virt.c
+++ b/
Kernel/arch/x86/mm_virt.c
@@
-9,6
+9,7
@@
* 0xFE - Unused
* 0xFF - System Calls / Kernel's User Code
*/
* 0xFE - Unused
* 0xFF - System Calls / Kernel's User Code
*/
+#define DEBUG 1
#include <common.h>
#include <mm_phys.h>
#include <proc.h>
#include <common.h>
#include <mm_phys.h>
#include <proc.h>
@@
-39,6
+40,8
@@
// === IMPORTS ===
extern Uint32 gaInitPageDir[1024];
extern Uint32 gaInitPageTable[1024];
// === IMPORTS ===
extern Uint32 gaInitPageDir[1024];
extern Uint32 gaInitPageTable[1024];
+extern void Threads_SegFault(Uint Addr);
+extern void Error_Backtrace(Uint eip, Uint ebp);
// === PROTOTYPES ===
void MM_PreinitVirtual();
// === PROTOTYPES ===
void MM_PreinitVirtual();
@@
-105,7
+108,7
@@
void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
&& gaPageTable[Addr>>12] & PF_COW )
{
tPAddr paddr;
&& gaPageTable[Addr>>12] & PF_COW )
{
tPAddr paddr;
- if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) ==
0
)
+ if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) ==
1
)
{
gaPageTable[Addr>>12] &= ~PF_COW;
gaPageTable[Addr>>12] |= PF_PRESENT|PF_WRITE;
{
gaPageTable[Addr>>12] &= ~PF_COW;
gaPageTable[Addr>>12] |= PF_PRESENT|PF_WRITE;
@@
-117,11
+120,20
@@
void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
gaPageTable[Addr>>12] &= PF_USER;
gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE;
}
gaPageTable[Addr>>12] &= PF_USER;
gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE;
}
+
INVLPG( Addr & ~0xFFF );
//LEAVE('-')
return;
}
INVLPG( Addr & ~0xFFF );
//LEAVE('-')
return;
}
+ // If it was a user, tell the thread handler
+ if(ErrorCode & 4) {
+ Warning("User Pagefault: Instruction at %p accessed %p", Regs->eip, Addr);
+ __asm__ __volatile__ ("sti"); // Restart IRQs
+ Threads_SegFault(Addr);
+ return ;
+ }
+
// -- Check Error Code --
if(ErrorCode & 8)
Warning("Reserved Bits Trashed!");
// -- Check Error Code --
if(ErrorCode & 8)
Warning("Reserved Bits Trashed!");
@@
-135,6
+147,10
@@
void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
);
}
);
}
+ Log("Code at %p accessed %p", Regs->eip, Addr);
+ // Print Stack Backtrace
+ Error_Backtrace(Regs->eip, Regs->ebp);
+
Log("gaPageDir[0x%x] = 0x%x", Addr>>22, gaPageDir[Addr>>22]);
if( gaPageDir[Addr>>22] & PF_PRESENT )
Log("gaPageTable[0x%x] = 0x%x", Addr>>12, gaPageTable[Addr>>12]);
Log("gaPageDir[0x%x] = 0x%x", Addr>>22, gaPageDir[Addr>>22]);
if( gaPageDir[Addr>>22] & PF_PRESENT )
Log("gaPageTable[0x%x] = 0x%x", Addr>>12, gaPageTable[Addr>>12]);
@@
-157,6
+173,24
@@
void MM_DumpTables(tVAddr Start, tVAddr End)
const tPAddr MASK = ~0xF98;
Start >>= 12; End >>= 12;
const tPAddr MASK = ~0xF98;
Start >>= 12; End >>= 12;
+
+ #if 0
+ Log("Directory Entries:");
+ for(page = Start >> 10;
+ page < (End >> 10)+1;
+ page ++)
+ {
+ if(gaPageDir[page])
+ {
+ Log(" 0x%08x-0x%08x :: 0x%08x",
+ page<<22, ((page+1)<<22)-1,
+ gaPageDir[page]&~0xFFF
+ );
+ }
+ }
+ #endif
+
+ Log("Table Entries:");
for(page = Start, curPos = Start<<12;
page < End;
curPos += 0x1000, page++)
for(page = Start, curPos = Start<<12;
page < End;
curPos += 0x1000, page++)
@@
-166,7
+200,7
@@
void MM_DumpTables(tVAddr Start, tVAddr End)
|| (gaPageTable[page] & MASK) != expected)
{
if(expected) {
|| (gaPageTable[page] & MASK) != expected)
{
if(expected) {
- Log("0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
+ Log("
0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
rangeStart, curPos - 1,
gaPageTable[rangeStart>>12] & ~0xFFF,
(expected & ~0xFFF) - 1,
rangeStart, curPos - 1,
gaPageTable[rangeStart>>12] & ~0xFFF,
(expected & ~0xFFF) - 1,
@@
-368,10
+402,12
@@
Uint MM_ClearUser()
}
MM_DerefPhys( gaPageDir[i] & ~0xFFF );
}
MM_DerefPhys( gaPageDir[i] & ~0xFFF );
+ gaPageDir[i] = 0;
+ INVLPG( &gaPageTable[i*1024] );
}
}
+ INVLPG( gaPageDir );
-
- return *gTmpCR3;
+ return *gaPageCR3;
}
/**
}
/**
@@
-381,6
+417,7
@@
Uint MM_ClearUser()
Uint MM_Clone()
{
Uint i, j;
Uint MM_Clone()
{
Uint i, j;
+ Uint page = 0;
Uint kStackBase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE;
void *tmp;
Uint kStackBase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE;
void *tmp;
@@
-398,29
+435,31
@@
Uint MM_Clone()
// Check if table is allocated
if( !(gaPageDir[i] & PF_PRESENT) ) {
gaTmpDir[i] = 0;
// Check if table is allocated
if( !(gaPageDir[i] & PF_PRESENT) ) {
gaTmpDir[i] = 0;
+ page += 1024;
continue;
}
// Allocate new table
gaTmpDir[i] = MM_AllocPhys() | (gaPageDir[i] & 7);
continue;
}
// Allocate new table
gaTmpDir[i] = MM_AllocPhys() | (gaPageDir[i] & 7);
- INVLPG( &gaTmpTable[
i*1024
] );
+ INVLPG( &gaTmpTable[
page
] );
// Fill
// Fill
- for( j = 0; j < 1024; j ++ )
+ for( j = 0; j < 1024; j ++
, page++
)
{
{
- if( !(gaPageTable[
i*1024+j
] & PF_PRESENT) ) {
- gaTmpTable[
i*1024+j
] = 0;
+ if( !(gaPageTable[
page
] & PF_PRESENT) ) {
+ gaTmpTable[
page
] = 0;
continue;
}
// Refrence old page
continue;
}
// Refrence old page
- MM_RefPhys( gaPageTable[
i*1024+j
] & ~0xFFF );
+ MM_RefPhys( gaPageTable[
page
] & ~0xFFF );
// Add to new table
// Add to new table
- if(gaPageTable[i*1024+j] & PF_WRITE) {
- gaTmpTable[i*1024+j] = (gaPageTable[i*1024+j] & ~PF_WRITE) | PF_COW;
- gaPageTable[i*1024+j] = (gaPageTable[i*1024+j] & ~PF_WRITE) | PF_COW;
+ if(gaPageTable[page] & PF_WRITE) {
+ gaTmpTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW;
+ gaPageTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW;
+ INVLPG( page << 12 );
}
else
}
else
- gaTmpTable[
i*1024+j] = gaPageTable[i*1024+j
];
+ gaTmpTable[
page] = gaPageTable[page
];
}
}
}
}
UCC
git Repository :: git.ucc.asn.au