Might? have fixed one race condition bug. Still crashing for unknown reasons on my laptop rarely
This commit is contained in:
		
							
								
								
									
										21
									
								
								fault.nasm
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								fault.nasm
									
									
									
									
									
								
							@@ -6,8 +6,8 @@ _fault_coda:
 | 
			
		||||
xchg bx,bx
 | 
			
		||||
mov ax, 0x10
 | 
			
		||||
mov es, ax
 | 
			
		||||
; move to TOP OF kernel stack
 | 
			
		||||
mov ebp, 0x400000
 | 
			
		||||
; move to 'safe' location
 | 
			
		||||
mov ebp, 0x318000
 | 
			
		||||
mov esp, ebp
 | 
			
		||||
call error_environment
 | 
			
		||||
.hlt:
 | 
			
		||||
@@ -17,13 +17,30 @@ jmp .hlt
 | 
			
		||||
extern gpf_handler_v86
 | 
			
		||||
global gpfHandler
 | 
			
		||||
gpfHandler:
 | 
			
		||||
cli ; make sure we're in a 'friendly' env
 | 
			
		||||
push eax
 | 
			
		||||
push ebx
 | 
			
		||||
push ecx
 | 
			
		||||
; save old ds
 | 
			
		||||
mov bx, ds
 | 
			
		||||
mov ax, 0x10
 | 
			
		||||
mov ds, ax
 | 
			
		||||
mov word [_gpf_old_ds], bx
 | 
			
		||||
; relocate stack so other interrupts don't fuck us over
 | 
			
		||||
; not sure if this is necessary, it doesn't seem to fix our race conditions...
 | 
			
		||||
mov ebx, esp
 | 
			
		||||
sub esp, 0x1000
 | 
			
		||||
xor ecx, ecx
 | 
			
		||||
.l:
 | 
			
		||||
mov eax, [ebx]
 | 
			
		||||
mov [esp+ecx], eax
 | 
			
		||||
add ebx, 4
 | 
			
		||||
add ecx, 4
 | 
			
		||||
cmp ebx, 0x320000 ; tss esp0
 | 
			
		||||
jl .l
 | 
			
		||||
pop ecx
 | 
			
		||||
pop ebx
 | 
			
		||||
sti ; we shouldn't crash now?
 | 
			
		||||
mov eax, dword [esp+16] ; EFLAGS
 | 
			
		||||
and eax, 1 << 17 ; VM flag
 | 
			
		||||
test eax, eax
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								kernel.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								kernel.c
									
									
									
									
									
								
							@@ -112,7 +112,7 @@ void error_environment() {
 | 
			
		||||
    for (int i = 0; i < 80*50; i++)
 | 
			
		||||
        vga_text[i] = error_screen[i];
 | 
			
		||||
    uint8_t key;
 | 
			
		||||
    for (key = get_key(); key != 'e' && key != 'E'; key = get_key());
 | 
			
		||||
    while (key = get_key(), key != 'e' && key != 'E');
 | 
			
		||||
    v86_entry = i386LinearToFp(v86TransFlag);
 | 
			
		||||
    enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry), ®s);
 | 
			
		||||
}
 | 
			
		||||
@@ -311,12 +311,22 @@ void start() {
 | 
			
		||||
    kbd_wait();
 | 
			
		||||
 | 
			
		||||
    vga_text = &((uint16_t*)0xB8000)[80*16];
 | 
			
		||||
    vga_text += printStr("Press ` for a flagrant system error... ", vga_text);
 | 
			
		||||
    while ((key = get_key()) != '`') {
 | 
			
		||||
        *vga_text = (*vga_text & 0xFF00) | key;
 | 
			
		||||
        vga_text++;
 | 
			
		||||
    }
 | 
			
		||||
    // flagrant system error
 | 
			
		||||
    *((uint8_t*)0x1000000) = 0;
 | 
			
		||||
    vga_text += printStr("Press E for a flagrant system error. Press C to continue... ", vga_text);
 | 
			
		||||
    for (char l = 1;l;) { switch (key = get_key()) {
 | 
			
		||||
        case 'e':
 | 
			
		||||
        case 'E':
 | 
			
		||||
            // flagrant system error
 | 
			
		||||
            *((uint8_t*)0x1000000) = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case 'c':
 | 
			
		||||
        case 'C':
 | 
			
		||||
            // continue
 | 
			
		||||
            l = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            *vga_text = (*vga_text & 0xFF00) | key;
 | 
			
		||||
            vga_text++;
 | 
			
		||||
            break;
 | 
			
		||||
    }}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,9 @@ inc al
 | 
			
		||||
cmp eax, 200
 | 
			
		||||
jl .loop
 | 
			
		||||
mov eax, 0xA0000
 | 
			
		||||
;mov ecx, 1000000000
 | 
			
		||||
;.dbg:
 | 
			
		||||
;loop .dbg
 | 
			
		||||
int 0x30 ; Exit
 | 
			
		||||
mov edx, 0x105000 ; somewhere in kernel mem
 | 
			
		||||
mov edx, [edx] ; should page fault
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user