Commit bb0c6722b6606ad34da75d093d95a9bdfe42bc98
1 parent
979a54fb
reset and shutdown support - PCI is now the default
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@937 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
81 additions
and
5 deletions
vl.c
@@ -127,7 +127,7 @@ SerialState *serial_console; | @@ -127,7 +127,7 @@ SerialState *serial_console; | ||
127 | QEMUTimer *gui_timer; | 127 | QEMUTimer *gui_timer; |
128 | int vm_running; | 128 | int vm_running; |
129 | int audio_enabled = 0; | 129 | int audio_enabled = 0; |
130 | -int pci_enabled = 0; | 130 | +int pci_enabled = 1; |
131 | int prep_enabled = 0; | 131 | int prep_enabled = 0; |
132 | int rtc_utc = 1; | 132 | int rtc_utc = 1; |
133 | int cirrus_vga_enabled = 0; | 133 | int cirrus_vga_enabled = 0; |
@@ -1819,6 +1819,62 @@ void vm_stop(int reason) | @@ -1819,6 +1819,62 @@ void vm_stop(int reason) | ||
1819 | } | 1819 | } |
1820 | } | 1820 | } |
1821 | 1821 | ||
1822 | +/* reset/shutdown handler */ | ||
1823 | + | ||
1824 | +typedef struct QEMUResetEntry { | ||
1825 | + QEMUResetHandler *func; | ||
1826 | + void *opaque; | ||
1827 | + struct QEMUResetEntry *next; | ||
1828 | +} QEMUResetEntry; | ||
1829 | + | ||
1830 | +static QEMUResetEntry *first_reset_entry; | ||
1831 | +static int reset_requested; | ||
1832 | +static int shutdown_requested; | ||
1833 | + | ||
1834 | +void qemu_register_reset(QEMUResetHandler *func, void *opaque) | ||
1835 | +{ | ||
1836 | + QEMUResetEntry **pre, *re; | ||
1837 | + | ||
1838 | + pre = &first_reset_entry; | ||
1839 | + while (*pre != NULL) | ||
1840 | + pre = &(*pre)->next; | ||
1841 | + re = qemu_mallocz(sizeof(QEMUResetEntry)); | ||
1842 | + re->func = func; | ||
1843 | + re->opaque = opaque; | ||
1844 | + re->next = NULL; | ||
1845 | + *pre = re; | ||
1846 | +} | ||
1847 | + | ||
1848 | +void qemu_system_reset(void) | ||
1849 | +{ | ||
1850 | + QEMUResetEntry *re; | ||
1851 | + | ||
1852 | + /* reset all devices */ | ||
1853 | + for(re = first_reset_entry; re != NULL; re = re->next) { | ||
1854 | + re->func(re->opaque); | ||
1855 | + } | ||
1856 | +} | ||
1857 | + | ||
1858 | +void qemu_system_reset_request(void) | ||
1859 | +{ | ||
1860 | + reset_requested = 1; | ||
1861 | + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | ||
1862 | +} | ||
1863 | + | ||
1864 | +void qemu_system_shutdown_request(void) | ||
1865 | +{ | ||
1866 | + shutdown_requested = 1; | ||
1867 | + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | ||
1868 | +} | ||
1869 | + | ||
1870 | +static void main_cpu_reset(void *opaque) | ||
1871 | +{ | ||
1872 | +#ifdef TARGET_I386 | ||
1873 | + CPUState *env = opaque; | ||
1874 | + cpu_reset(env); | ||
1875 | +#endif | ||
1876 | +} | ||
1877 | + | ||
1822 | int main_loop(void) | 1878 | int main_loop(void) |
1823 | { | 1879 | { |
1824 | #ifndef _WIN32 | 1880 | #ifndef _WIN32 |
@@ -1833,10 +1889,15 @@ int main_loop(void) | @@ -1833,10 +1889,15 @@ int main_loop(void) | ||
1833 | for(;;) { | 1889 | for(;;) { |
1834 | if (vm_running) { | 1890 | if (vm_running) { |
1835 | ret = cpu_exec(env); | 1891 | ret = cpu_exec(env); |
1836 | - if (reset_requested) { | 1892 | + if (shutdown_requested) { |
1837 | ret = EXCP_INTERRUPT; | 1893 | ret = EXCP_INTERRUPT; |
1838 | break; | 1894 | break; |
1839 | } | 1895 | } |
1896 | + if (reset_requested) { | ||
1897 | + reset_requested = 0; | ||
1898 | + qemu_system_reset(); | ||
1899 | + ret = EXCP_INTERRUPT; | ||
1900 | + } | ||
1840 | if (ret == EXCP_DEBUG) { | 1901 | if (ret == EXCP_DEBUG) { |
1841 | vm_stop(EXCP_DEBUG); | 1902 | vm_stop(EXCP_DEBUG); |
1842 | } | 1903 | } |
@@ -1967,6 +2028,9 @@ void help(void) | @@ -1967,6 +2028,9 @@ void help(void) | ||
1967 | "-nographic disable graphical output and redirect serial I/Os to console\n" | 2028 | "-nographic disable graphical output and redirect serial I/Os to console\n" |
1968 | "-enable-audio enable audio support\n" | 2029 | "-enable-audio enable audio support\n" |
1969 | "-localtime set the real time clock to local time [default=utc]\n" | 2030 | "-localtime set the real time clock to local time [default=utc]\n" |
2031 | +#ifdef TARGET_PPC | ||
2032 | + "-prep Simulate a PREP system (default is PowerMAC)\n" | ||
2033 | +#endif | ||
1970 | "\n" | 2034 | "\n" |
1971 | "Network options:\n" | 2035 | "Network options:\n" |
1972 | "-nics n simulate 'n' network cards [default=1]\n" | 2036 | "-nics n simulate 'n' network cards [default=1]\n" |
@@ -1993,7 +2057,9 @@ void help(void) | @@ -1993,7 +2057,9 @@ void help(void) | ||
1993 | #ifdef USE_CODE_COPY | 2057 | #ifdef USE_CODE_COPY |
1994 | "-no-code-copy disable code copy acceleration\n" | 2058 | "-no-code-copy disable code copy acceleration\n" |
1995 | #endif | 2059 | #endif |
1996 | - | 2060 | +#ifdef TARGET_I386 |
2061 | + "-isa simulate an ISA-only system (default is PCI system)\n" | ||
2062 | +#endif | ||
1997 | "\n" | 2063 | "\n" |
1998 | "During emulation, use C-a h to get terminal commands:\n", | 2064 | "During emulation, use C-a h to get terminal commands:\n", |
1999 | #ifdef CONFIG_SOFTMMU | 2065 | #ifdef CONFIG_SOFTMMU |
@@ -2052,6 +2118,7 @@ enum { | @@ -2052,6 +2118,7 @@ enum { | ||
2052 | QEMU_OPTION_L, | 2118 | QEMU_OPTION_L, |
2053 | QEMU_OPTION_no_code_copy, | 2119 | QEMU_OPTION_no_code_copy, |
2054 | QEMU_OPTION_pci, | 2120 | QEMU_OPTION_pci, |
2121 | + QEMU_OPTION_isa, | ||
2055 | QEMU_OPTION_prep, | 2122 | QEMU_OPTION_prep, |
2056 | QEMU_OPTION_localtime, | 2123 | QEMU_OPTION_localtime, |
2057 | QEMU_OPTION_cirrusvga, | 2124 | QEMU_OPTION_cirrusvga, |
@@ -2103,6 +2170,7 @@ const QEMUOption qemu_options[] = { | @@ -2103,6 +2170,7 @@ const QEMUOption qemu_options[] = { | ||
2103 | { "prep", 0, QEMU_OPTION_prep }, | 2170 | { "prep", 0, QEMU_OPTION_prep }, |
2104 | #endif | 2171 | #endif |
2105 | { "localtime", 0, QEMU_OPTION_localtime }, | 2172 | { "localtime", 0, QEMU_OPTION_localtime }, |
2173 | + { "isa", 0, QEMU_OPTION_isa }, | ||
2106 | 2174 | ||
2107 | /* temporary options */ | 2175 | /* temporary options */ |
2108 | { "pci", 0, QEMU_OPTION_pci }, | 2176 | { "pci", 0, QEMU_OPTION_pci }, |
@@ -2380,6 +2448,9 @@ int main(int argc, char **argv) | @@ -2380,6 +2448,9 @@ int main(int argc, char **argv) | ||
2380 | case QEMU_OPTION_pci: | 2448 | case QEMU_OPTION_pci: |
2381 | pci_enabled = 1; | 2449 | pci_enabled = 1; |
2382 | break; | 2450 | break; |
2451 | + case QEMU_OPTION_isa: | ||
2452 | + pci_enabled = 0; | ||
2453 | + break; | ||
2383 | case QEMU_OPTION_prep: | 2454 | case QEMU_OPTION_prep: |
2384 | prep_enabled = 1; | 2455 | prep_enabled = 1; |
2385 | break; | 2456 | break; |
@@ -2562,6 +2633,7 @@ int main(int argc, char **argv) | @@ -2562,6 +2633,7 @@ int main(int argc, char **argv) | ||
2562 | register_savevm("timer", 0, 1, timer_save, timer_load, env); | 2633 | register_savevm("timer", 0, 1, timer_save, timer_load, env); |
2563 | register_savevm("cpu", 0, 1, cpu_save, cpu_load, env); | 2634 | register_savevm("cpu", 0, 1, cpu_save, cpu_load, env); |
2564 | register_savevm("ram", 0, 1, ram_save, ram_load, NULL); | 2635 | register_savevm("ram", 0, 1, ram_save, ram_load, NULL); |
2636 | + qemu_register_reset(main_cpu_reset, global_env); | ||
2565 | 2637 | ||
2566 | init_ioports(); | 2638 | init_ioports(); |
2567 | cpu_calibrate_ticks(); | 2639 | cpu_calibrate_ticks(); |
vl.h
@@ -205,8 +205,6 @@ static inline uint32_t le32_to_cpupu(const uint32_t *p) | @@ -205,8 +205,6 @@ static inline uint32_t le32_to_cpupu(const uint32_t *p) | ||
205 | #endif | 205 | #endif |
206 | 206 | ||
207 | /* vl.c */ | 207 | /* vl.c */ |
208 | -extern int reset_requested; | ||
209 | - | ||
210 | uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); | 208 | uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); |
211 | 209 | ||
212 | void hw_error(const char *fmt, ...); | 210 | void hw_error(const char *fmt, ...); |
@@ -229,6 +227,12 @@ void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque); | @@ -229,6 +227,12 @@ void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque); | ||
229 | void vm_start(void); | 227 | void vm_start(void); |
230 | void vm_stop(int reason); | 228 | void vm_stop(int reason); |
231 | 229 | ||
230 | +typedef void QEMUResetHandler(void *opaque); | ||
231 | + | ||
232 | +void qemu_register_reset(QEMUResetHandler *func, void *opaque); | ||
233 | +void qemu_system_reset_request(void); | ||
234 | +void qemu_system_shutdown_request(void); | ||
235 | + | ||
232 | extern int audio_enabled; | 236 | extern int audio_enabled; |
233 | extern int ram_size; | 237 | extern int ram_size; |
234 | extern int bios_size; | 238 | extern int bios_size; |