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 | 127 | QEMUTimer *gui_timer; |
| 128 | 128 | int vm_running; |
| 129 | 129 | int audio_enabled = 0; |
| 130 | -int pci_enabled = 0; | |
| 130 | +int pci_enabled = 1; | |
| 131 | 131 | int prep_enabled = 0; |
| 132 | 132 | int rtc_utc = 1; |
| 133 | 133 | int cirrus_vga_enabled = 0; |
| ... | ... | @@ -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 | 1878 | int main_loop(void) |
| 1823 | 1879 | { |
| 1824 | 1880 | #ifndef _WIN32 |
| ... | ... | @@ -1833,10 +1889,15 @@ int main_loop(void) |
| 1833 | 1889 | for(;;) { |
| 1834 | 1890 | if (vm_running) { |
| 1835 | 1891 | ret = cpu_exec(env); |
| 1836 | - if (reset_requested) { | |
| 1892 | + if (shutdown_requested) { | |
| 1837 | 1893 | ret = EXCP_INTERRUPT; |
| 1838 | 1894 | break; |
| 1839 | 1895 | } |
| 1896 | + if (reset_requested) { | |
| 1897 | + reset_requested = 0; | |
| 1898 | + qemu_system_reset(); | |
| 1899 | + ret = EXCP_INTERRUPT; | |
| 1900 | + } | |
| 1840 | 1901 | if (ret == EXCP_DEBUG) { |
| 1841 | 1902 | vm_stop(EXCP_DEBUG); |
| 1842 | 1903 | } |
| ... | ... | @@ -1967,6 +2028,9 @@ void help(void) |
| 1967 | 2028 | "-nographic disable graphical output and redirect serial I/Os to console\n" |
| 1968 | 2029 | "-enable-audio enable audio support\n" |
| 1969 | 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 | 2034 | "\n" |
| 1971 | 2035 | "Network options:\n" |
| 1972 | 2036 | "-nics n simulate 'n' network cards [default=1]\n" |
| ... | ... | @@ -1993,7 +2057,9 @@ void help(void) |
| 1993 | 2057 | #ifdef USE_CODE_COPY |
| 1994 | 2058 | "-no-code-copy disable code copy acceleration\n" |
| 1995 | 2059 | #endif |
| 1996 | - | |
| 2060 | +#ifdef TARGET_I386 | |
| 2061 | + "-isa simulate an ISA-only system (default is PCI system)\n" | |
| 2062 | +#endif | |
| 1997 | 2063 | "\n" |
| 1998 | 2064 | "During emulation, use C-a h to get terminal commands:\n", |
| 1999 | 2065 | #ifdef CONFIG_SOFTMMU |
| ... | ... | @@ -2052,6 +2118,7 @@ enum { |
| 2052 | 2118 | QEMU_OPTION_L, |
| 2053 | 2119 | QEMU_OPTION_no_code_copy, |
| 2054 | 2120 | QEMU_OPTION_pci, |
| 2121 | + QEMU_OPTION_isa, | |
| 2055 | 2122 | QEMU_OPTION_prep, |
| 2056 | 2123 | QEMU_OPTION_localtime, |
| 2057 | 2124 | QEMU_OPTION_cirrusvga, |
| ... | ... | @@ -2103,6 +2170,7 @@ const QEMUOption qemu_options[] = { |
| 2103 | 2170 | { "prep", 0, QEMU_OPTION_prep }, |
| 2104 | 2171 | #endif |
| 2105 | 2172 | { "localtime", 0, QEMU_OPTION_localtime }, |
| 2173 | + { "isa", 0, QEMU_OPTION_isa }, | |
| 2106 | 2174 | |
| 2107 | 2175 | /* temporary options */ |
| 2108 | 2176 | { "pci", 0, QEMU_OPTION_pci }, |
| ... | ... | @@ -2380,6 +2448,9 @@ int main(int argc, char **argv) |
| 2380 | 2448 | case QEMU_OPTION_pci: |
| 2381 | 2449 | pci_enabled = 1; |
| 2382 | 2450 | break; |
| 2451 | + case QEMU_OPTION_isa: | |
| 2452 | + pci_enabled = 0; | |
| 2453 | + break; | |
| 2383 | 2454 | case QEMU_OPTION_prep: |
| 2384 | 2455 | prep_enabled = 1; |
| 2385 | 2456 | break; |
| ... | ... | @@ -2562,6 +2633,7 @@ int main(int argc, char **argv) |
| 2562 | 2633 | register_savevm("timer", 0, 1, timer_save, timer_load, env); |
| 2563 | 2634 | register_savevm("cpu", 0, 1, cpu_save, cpu_load, env); |
| 2564 | 2635 | register_savevm("ram", 0, 1, ram_save, ram_load, NULL); |
| 2636 | + qemu_register_reset(main_cpu_reset, global_env); | |
| 2565 | 2637 | |
| 2566 | 2638 | init_ioports(); |
| 2567 | 2639 | cpu_calibrate_ticks(); | ... | ... |
vl.h
| ... | ... | @@ -205,8 +205,6 @@ static inline uint32_t le32_to_cpupu(const uint32_t *p) |
| 205 | 205 | #endif |
| 206 | 206 | |
| 207 | 207 | /* vl.c */ |
| 208 | -extern int reset_requested; | |
| 209 | - | |
| 210 | 208 | uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); |
| 211 | 209 | |
| 212 | 210 | void hw_error(const char *fmt, ...); |
| ... | ... | @@ -229,6 +227,12 @@ void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque); |
| 229 | 227 | void vm_start(void); |
| 230 | 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 | 236 | extern int audio_enabled; |
| 233 | 237 | extern int ram_size; |
| 234 | 238 | extern int bios_size; | ... | ... |