Out of curiosity I wrote this program, which uses the syscalls of Linux and 
only should work on it:
 .section .text
 .global _start

 _start:
  mov $1, %rax
  mov $1, %rdi
  mov $MSG_Hello, %rsi
  mov $LEN_Hello, %rdx
  syscall

  mov $60, %rax
  mov $0, %rdi
  syscall

 .section .data
  MSG_Hello: .ascii "Hello, world!\n"
  .set LEN_Hello, . - MSG_Hello

I built the program and ran it like so:
 $ as -g program.S -o prorgam.o
 $ ld -g program.o -o program
 $ gdb program
 (gdb) break start
 (gdb) run
 (gdb) next 5

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'm using QEMU with these args:
`-M q35 -m 8G'

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.

* OS: Debian GNU/Hurd for x86_64, installed through the latest netinst CD
* Toolchain: GNU Binutils 2.43.1, GDB 13.2-1+hurd.3

"Kun nykyaikainen tietokone vahingossa hävittää kaiken, mitä olet kirjoittanut, 
mitä teet? Sisäistät vihan. Tunget sen sisällesi. [...] Kohtelet ongelman 
lähdettä kuin kuningasta." – Zach Weinersmith

Reply via email to