Commit b1f9be3157368392b62d5c4213413d5adddd015b

Authored by j_mayer
1 parent 6c041c54

Add -cpu option for linux user emulation.

Only usable for PowerPC and ARM for now.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2496 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 23 additions and 11 deletions
linux-user/main.c
@@ -1537,13 +1537,14 @@ void cpu_loop(CPUM68KState *env) @@ -1537,13 +1537,14 @@ void cpu_loop(CPUM68KState *env)
1537 void usage(void) 1537 void usage(void)
1538 { 1538 {
1539 printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n" 1539 printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n"
1540 - "usage: qemu-" TARGET_ARCH " [-h] [-g] [-d opts] [-L path] [-s size] program [arguments...]\n" 1540 + "usage: qemu-" TARGET_ARCH " [-h] [-g] [-d opts] [-L path] [-s size] [-cpu model] program [arguments...]\n"
1541 "Linux CPU emulator (compiled for %s emulation)\n" 1541 "Linux CPU emulator (compiled for %s emulation)\n"
1542 "\n" 1542 "\n"
1543 "-h print this help\n" 1543 "-h print this help\n"
1544 "-g port wait gdb connection to port\n" 1544 "-g port wait gdb connection to port\n"
1545 "-L path set the elf interpreter prefix (default=%s)\n" 1545 "-L path set the elf interpreter prefix (default=%s)\n"
1546 "-s size set the stack size in bytes (default=%ld)\n" 1546 "-s size set the stack size in bytes (default=%ld)\n"
  1547 + "-cpu model select CPU (-cpu ? for list)\n"
1547 "\n" 1548 "\n"
1548 "debug options:\n" 1549 "debug options:\n"
1549 #ifdef USE_CODE_COPY 1550 #ifdef USE_CODE_COPY
@@ -1567,6 +1568,7 @@ TaskState *first_task_state; @@ -1567,6 +1568,7 @@ TaskState *first_task_state;
1567 int main(int argc, char **argv) 1568 int main(int argc, char **argv)
1568 { 1569 {
1569 const char *filename; 1570 const char *filename;
  1571 + const char *cpu_model;
1570 struct target_pt_regs regs1, *regs = &regs1; 1572 struct target_pt_regs regs1, *regs = &regs1;
1571 struct image_info info1, *info = &info1; 1573 struct image_info info1, *info = &info1;
1572 TaskState ts1, *ts = &ts1; 1574 TaskState ts1, *ts = &ts1;
@@ -1581,6 +1583,7 @@ int main(int argc, char **argv) @@ -1581,6 +1583,7 @@ int main(int argc, char **argv)
1581 /* init debug */ 1583 /* init debug */
1582 cpu_set_log_filename(DEBUG_LOGFILE); 1584 cpu_set_log_filename(DEBUG_LOGFILE);
1583 1585
  1586 + cpu_model = NULL;
1584 optind = 1; 1587 optind = 1;
1585 for(;;) { 1588 for(;;) {
1586 if (optind >= argc) 1589 if (optind >= argc)
@@ -1631,6 +1634,18 @@ int main(int argc, char **argv) @@ -1631,6 +1634,18 @@ int main(int argc, char **argv)
1631 gdbstub_port = atoi(argv[optind++]); 1634 gdbstub_port = atoi(argv[optind++]);
1632 } else if (!strcmp(r, "r")) { 1635 } else if (!strcmp(r, "r")) {
1633 qemu_uname_release = argv[optind++]; 1636 qemu_uname_release = argv[optind++];
  1637 + } else if (!strcmp(r, "cpu")) {
  1638 + cpu_model = argv[optind++];
  1639 + if (strcmp(cpu_model, "?") == 0) {
  1640 +#if defined(TARGET_PPC)
  1641 + ppc_cpu_list(stdout, &fprintf);
  1642 +#elif defined(TARGET_ARM)
  1643 + arm_cpu_list();
  1644 +#elif defined(TARGET_MIPS)
  1645 + mips_cpu_list(stdout, &fprintf);
  1646 +#endif
  1647 + exit(1);
  1648 + }
1634 } else 1649 } else
1635 #ifdef USE_CODE_COPY 1650 #ifdef USE_CODE_COPY
1636 if (!strcmp(r, "no-code-copy")) { 1651 if (!strcmp(r, "no-code-copy")) {
@@ -1756,7 +1771,9 @@ int main(int argc, char **argv) @@ -1756,7 +1771,9 @@ int main(int argc, char **argv)
1756 #elif defined(TARGET_ARM) 1771 #elif defined(TARGET_ARM)
1757 { 1772 {
1758 int i; 1773 int i;
1759 - cpu_arm_set_model(env, "arm926"); 1774 + if (cpu_model == NULL)
  1775 + cpu_model = "arm926";
  1776 + cpu_arm_set_model(env, cpu_model);
1760 cpsr_write(env, regs->uregs[16], 0xffffffff); 1777 cpsr_write(env, regs->uregs[16], 0xffffffff);
1761 for(i = 0; i < 16; i++) { 1778 for(i = 0; i < 16; i++) {
1762 env->regs[i] = regs->uregs[i]; 1779 env->regs[i] = regs->uregs[i];
@@ -1783,15 +1800,9 @@ int main(int argc, char **argv) @@ -1783,15 +1800,9 @@ int main(int argc, char **argv)
1783 int i; 1800 int i;
1784 1801
1785 /* Choose and initialise CPU */ 1802 /* Choose and initialise CPU */
1786 - /* XXX: CPU model (or PVR) should be provided on command line */  
1787 - // ppc_find_by_name("750gx", &def);  
1788 - // ppc_find_by_name("750fx", &def);  
1789 - // ppc_find_by_name("750p", &def);  
1790 - ppc_find_by_name("750", &def);  
1791 - // ppc_find_by_name("G3", &def);  
1792 - // ppc_find_by_name("604r", &def);  
1793 - // ppc_find_by_name("604e", &def);  
1794 - // ppc_find_by_name("604", &def); 1803 + if (cpu_model == NULL)
  1804 + cpu_model = "750";
  1805 + ppc_find_by_name(cpu_model, &def);
1795 if (def == NULL) { 1806 if (def == NULL) {
1796 cpu_abort(env, 1807 cpu_abort(env,
1797 "Unable to find PowerPC CPU definition\n"); 1808 "Unable to find PowerPC CPU definition\n");
@@ -1840,6 +1851,7 @@ int main(int argc, char **argv) @@ -1840,6 +1851,7 @@ int main(int argc, char **argv)
1840 { 1851 {
1841 int i; 1852 int i;
1842 1853
  1854 + /* XXX: set CPU model */
1843 for(i = 0; i < 32; i++) { 1855 for(i = 0; i < 32; i++) {
1844 env->gpr[i] = regs->regs[i]; 1856 env->gpr[i] = regs->regs[i];
1845 } 1857 }