managarm icon indicating copy to clipboard operation
managarm copied to clipboard

Unhandled page fault when running the MiniBrowser

Open Dennisbonke opened this issue 4 years ago • 1 comments

When running the MiniBrowser, I run into a SMAP violation. If I comment out the SMAP enable code, I can reproduce the page fault, albeit later.

Backtrace:

(gdb) bt
#0  thor::panic () at ../../../src/managarm/kernel/thor/generic/debug.cpp:149
#1  thor::PanicSink::operator() (this=<optimized out>, msg=<optimized out>) at ../../../src/managarm/kernel/thor/generic/debug.cpp:190
#2  0xffffffff800723d3 in frg::stack_buffer_logger<thor::PanicSink, 128ul>::_emit (this=0xffffffff80164960 <thor::pioLogHandler>, this@entry=0xffffe00008b0f8a0, 
    message=0xffffe00008b0f8a0 "\033[31mthor: SMAP fault.\033[39m") at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:92
#3  frg::stack_buffer_logger<thor::PanicSink, 128ul>::item::operator<< (this=0xffffe00008b0f898) at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:44
#4  thor::handlePageFault (image=..., address=address@entry=160, errorCode=<optimized out>) at ../../../src/managarm/kernel/thor/generic/main.cpp:379
#5  0xffffffff8010eaae in onPlatformFault (image=..., number=<optimized out>) at ../../../src/managarm/kernel/thor/arch/x86/ints.cpp:351
#6  0xffffffff80000518 in faultStubPage () at ../../../src/managarm/kernel/thor/arch/x86/stubs.S:200
#7  0x00000000000000a0 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 

Dennisbonke avatar Mar 30 '22 16:03 Dennisbonke

Further investigation shows it's not a SMAP fault. We do have some more info, and a new backtrace

(gdb) bt
#0  thor::panic () at ../../../src/managarm/kernel/thor/generic/debug.cpp:149
#1  thor::PanicSink::operator() (this=<optimized out>, msg=<optimized out>) at ../../../src/managarm/kernel/thor/generic/debug.cpp:190
#2  0xffffffff80071ddf in frg::stack_buffer_logger<thor::PanicSink, 128ul>::_emit (this=0xffffffff8015d950 <thor::pioLogHandler>, this@entry=0xffffffffffffffff, 
    message=0xffffe000169008a8 "\033[31mthor: Page fault in kernel, at 0xffffffff8015dd18, faulting ip: 0xffffffff8015dd18") at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:92
#3  frg::stack_buffer_logger<thor::PanicSink, 128ul>::item::operator<< (this=0xffffe000169008a0) at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:44
#4  thor::handlePageFault (image=..., address=<optimized out>, address@entry=18446744071563500824, errorCode=<optimized out>) at ../../../src/managarm/kernel/thor/generic/main.cpp:412
#5  0xffffffff8010875e in onPlatformFault (image=..., number=14) at ../../../src/managarm/kernel/thor/arch/x86/ints.cpp:351
#6  0xffffffff80000518 in faultStubPage () at ../../../src/managarm/kernel/thor/arch/x86/stubs.S:200
#7  0xffffffff8015dd18 in ?? ()
#8  0xffffe00018980000 in ?? ()
#9  0xffffe00016900b90 in ?? ()
#10 0xffffffff8001134f in frg::unique_lock<thor::IrqSpinlock>::lock (this=<optimized out>) at ../../../src/managarm/subprojects/frigg/include/frg/mutex.hpp:57
#11 frg::unique_lock<thor::IrqSpinlock>::unique_lock (mutex=..., this=<optimized out>) at ../../../src/managarm/subprojects/frigg/include/frg/mutex.hpp:35
#12 frg::slab_pool<thor::KernelVirtualAlloc, thor::IrqSpinlock>::free_in_slab_ (this=0x1, slb=0x246, p=0xffffe00016900ce0) at ../../../src/managarm/subprojects/frigg/include/frg/slab.hpp:328
Backtrace stopped: Cannot access memory at address 0xa8
(gdb)

E9 error

