aboutsummaryrefslogtreecommitdiff
path: root/darwin-user/main.c
diff options
context:
space:
mode:
authorj_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-17 01:52:38 +0000
committerj_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-17 01:52:38 +0000
commit31fca6ab60f8ee8062bf59d54ba4d88832064ff1 (patch)
tree67e7c4a813a2baac2f3d5f3e2b5c7f434a26d4d7 /darwin-user/main.c
parentb172c56a6d849554f7e43adc95983a9d6c042689 (diff)
Resynchronize darwin-user target with linux-user:
add CPU selection feature, choose the correct default CPU and set the 32/64 bits computation mode properly. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3657 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'darwin-user/main.c')
-rw-r--r--darwin-user/main.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/darwin-user/main.c b/darwin-user/main.c
index bd8c1813f6..10b7fcb9a9 100644
--- a/darwin-user/main.c
+++ b/darwin-user/main.c
@@ -834,6 +834,15 @@ int main(int argc, char **argv)
} else
if (!strcmp(r, "g")) {
use_gdbstub = 1;
+ } else if (!strcmp(r, "cpu")) {
+ cpu_model = argv[optind++];
+ if (strcmp(cpu_model, "?") == 0) {
+/* XXX: implement xxx_cpu_list for targets that still miss it */
+#if defined(cpu_list)
+ cpu_list(stdout, &fprintf);
+#endif
+ _exit(1);
+ }
} else
{
usage();
@@ -846,16 +855,26 @@ int main(int argc, char **argv)
/* Zero out regs */
memset(regs, 0, sizeof(struct target_pt_regs));
- /* NOTE: we need to init the CPU at this stage to get
- qemu_host_page_size */
+ if (cpu_model == NULL) {
#if defined(TARGET_I386)
- cpu_model = "qemu32";
+#ifdef TARGET_X86_64
+ cpu_model = "qemu64";
+#else
+ cpu_model = "qemu32";
+#endif
#elif defined(TARGET_PPC)
- cpu_model = "750";
+#ifdef TARGET_PPC64
+ cpu_model = "970";
+#else
+ cpu_model = "750";
+#endif
#else
#error unsupported CPU
#endif
+ }
+ /* NOTE: we need to init the CPU at this stage to get
+ qemu_host_page_size */
env = cpu_init(cpu_model);
printf("Starting %s with qemu\n----------------\n", filename);
@@ -997,6 +1016,14 @@ int main(int argc, char **argv)
#elif defined(TARGET_PPC)
{
int i;
+
+#if defined(TARGET_PPC64)
+#if defined(TARGET_ABI32)
+ env->msr &= ~((target_ulong)1 << MSR_SF);
+#else
+ env->msr |= (target_ulong)1 << MSR_SF;
+#endif
+#endif
env->nip = regs->nip;
for(i = 0; i < 32; i++) {
env->gpr[i] = regs->gpr[i];