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; |