summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authorjhibbits <jhibbits@FreeBSD.org>2016-04-25 03:01:57 +0000
committerjhibbits <jhibbits@FreeBSD.org>2016-04-25 03:01:57 +0000
commite6cff0f7c1fdd2477ed9984e37db89ae6c77a461 (patch)
treeb1fa427e7760ab5e95db931c9d6a0587ee445911 /sys/powerpc
parent66299e89cd201228e08b392baba18257449443cf (diff)
downloadFreeBSD-src-e6cff0f7c1fdd2477ed9984e37db89ae6c77a461.zip
FreeBSD-src-e6cff0f7c1fdd2477ed9984e37db89ae6c77a461.tar.gz
OR in the unsigned form of the MCAR lower register.
When ORing in a register_t to a wider integer (vm_paddr_t), it gets sign extended, so high addresses overwrite the upper word with all 0xf. Cast to the unsigned form (u_register_t), to avoid this problem, and get correct addresses printed.
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/powerpc/trap.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/powerpc/powerpc/trap.c b/sys/powerpc/powerpc/trap.c
index 62d91a6..d186051 100644
--- a/sys/powerpc/powerpc/trap.c
+++ b/sys/powerpc/powerpc/trap.c
@@ -434,7 +434,7 @@ printtrap(u_int vector, struct trapframe *frame, int isfatal, int user)
(u_long)mfspr(SPR_MSSSR0));
#elif defined(BOOKE)
pa = mfspr(SPR_MCARU);
- pa = (pa << 32) | mfspr(SPR_MCAR);
+ pa = (pa << 32) | (u_register_t)mfspr(SPR_MCAR);
printf(" mcsr = 0x%lx\n", (u_long)mfspr(SPR_MCSR));
printf(" mcar = 0x%jx\n", (uintmax_t)pa);
#endif
OpenPOWER on IntegriCloud