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 | } | ... | ... |