Hello,

AIUI, the fix you submitted was meant to fix this?

Samuel

Luca, le sam. 31 août 2024 09:42:59 +0200, a ecrit:
> Hi,
> 
> Il 28/08/24 15:01, J. E. Marinheiro ha scritto:
> > At this point, a double fault evidently happens, Mach starts panicking, and 
> > the registers are dumped:
> > * RAX=4010DE
> > * RBX=0
> > * RCX=1
> > * RDX=0
> > * RSI=0
> > * RDI=0
> > * RBP=0
> > * RSP=0
> > * R8 to R12=0
> > * EFLAGS=4000CE
> > 
> > The error message is:
> > `trapno 0: Divide error, error 01402ff8'
> > `panic ../i386/i386/trap.c:677: handle_double_fault: DOUBLE FAULT! This is 
> > critical'
> 
> I can reproduce the issues, both with and without gdb; in particular, I see
> that there is a bug in decoding the registers after a double fault; Fixing
> that I see
> 
> RAX 000000000000003c RBX 0000000000000000
> RCX 00000000004000de RDX 0000000000000000
> RSI 00000000004010de RDI 0000000000000000
> RBP 0000000000400000 RSP 0000000000000000
> R8  0000000000001403 R9  0000000000000000
> R10 0000000000000000 R11 0000000000000000
> R12 0000000000000000 R13 0000000000000000
> R14 0000000000000000 R15 0000000000000000
> RIP ffffffff81012164 EFLAGS 00010102
> 
> where RIP seems to point the the syscall64 entry. It's also weird to have
> RSP=0 but that might be due to the bad state of the program being debugged.
> 
> GDB correctly prints errors related to signals, as there is no signal thread
> to handle them:
> 
> Thread 4 received signal ?, Unknown signal.
> _start () at program.S:11
> 11        mov $60, %rax
> warning: Signal ? does not exist on this system.
> warning: Can't deliver signal ?: No signal thread.
> 
> The signal seems caused by an invalid opcode exception after the second
> syscall, sent by the kernel and handled by GDB. From a kernel trace I
> collected it seems that the exception is sent twice, and it seems that
> somewhere after the second exception, when the program is resumed, the
> double fault happens. There might be an issue with restarting twice a task
> with an invalid state, if exceptions can be delivered; without GDB, the
> kernel terminates the task at the first error, as there is no exception port
> set.
> 
> > When not using GDB, the program is simply killed by the system and nothing 
> > bad seems to happen. I'm guessing Linux syscalls need not be the same as 
> > Mach syscalls, but a double fault from some faulty program shouldn't 
> > trigger a panic without even root privileges.
> 
> The kernel has no idea about unix users, AFAIK in userspace the difference
> is basically the access to some privileged mach ports, but this is
> implemented in glibc and the hurd servers.
> 
> 
> Luca
> 
> 

-- 
Samuel
We are Pentium of Borg. Division is futile. You will be approximated.
(seen in someone's .signature)

Reply via email to