From e45a6695ee8060924cf41f70b707690174a0b929 Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Sat, 24 Aug 2013 20:54:30 +0000 Subject: Make sure do_xmem_* return the correct value. This fixes usage of fork() in programs linked against libpthread on 88100 processors, where the parent thread issueing fork() would spin. Interestingly enough, this bug is not found in Mach, but has been introduced by Nivas when porting to mvme88k, 18 years ago. DAE involving xmem are rare enough for the issue to have survived so long (and once again, it was a nightmare to track down). --- sys/arch/m88k/m88k/m88100_machdep.c | 10 +++++++--- sys/arch/m88k/m88k/subr.S | 28 +++++++++++++++------------- 2 files changed, 22 insertions(+), 16 deletions(-) (limited to 'sys') diff --git a/sys/arch/m88k/m88k/m88100_machdep.c b/sys/arch/m88k/m88k/m88100_machdep.c index 9abb9426686..55ed78ad7a4 100644 --- a/sys/arch/m88k/m88k/m88100_machdep.c +++ b/sys/arch/m88k/m88k/m88100_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m88100_machdep.c,v 1.10 2013/08/18 22:17:26 miod Exp $ */ +/* $OpenBSD: m88100_machdep.c,v 1.11 2013/08/24 20:54:29 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University @@ -283,6 +283,12 @@ dae_process(struct trapframe *eframe, u_int x, } else { v = do_xmem_byte(dmax, dmdx, dmtx & DMT_DAS); } + DAE_DEBUG( + if (reg == 0) + printf("[no write to r0 done]\n"); + else + printf("[r%d <- %08x]\n", reg, v); + ); if (reg != 0) eframe->tf_r[reg] = v; } else { @@ -325,8 +331,6 @@ m88100_apply_patches() ((u_int32_t *)(do_store_word))[1] = 0xf400c401; ((u_int32_t *)(do_store_half))[1] = 0xf400c401; ((u_int32_t *)(do_store_byte))[1] = 0xf400c401; - ((u_int32_t *)(do_xmem_word))[1] = 0xf400c401; - ((u_int32_t *)(do_xmem_byte))[1] = 0xf400c401; } #endif } diff --git a/sys/arch/m88k/m88k/subr.S b/sys/arch/m88k/m88k/subr.S index 5f38494651f..f87dcdaa035 100644 --- a/sys/arch/m88k/m88k/subr.S +++ b/sys/arch/m88k/m88k/subr.S @@ -1,4 +1,4 @@ -/* $OpenBSD: subr.S,v 1.22 2013/01/11 22:34:43 miod Exp $ */ +/* $OpenBSD: subr.S,v 1.23 2013/08/24 20:54:29 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1992 Carnegie Mellon University @@ -151,33 +151,35 @@ ENTRY(do_xmem_word) /* do_xmem_word(address, data, supervisor) */ bcnd ne0,%r4,1f #ifdef ERRATA__XXX_USR NOP +#endif xmem.usr %r3,%r2,%r0 +#ifdef ERRATA__XXX_USR NOP NOP NOP - jmp %r1 -#else - jmp.n %r1 - xmem.usr %r3,%r2,%r0 #endif -1: jmp.n %r1 - xmem %r3,%r2,%r0 + jmp.n %r1 + or %r2, %r3, %r0 +1: xmem %r3,%r2,%r0 + jmp.n %r1 + or %r2, %r3, %r0 ENTRY(do_xmem_byte) /* do_xmem_byte(address, data, supervisor) */ bcnd ne0,%r4,1f #ifdef ERRATA__XXX_USR NOP +#endif xmem.bu.usr %r3,%r2,%r0 +#ifdef ERRATA__XXX_USR NOP NOP NOP - jmp %r1 -#else - jmp.n %r1 - xmem.bu.usr %r3,%r2,%r0 #endif -1: jmp.n %r1 - xmem.bu %r3,%r2,%r0 + jmp.n %r1 + or %r2,%r3,%r0 +1: xmem.bu %r3,%r2,%r0 + jmp.n %r1 + or %r2,%r3,%r0 #endif /* M88100 */ -- cgit v1.2.3