Commit f3dcfadac7ecb89a44c1c91d6dc1858ab517d102
1 parent
fcdc2129
Implement -clock selection, by Luca Tettamanti.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3129 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
72 additions
and
0 deletions
vl.c
| ... | ... | @@ -835,6 +835,71 @@ static struct qemu_alarm_timer alarm_timers[] = { |
| 835 | 835 | {NULL, } |
| 836 | 836 | }; |
| 837 | 837 | |
| 838 | +static void show_available_alarms() | |
| 839 | +{ | |
| 840 | + int i; | |
| 841 | + | |
| 842 | + printf("Available alarm timers, in order of precedence:\n"); | |
| 843 | + for (i = 0; alarm_timers[i].name; i++) | |
| 844 | + printf("%s\n", alarm_timers[i].name); | |
| 845 | +} | |
| 846 | + | |
| 847 | +static void configure_alarms(char const *opt) | |
| 848 | +{ | |
| 849 | + int i; | |
| 850 | + int cur = 0; | |
| 851 | + int count = (sizeof(alarm_timers) / sizeof(*alarm_timers)) - 1; | |
| 852 | + char *arg; | |
| 853 | + char *name; | |
| 854 | + | |
| 855 | + if (!strcmp(opt, "help")) { | |
| 856 | + show_available_alarms(); | |
| 857 | + exit(0); | |
| 858 | + } | |
| 859 | + | |
| 860 | + arg = strdup(opt); | |
| 861 | + | |
| 862 | + /* Reorder the array */ | |
| 863 | + name = strtok(arg, ","); | |
| 864 | + while (name) { | |
| 865 | + struct qemu_alarm_timer tmp; | |
| 866 | + | |
| 867 | + for (i = 0; i < count; i++) { | |
| 868 | + if (!strcmp(alarm_timers[i].name, name)) | |
| 869 | + break; | |
| 870 | + } | |
| 871 | + | |
| 872 | + if (i == count) { | |
| 873 | + fprintf(stderr, "Unknown clock %s\n", name); | |
| 874 | + goto next; | |
| 875 | + } | |
| 876 | + | |
| 877 | + if (i < cur) | |
| 878 | + /* Ignore */ | |
| 879 | + goto next; | |
| 880 | + | |
| 881 | + /* Swap */ | |
| 882 | + tmp = alarm_timers[i]; | |
| 883 | + alarm_timers[i] = alarm_timers[cur]; | |
| 884 | + alarm_timers[cur] = tmp; | |
| 885 | + | |
| 886 | + cur++; | |
| 887 | +next: | |
| 888 | + name = strtok(NULL, ","); | |
| 889 | + } | |
| 890 | + | |
| 891 | + free(arg); | |
| 892 | + | |
| 893 | + if (cur) { | |
| 894 | + /* Disable remaining timers */ | |
| 895 | + for (i = cur; i < count; i++) | |
| 896 | + alarm_timers[i].name = NULL; | |
| 897 | + } | |
| 898 | + | |
| 899 | + /* debug */ | |
| 900 | + show_available_alarms(); | |
| 901 | +} | |
| 902 | + | |
| 838 | 903 | QEMUClock *rt_clock; |
| 839 | 904 | QEMUClock *vm_clock; |
| 840 | 905 | |
| ... | ... | @@ -6846,6 +6911,8 @@ static void help(int exitcode) |
| 6846 | 6911 | #ifdef TARGET_SPARC |
| 6847 | 6912 | "-prom-env variable=value set OpenBIOS nvram variables\n" |
| 6848 | 6913 | #endif |
| 6914 | + "-clock force the use of the given methods for timer alarm.\n" | |
| 6915 | + " To see what timers are available use -clock help\n" | |
| 6849 | 6916 | "\n" |
| 6850 | 6917 | "During emulation, the following keys are useful:\n" |
| 6851 | 6918 | "ctrl-alt-f toggle full screen\n" |
| ... | ... | @@ -6943,6 +7010,7 @@ enum { |
| 6943 | 7010 | QEMU_OPTION_name, |
| 6944 | 7011 | QEMU_OPTION_prom_env, |
| 6945 | 7012 | QEMU_OPTION_old_param, |
| 7013 | + QEMU_OPTION_clock, | |
| 6946 | 7014 | }; |
| 6947 | 7015 | |
| 6948 | 7016 | typedef struct QEMUOption { |
| ... | ... | @@ -7047,6 +7115,7 @@ const QEMUOption qemu_options[] = { |
| 7047 | 7115 | #if defined(TARGET_ARM) |
| 7048 | 7116 | { "old-param", 0, QEMU_OPTION_old_param }, |
| 7049 | 7117 | #endif |
| 7118 | + { "clock", HAS_ARG, QEMU_OPTION_clock }, | |
| 7050 | 7119 | { NULL }, |
| 7051 | 7120 | }; |
| 7052 | 7121 | |
| ... | ... | @@ -7826,6 +7895,9 @@ int main(int argc, char **argv) |
| 7826 | 7895 | case QEMU_OPTION_old_param: |
| 7827 | 7896 | old_param = 1; |
| 7828 | 7897 | #endif |
| 7898 | + case QEMU_OPTION_clock: | |
| 7899 | + configure_alarms(optarg); | |
| 7900 | + break; | |
| 7829 | 7901 | } |
| 7830 | 7902 | } |
| 7831 | 7903 | } | ... | ... |