Patchwork Help - `flush_icache_range' MacPPC

login
register
mail settings
Submitter Alexander Graf
Date Feb. 7, 2012, 10:56 p.m.
Message ID <02FE9DED-0602-44C9-AA0C-A9436DF03043@suse.de>
Download mbox | patch
Permalink /patch/140030/
State New
Headers show

Comments

Alexander Graf - Feb. 7, 2012, 10:56 p.m.
On 07.02.2012, at 23:29, Brad Smith wrote:

> On 07/02/12 5:12 PM, malc wrote:
>> On Tue, 7 Feb 2012, Alexander Graf wrote:
>> 
>>> 
>>> On 07.02.2012, at 22:12, malc wrote:
>>> 
>>>> On Tue, 7 Feb 2012, Alexander Graf wrote:
>>>> 
>>>>> 
>>>>> On 07.02.2012, at 13:52, Maurizio Caloro wrote:
>>>>> 
>>>>>> Hello Together
>>>>>> Here i drive with me MiniMac G4 1.4Ghz and i try to run Qemu 1.0. i wan't run one Virt. MS Server2008 it's this realistic?.
>>>>>> 
>>>>>> Unfortunitly from the first (other) Mailinglist i don't become any Answer.
>>>>>> 
>>>>>> on a possible error recovery support, I would grateful to you.
>>>>>> Thanks and best regards
>>>>>> Mauri
>>>>>> 
>>>>>>> NetBSD powermac.G4 5.1 NetBSD 5.1 (GENERIC) #0: Sat Nov  6 17:09:11 UTC>2010  builds@b7.netbsd.org:/home/builds/ab/netbsd-5-1->RELEASE/macppc/201011061943Z-obj/home/builds/ab/netbsd-5-1->RELEASE/src/sys/arch/macppc/compile/GENERIC macppc
>>>>>>> 
>>>>>>> # gmake
>>>>>>> CC    i386-softmmu/memory.o
>>>>>>> LINK  i386-softmmu/qemu-system-i386
>>>>>>> ld: warning: libintl.so.0, needed by /usr/pkg/lib/libgthread-2.0.so, may conflict with libintl.so.8
>>>>>>> tcg/tcg.o: In function `tcg_prologue_init':
>>>>>>> /usr/source/qemu-1.0/tcg/tcg.c:268: undefined reference to `flush_icache_range'
>>>>>>> tcg/tcg.o: In function `ppc_tb_set_jmp_target':
>>>>>>> /usr/source/qemu-1.0/tcg/ppc/tcg-target.c:1291: undefined reference to `flush_icache_range'
>>>>>>> tcg/tcg.o: In function `tcg_gen_code':
>>>>>>> /usr/source/qemu-1.0/tcg/tcg.c:2191: undefined reference to `flush_icache_range'
>>>>> 
>>>>> I'd say your gcc is too old / buggy.
>>>> 
>>>> You probably missed the NetBSD part (anyway originally i did)
>>> 
>>> Gcc on NetBSD doesn't implement the cache flush helpers? They're just a
>>> bunch of instructions, so I don't see how that'd be target os specific.
>>> 
>> 
>> Take a look at cache-utils.c, it conditionally (depending on the host OS
>> type) tries to gigure out the cache line sizes, there's code to do that
>> on Linux, OSX, AIX and FreeBSD. I have no idea if FreeBSD method works
>> for Net/Open/Dragonfly.. so..
> 
> The FreeBSD method will not work with NetBSD. For NetBSD you have to use
> the machdep.cacheinfo sysctl MIB. For OpenBSD this is the only local patch
> we have since there is no sysctl (yet) to retrieve the cache line size.
> DragonFly has no PowerPC support.

Does this patch make it work for you?

Patch

diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c
index f5d9bf3..f55af96 100644
--- a/tcg/ppc/tcg-target.c
+++ b/tcg/ppc/tcg-target.c
@@ -1260,6 +1260,17 @@  static void tcg_out_brcond2 (TCGContext *s, const TCGArg *args,
     tcg_out_bc (s, (BC | BI (7, CR_EQ) | BO_COND_TRUE), args[5]);
 }
 
+#ifdef __NetBSD__
+static void flush_icache_range(unsigned long begin, unsigned long end)
+{
+    unsigned int i = begin & ~15UL;
+    for (; i < end; i++) {
+        asm("icbi 0,%0" : : "r"(i));
+    }
+    asm("isync");
+}
+#endif
+
 void ppc_tb_set_jmp_target (unsigned long jmp_addr, unsigned long addr)
 {
     uint32_t *ptr;