Files
2021-07-31 16:02:33 +08:00

63 lines
951 B
Go

package kernel
import (
"unsafe"
"github.com/icexin/eggos/drivers/qemu"
"github.com/icexin/eggos/drivers/uart"
"github.com/icexin/eggos/kernel/sys"
"github.com/icexin/eggos/log"
)
var (
panicPcs [32]uintptr
)
//go:nosplit
func throw(msg string) {
sys.Cli()
tf := Mythread().tf
throwtf(tf, msg)
}
//go:nosplit
func throwtf(tf *trapFrame, msg string) {
sys.Cli()
n := callers(tf, panicPcs[:])
uart.WriteString(msg)
uart.WriteByte('\n')
log.PrintStr("0x")
log.PrintHex(tf.IP)
log.PrintStr("\n")
for i := 0; i < n; i++ {
log.PrintStr("0x")
log.PrintHex(panicPcs[i])
log.PrintStr("\n")
}
qemu.Exit(0xff)
for {
}
}
//go:nosplit
func callers(tf *trapFrame, pcs []uintptr) int {
fp := tf.BP
var i int
for i = 0; i < len(pcs); i++ {
pc := deref(fp + 8)
pcs[i] = pc
fp = deref(fp)
if fp == 0 {
break
}
}
return i
}
//go:nosplit
func deref(addr uintptr) uintptr {
return *(*uintptr)(unsafe.Pointer(addr))
}