Module Name: src Committed By: matt Date: Fri Aug 1 21:57:22 UTC 2014
Modified Files: src/sys/arch/powerpc/powerpc: fixup.c Log Message: Deal with the code LLVM generates for stubs. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/powerpc/powerpc/fixup.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/powerpc/powerpc/fixup.c diff -u src/sys/arch/powerpc/powerpc/fixup.c:1.8 src/sys/arch/powerpc/powerpc/fixup.c:1.9 --- src/sys/arch/powerpc/powerpc/fixup.c:1.8 Mon Mar 3 15:36:36 2014 +++ src/sys/arch/powerpc/powerpc/fixup.c Fri Aug 1 21:57:22 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: fixup.c,v 1.8 2014/03/03 15:36:36 macallan Exp $ */ +/* $NetBSD: fixup.c,v 1.9 2014/08/01 21:57:22 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fixup.c,v 1.8 2014/03/03 15:36:36 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fixup.c,v 1.9 2014/08/01 21:57:22 matt Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -144,6 +144,15 @@ powerpc_fixup_stubs(uint32_t *start, uin ctr = fixreg[rs]; break; } + case OPC31_OR: { +#ifdef DIAGNOSTIC + KASSERT(valid_mask & (1 << rs)); + KASSERT(valid_mask & (1 << rb)); +#endif + fixreg[ra] = fixreg[rs] | fixreg[rb]; + valid_mask |= 1 << ra; + break; + } default: panic("%s: %p: unexpected insn 0x%08x", __func__, stub, i.i_int); @@ -176,7 +185,7 @@ powerpc_fixup_stubs(uint32_t *start, uin break; } case OPC_STW: { - KASSERT(i.i_d.i_rs == r_lr && i.i_d.i_ra == 1); + KASSERT((i.i_d.i_rs == r_lr || i.i_d.i_rs == 31) && i.i_d.i_ra == 1); break; } case OPC_STWU: { @@ -195,6 +204,11 @@ powerpc_fixup_stubs(uint32_t *start, uin fixup.jfi_real = fixup_addr2offset(ctr); break; } + case OPC_RLWINM: { + // LLVM emits these for bool operands. + // Ignore them. + break; + } default: { panic("%s: %p: unexpected insn 0x%08x", __func__, stub, i.i_int);