|
From: | BALATON Zoltan |
Subject: | Re: [Qemu-ppc] [PATCH] mac99: Bring memory layout closer to real hardware |
Date: | Thu, 17 Apr 2014 00:44:10 +0200 (CEST) |
User-agent: | Alpine 2.02 (LMD 1266 2009-07-14) |
On Wed, 16 Apr 2014, Alexander Graf wrote:
On 16.04.14 12:24, BALATON Zoltan wrote:On Tue, 15 Apr 2014, Alexander Graf wrote:Try to do the same with the _E macro. Be creative :)This one did it: diff --git a/target-ppc/translate.c b/target-ppc/translate.c index e3fcb03..d1e175e 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c@@ -10341,7 +10341,7 @@ GEN_HANDLER(stop##u, opc, 0xFF, 0xFF, 0x00000000, type), #define GEN_STUX(name, stop, opc2, opc3, type) \GEN_HANDLER(name##ux, 0x1F, opc2, opc3, 0x00000001, type),#define GEN_STX_E(name, stop, opc2, opc3, type, type2) \-GEN_HANDLER_E(name##x, 0x1F, opc2, opc3, 0x00000001, type, type2), +GEN_HANDLER_E(name##x, 0x1F, opc2, opc3, 0x00000000, type, type2),#define GEN_STS(name, stop, op, type) \ GEN_ST(name, stop, op | 0x20, type) \ GEN_STU(name, stop, op | 0x21, type) \Cool. Could you please write a small program similar to the one I sent you that runs all of these instructions and checks that really none of them trigger a program interrupt on real hardware? We can then remove the reserved 1 bit from the mask.
Would something like this work? (You should be able to change the instruction to test at the 1: label.) I can't test it though without a PPC machine.
#include <stdio.h> int main(int argc, char **argv) { register unsigned long r8 asm("r8"); register unsigned long r9 asm("r9"); register unsigned long r10 asm("r10"); register unsigned long r11 asm("r11"); register unsigned long r12 asm("r12"); long val = 0; r8 = 0; r9 = (long)&val; r10 = 0; asm volatile("mfcr 8 \n\t" "bl 1f \n\t" "mfcr 11 \n\t" "mflr 0 \n\t" "lwz 8, 36(0) \n\t" "ori 8, 8, 1 \n\t" "stw 8, 36(0) \n\t" "mfcr 8 \n\t" "bl 1f \n\t" "mfcr 12 \n\t" "b 2f \n\t" "1: stwx 8, 9, 10 \n\t" "blr \n\t" "2: \n\t" : "=r"(r8), "=r"(r11), "=r"(r12) : "r"(r8), "r"(r9), "r"(r10) : "cc"); printf("old cr (mem):\t%#lx\n", val); printf("old cr (reg):\t%#lx\n", r8); printf("new cr1 (reg):\t%#lx\n", r11); printf("new cr2 (reg):\t%#lx\n", r12); return 0; } Regards, BALATON Zoltan
[Prev in Thread] | Current Thread | [Next in Thread] |