Module Name: src Committed By: rin Date: Mon May 30 14:09:01 UTC 2022
Modified Files: src/sys/arch/evbppc/conf: std.explora src/sys/arch/powerpc/ibm4xx: trap.c Log Message: For IBM_PPC403, emulate unaligned memory access for userland process. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbppc/conf/std.explora cvs rdiff -u -r1.86 -r1.87 src/sys/arch/powerpc/ibm4xx/trap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbppc/conf/std.explora diff -u src/sys/arch/evbppc/conf/std.explora:1.9 src/sys/arch/evbppc/conf/std.explora:1.10 --- src/sys/arch/evbppc/conf/std.explora:1.9 Sat Jun 26 09:03:46 2021 +++ src/sys/arch/evbppc/conf/std.explora Mon May 30 14:09:01 2022 @@ -1,4 +1,4 @@ -# $NetBSD: std.explora,v 1.9 2021/06/26 09:03:46 rin Exp $ +# $NetBSD: std.explora,v 1.10 2022/05/30 14:09:01 rin Exp $ # # Standard/required options for NetBSD/explora. @@ -9,6 +9,9 @@ include "conf/std" # MI standard option options PPC_IBM4XX # IBM 40x family options PPC_IBM403 # IBM 403GCX +# 403 does not support unaligned memory access. +options PPC_NO_UNALIGNED + options VMSWAP_DEFAULT_PLAINTEXT # do not encrypt swap by # default (slow cpu) Index: src/sys/arch/powerpc/ibm4xx/trap.c diff -u src/sys/arch/powerpc/ibm4xx/trap.c:1.86 src/sys/arch/powerpc/ibm4xx/trap.c:1.87 --- src/sys/arch/powerpc/ibm4xx/trap.c:1.86 Sat Mar 6 08:08:19 2021 +++ src/sys/arch/powerpc/ibm4xx/trap.c Mon May 30 14:09:01 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.86 2021/03/06 08:08:19 rin Exp $ */ +/* $NetBSD: trap.c,v 1.87 2022/05/30 14:09:01 rin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -69,12 +69,13 @@ #define __UFETCHSTORE_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.86 2021/03/06 08:08:19 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.87 2022/05/30 14:09:01 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" #include "opt_kgdb.h" #include "opt_ppcarch.h" +#include "opt_ppcopts.h" #endif #include <sys/param.h> @@ -116,8 +117,6 @@ __KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.8 #define NARGREG 8 /* 8 args are in registers */ #define MOREARGS(sp) ((void *)((int)(sp) + 8)) /* more args go here */ -static int fix_unaligned(struct lwp *l, struct trapframe *tf); - void trap(struct trapframe *); /* Called from locore / trap_subr */ #if 0 /* Not currently used nor exposed externally in any header file */ @@ -126,6 +125,10 @@ int badaddr_read(void *, size_t, int *); #endif int ctx_setup(int, int); +#ifndef PPC_NO_UNALIGNED +static bool fix_unaligned(struct trapframe *, ksiginfo_t *); +#endif + #ifdef DEBUG #define TDB_ALL 0x1 int trapdebug = /* TDB_ALL */ 0; @@ -290,14 +293,8 @@ isi: break; case EXC_ALI|EXC_USER: - if (fix_unaligned(l, tf) != 0) { - KSI_INIT_TRAP(&ksi); - ksi.ksi_signo = SIGBUS; - ksi.ksi_trap = EXC_ALI; - ksi.ksi_addr = (void *)tf->tf_dear; + if (fix_unaligned(tf, &ksi)) trapsignal(l, &ksi); - } else - tf->tf_srr0 += 4; break; case EXC_PGM|EXC_USER: @@ -726,18 +723,18 @@ badaddr_read(void *addr, size_t size, in } #endif -/* - * For now, this only deals with the particular unaligned access case - * that gcc tends to generate. Eventually it should handle all of the - * possibilities that can happen on a 32-bit PowerPC in big-endian mode. - */ - -static int -fix_unaligned(struct lwp *l, struct trapframe *tf) +#ifndef PPC_NO_UNALIGNED +static bool +fix_unaligned(struct trapframe *tf, ksiginfo_t *ksi) { - return -1; + KSI_INIT_TRAP(ksi); + ksi->ksi_signo = SIGBUS; + ksi->ksi_trap = EXC_ALI; + ksi->ksi_addr = (void *)tf->tf_dear; + return true; } +#endif /* * XXX Extremely lame implementations of _ufetch_* / _ustore_*. IBM 4xx