thor: Unhandled page fault at 0xffffffff8015dd18, faulting ip: 0xffffffff8015dd18
thor: Page fault at 0xffffffff8015dd18, faulting ip: 0xffffffff8015dd18
Errors: (Supervisor) (Access violation) (Instruction fetch)
thor: Page fault in kernel, at 0xffffffff8015dd18, faulting ip: 0xffffffff8015dd18

objdump -dS

ffffffff80070723:       c6 05 e7 d5 0e 00 01    movb   $0x1,0xed5e7(%rip)        # ffffffff8015dd11 <_ZN4thor18kernelVirtualAllocE+0x1>
        infoLogger() << "thor: Number of available pages: "
                        << physicalAllocator->numFreePages() << frg::endlog;

        kernelVirtualAlloc.initialize();
        kernelHeap.initialize(*kernelVirtualAlloc);
ffffffff8007072a:       48 c7 c7 18 dd 15 80    mov    $0xffffffff8015dd18,%rdi
ffffffff80070731:       48 c7 c6 10 dd 15 80    mov    $0xffffffff8015dd10,%rsi
ffffffff80070738:       e8 73 4b 00 00          call   ffffffff800752b0 <_ZN3frg10manual_boxINS_9slab_poolIN4thor18KernelVirtualAllocENS2_11IrqSpinlockEEEE10initializeIJRS3_EEEvDpOT_>
                FRG_ASSERT(_initialized);
ffffffff8007073d:       80 3d 8c d7 0e 00 00    cmpb   $0x0,0xed78c(%rip)        # ffffffff8015ded0 <_ZN4thor10kernelHeapE+0x1b8>
ffffffff80070744:       0f 84 ae fe ff ff       je     ffffffff800705f8 <thorInitialize+0x338>
                FRG_ASSERT(!_initialized);
ffffffff8007074a:       80 3d 8f d7 0e 00 00    cmpb   $0x0,0xed78f(%rip)        # ffffffff8015dee0 <_ZN4thor11kernelAllocE+0x8>
ffffffff80070751:       0f 85 e7 00 00 00       jne    ffffffff8007083e <thorInitialize+0x57e>
        : pool_{pool} { }
ffffffff80070757:       48 c7 05 76 d7 0e 00    movq   $0xffffffff8015dd18,0xed776(%rip)        # ffffffff8015ded8 <_ZN4thor11kernelAllocE>
ffffffff8007075e:       18 dd 15 80 
                _initialized = true;

With KASAN enabled, we get

Fault #8, with IF=0, cs: 0x20, ip: 0xffffffff8013aca7
Error code: 0x0, SS: 0x38, RSP: 0xffffffffffffffd9

Backtrace:

(gdb) bt
#0  thor::panic () at ../../../src/managarm/kernel/thor/generic/debug.cpp:149
#1  thor::PanicSink::operator() (this=<optimized out>, msg=<optimized out>) at ../../../src/managarm/kernel/thor/generic/debug.cpp:190
#2  0xffffffff80427943 in frg::stack_buffer_logger<thor::PanicSink, 128ul>::_emit (this=0xffffffff80528bb0 <thor::pioLogHandler>, message=0xa <error: Cannot access memory at address 0xa>)
    at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:92
#3  frg::stack_buffer_logger<thor::PanicSink, 128ul>::item::operator<< (this=<optimized out>) at ../../../src/managarm/subprojects/frigg/include/frg/logging.hpp:44
#4  onPlatformFault (image=..., number=8) at ../../../src/managarm/kernel/thor/arch/x86/ints.cpp:333
#5  0xffffffff800002dc in faultStubDouble () at ../../../src/managarm/kernel/thor/arch/x86/stubs.S:194
#6  0xffffffff8013aca7 in thor::IrqObject::raise (this=<optimized out>) at ../../../src/managarm/kernel/thor/generic/irq.cpp:484
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 

Which is interesting, as irq.cpp:484 is this line. Running with SMAP and SMEP disabled, -smp 1 on the command line.

Dennisbonke avatar Apr 03 '22 20:04 Dennisbonke