Commit 6f1f31c069b20611f8df768bd4cc484a49624d62
1 parent
5467a722
ARM cache flush support (untested) - '-d' option fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@748 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
33 additions
and
4 deletions
linux-user/arm/syscall.h
linux-user/main.c
@@ -246,6 +246,27 @@ void cpu_loop(CPUX86State *env) | @@ -246,6 +246,27 @@ void cpu_loop(CPUX86State *env) | ||
246 | 246 | ||
247 | #ifdef TARGET_ARM | 247 | #ifdef TARGET_ARM |
248 | 248 | ||
249 | +/* XXX: find a better solution */ | ||
250 | +extern void tb_invalidate_page_range(target_ulong start, target_ulong end); | ||
251 | + | ||
252 | +static void arm_cache_flush(target_ulong start, target_ulong last) | ||
253 | +{ | ||
254 | + target_ulong addr, last1; | ||
255 | + | ||
256 | + if (last < start) | ||
257 | + return; | ||
258 | + addr = start; | ||
259 | + for(;;) { | ||
260 | + last1 = ((addr + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK) - 1; | ||
261 | + if (last1 > last) | ||
262 | + last1 = last; | ||
263 | + tb_invalidate_page_range(addr, last1 + 1); | ||
264 | + if (last1 == last) | ||
265 | + break; | ||
266 | + addr = last1 + 1; | ||
267 | + } | ||
268 | +} | ||
269 | + | ||
249 | void cpu_loop(CPUARMState *env) | 270 | void cpu_loop(CPUARMState *env) |
250 | { | 271 | { |
251 | int trapnr; | 272 | int trapnr; |
@@ -281,7 +302,9 @@ void cpu_loop(CPUARMState *env) | @@ -281,7 +302,9 @@ void cpu_loop(CPUARMState *env) | ||
281 | /* system call */ | 302 | /* system call */ |
282 | insn = ldl((void *)(env->regs[15] - 4)); | 303 | insn = ldl((void *)(env->regs[15] - 4)); |
283 | n = insn & 0xffffff; | 304 | n = insn & 0xffffff; |
284 | - if (n >= ARM_SYSCALL_BASE) { | 305 | + if (n == ARM_NR_cacheflush) { |
306 | + arm_cache_flush(env->regs[0], env->regs[1]); | ||
307 | + } else if (n >= ARM_SYSCALL_BASE) { | ||
285 | /* linux syscall */ | 308 | /* linux syscall */ |
286 | n -= ARM_SYSCALL_BASE; | 309 | n -= ARM_SYSCALL_BASE; |
287 | env->regs[0] = do_syscall(env, | 310 | env->regs[0] = do_syscall(env, |
@@ -792,7 +815,7 @@ void cpu_loop(CPUPPCState *env) | @@ -792,7 +815,7 @@ void cpu_loop(CPUPPCState *env) | ||
792 | void usage(void) | 815 | void usage(void) |
793 | { | 816 | { |
794 | printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n" | 817 | printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n" |
795 | - "usage: qemu-" TARGET_ARCH " [-h] [-d] [-L path] [-s size] program [arguments...]\n" | 818 | + "usage: qemu-" TARGET_ARCH " [-h] [-d opts] [-L path] [-s size] program [arguments...]\n" |
796 | "Linux CPU emulator (compiled for %s emulation)\n" | 819 | "Linux CPU emulator (compiled for %s emulation)\n" |
797 | "\n" | 820 | "\n" |
798 | "-h print this help\n" | 821 | "-h print this help\n" |
@@ -803,7 +826,7 @@ void usage(void) | @@ -803,7 +826,7 @@ void usage(void) | ||
803 | #ifdef USE_CODE_COPY | 826 | #ifdef USE_CODE_COPY |
804 | "-no-code-copy disable code copy acceleration\n" | 827 | "-no-code-copy disable code copy acceleration\n" |
805 | #endif | 828 | #endif |
806 | - "-d activate log (logfile=%s)\n" | 829 | + "-d options activate log (logfile=%s)\n" |
807 | "-p pagesize set the host page size to 'pagesize'\n", | 830 | "-p pagesize set the host page size to 'pagesize'\n", |
808 | TARGET_ARCH, | 831 | TARGET_ARCH, |
809 | interp_prefix, | 832 | interp_prefix, |
@@ -850,8 +873,12 @@ int main(int argc, char **argv) | @@ -850,8 +873,12 @@ int main(int argc, char **argv) | ||
850 | } else if (!strcmp(r, "d")) { | 873 | } else if (!strcmp(r, "d")) { |
851 | int mask; | 874 | int mask; |
852 | CPULogItem *item; | 875 | CPULogItem *item; |
876 | + | ||
877 | + if (optind >= argc) | ||
878 | + break; | ||
853 | 879 | ||
854 | - mask = cpu_str_to_log_mask(optarg); | 880 | + r = argv[optind++]; |
881 | + mask = cpu_str_to_log_mask(r); | ||
855 | if (!mask) { | 882 | if (!mask) { |
856 | printf("Log items (comma separated):\n"); | 883 | printf("Log items (comma separated):\n"); |
857 | for(item = cpu_log_items; item->mask != 0; item++) { | 884 | for(item = cpu_log_items; item->mask != 0; item++) { |