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
This commit is contained in:
		
							parent
							
								
									979a54fb20
								
							
						
					
					
						commit
						bb0c6722b6
					
				
							
								
								
									
										78
									
								
								vl.c
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								vl.c
									
									
									
									
									
								
							@ -127,7 +127,7 @@ SerialState *serial_console;
 | 
				
			|||||||
QEMUTimer *gui_timer;
 | 
					QEMUTimer *gui_timer;
 | 
				
			||||||
int vm_running;
 | 
					int vm_running;
 | 
				
			||||||
int audio_enabled = 0;
 | 
					int audio_enabled = 0;
 | 
				
			||||||
int pci_enabled = 0;
 | 
					int pci_enabled = 1;
 | 
				
			||||||
int prep_enabled = 0;
 | 
					int prep_enabled = 0;
 | 
				
			||||||
int rtc_utc = 1;
 | 
					int rtc_utc = 1;
 | 
				
			||||||
int cirrus_vga_enabled = 0;
 | 
					int cirrus_vga_enabled = 0;
 | 
				
			||||||
@ -1819,6 +1819,62 @@ void vm_stop(int reason)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* reset/shutdown handler */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct QEMUResetEntry {
 | 
				
			||||||
 | 
					    QEMUResetHandler *func;
 | 
				
			||||||
 | 
					    void *opaque;
 | 
				
			||||||
 | 
					    struct QEMUResetEntry *next;
 | 
				
			||||||
 | 
					} QEMUResetEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static QEMUResetEntry *first_reset_entry;
 | 
				
			||||||
 | 
					static int reset_requested;
 | 
				
			||||||
 | 
					static int shutdown_requested;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qemu_register_reset(QEMUResetHandler *func, void *opaque)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QEMUResetEntry **pre, *re;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pre = &first_reset_entry;
 | 
				
			||||||
 | 
					    while (*pre != NULL)
 | 
				
			||||||
 | 
					        pre = &(*pre)->next;
 | 
				
			||||||
 | 
					    re = qemu_mallocz(sizeof(QEMUResetEntry));
 | 
				
			||||||
 | 
					    re->func = func;
 | 
				
			||||||
 | 
					    re->opaque = opaque;
 | 
				
			||||||
 | 
					    re->next = NULL;
 | 
				
			||||||
 | 
					    *pre = re;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qemu_system_reset(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QEMUResetEntry *re;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* reset all devices */
 | 
				
			||||||
 | 
					    for(re = first_reset_entry; re != NULL; re = re->next) {
 | 
				
			||||||
 | 
					        re->func(re->opaque);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qemu_system_reset_request(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    reset_requested = 1;
 | 
				
			||||||
 | 
					    cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qemu_system_shutdown_request(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    shutdown_requested = 1;
 | 
				
			||||||
 | 
					    cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void main_cpu_reset(void *opaque)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef TARGET_I386
 | 
				
			||||||
 | 
					    CPUState *env = opaque;
 | 
				
			||||||
 | 
					    cpu_reset(env);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main_loop(void)
 | 
					int main_loop(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef _WIN32
 | 
					#ifndef _WIN32
 | 
				
			||||||
@ -1833,10 +1889,15 @@ int main_loop(void)
 | 
				
			|||||||
    for(;;) {
 | 
					    for(;;) {
 | 
				
			||||||
        if (vm_running) {
 | 
					        if (vm_running) {
 | 
				
			||||||
            ret = cpu_exec(env);
 | 
					            ret = cpu_exec(env);
 | 
				
			||||||
            if (reset_requested) {
 | 
					            if (shutdown_requested) {
 | 
				
			||||||
                ret = EXCP_INTERRUPT; 
 | 
					                ret = EXCP_INTERRUPT; 
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (reset_requested) {
 | 
				
			||||||
 | 
					                reset_requested = 0;
 | 
				
			||||||
 | 
					                qemu_system_reset();
 | 
				
			||||||
 | 
					                ret = EXCP_INTERRUPT; 
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (ret == EXCP_DEBUG) {
 | 
					            if (ret == EXCP_DEBUG) {
 | 
				
			||||||
                vm_stop(EXCP_DEBUG);
 | 
					                vm_stop(EXCP_DEBUG);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -1967,6 +2028,9 @@ void help(void)
 | 
				
			|||||||
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
 | 
					           "-nographic      disable graphical output and redirect serial I/Os to console\n"
 | 
				
			||||||
           "-enable-audio   enable audio support\n"
 | 
					           "-enable-audio   enable audio support\n"
 | 
				
			||||||
           "-localtime      set the real time clock to local time [default=utc]\n"
 | 
					           "-localtime      set the real time clock to local time [default=utc]\n"
 | 
				
			||||||
 | 
					#ifdef TARGET_PPC
 | 
				
			||||||
 | 
					           "-prep           Simulate a PREP system (default is PowerMAC)\n"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
           "\n"
 | 
					           "\n"
 | 
				
			||||||
           "Network options:\n"
 | 
					           "Network options:\n"
 | 
				
			||||||
           "-nics n         simulate 'n' network cards [default=1]\n"
 | 
					           "-nics n         simulate 'n' network cards [default=1]\n"
 | 
				
			||||||
@ -1993,7 +2057,9 @@ void help(void)
 | 
				
			|||||||
#ifdef USE_CODE_COPY
 | 
					#ifdef USE_CODE_COPY
 | 
				
			||||||
           "-no-code-copy   disable code copy acceleration\n"
 | 
					           "-no-code-copy   disable code copy acceleration\n"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef TARGET_I386
 | 
				
			||||||
 | 
					           "-isa            simulate an ISA-only system (default is PCI system)\n"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
           "\n"
 | 
					           "\n"
 | 
				
			||||||
           "During emulation, use C-a h to get terminal commands:\n",
 | 
					           "During emulation, use C-a h to get terminal commands:\n",
 | 
				
			||||||
#ifdef CONFIG_SOFTMMU
 | 
					#ifdef CONFIG_SOFTMMU
 | 
				
			||||||
@ -2052,6 +2118,7 @@ enum {
 | 
				
			|||||||
    QEMU_OPTION_L,
 | 
					    QEMU_OPTION_L,
 | 
				
			||||||
    QEMU_OPTION_no_code_copy,
 | 
					    QEMU_OPTION_no_code_copy,
 | 
				
			||||||
    QEMU_OPTION_pci,
 | 
					    QEMU_OPTION_pci,
 | 
				
			||||||
 | 
					    QEMU_OPTION_isa,
 | 
				
			||||||
    QEMU_OPTION_prep,
 | 
					    QEMU_OPTION_prep,
 | 
				
			||||||
    QEMU_OPTION_localtime,
 | 
					    QEMU_OPTION_localtime,
 | 
				
			||||||
    QEMU_OPTION_cirrusvga,
 | 
					    QEMU_OPTION_cirrusvga,
 | 
				
			||||||
@ -2103,6 +2170,7 @@ const QEMUOption qemu_options[] = {
 | 
				
			|||||||
    { "prep", 0, QEMU_OPTION_prep },
 | 
					    { "prep", 0, QEMU_OPTION_prep },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    { "localtime", 0, QEMU_OPTION_localtime },
 | 
					    { "localtime", 0, QEMU_OPTION_localtime },
 | 
				
			||||||
 | 
					    { "isa", 0, QEMU_OPTION_isa },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* temporary options */
 | 
					    /* temporary options */
 | 
				
			||||||
    { "pci", 0, QEMU_OPTION_pci },
 | 
					    { "pci", 0, QEMU_OPTION_pci },
 | 
				
			||||||
@ -2380,6 +2448,9 @@ int main(int argc, char **argv)
 | 
				
			|||||||
            case QEMU_OPTION_pci:
 | 
					            case QEMU_OPTION_pci:
 | 
				
			||||||
                pci_enabled = 1;
 | 
					                pci_enabled = 1;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					            case QEMU_OPTION_isa:
 | 
				
			||||||
 | 
					                pci_enabled = 0;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            case QEMU_OPTION_prep:
 | 
					            case QEMU_OPTION_prep:
 | 
				
			||||||
                prep_enabled = 1;
 | 
					                prep_enabled = 1;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
@ -2562,6 +2633,7 @@ int main(int argc, char **argv)
 | 
				
			|||||||
    register_savevm("timer", 0, 1, timer_save, timer_load, env);
 | 
					    register_savevm("timer", 0, 1, timer_save, timer_load, env);
 | 
				
			||||||
    register_savevm("cpu", 0, 1, cpu_save, cpu_load, env);
 | 
					    register_savevm("cpu", 0, 1, cpu_save, cpu_load, env);
 | 
				
			||||||
    register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
 | 
					    register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
 | 
				
			||||||
 | 
					    qemu_register_reset(main_cpu_reset, global_env);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init_ioports();
 | 
					    init_ioports();
 | 
				
			||||||
    cpu_calibrate_ticks();
 | 
					    cpu_calibrate_ticks();
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vl.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								vl.h
									
									
									
									
									
								
							@ -205,8 +205,6 @@ static inline uint32_t le32_to_cpupu(const uint32_t *p)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* vl.c */
 | 
					/* vl.c */
 | 
				
			||||||
extern int reset_requested;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
 | 
					uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void hw_error(const char *fmt, ...);
 | 
					void hw_error(const char *fmt, ...);
 | 
				
			||||||
@ -229,6 +227,12 @@ void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
 | 
				
			|||||||
void vm_start(void);
 | 
					void vm_start(void);
 | 
				
			||||||
void vm_stop(int reason);
 | 
					void vm_stop(int reason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void QEMUResetHandler(void *opaque);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qemu_register_reset(QEMUResetHandler *func, void *opaque);
 | 
				
			||||||
 | 
					void qemu_system_reset_request(void);
 | 
				
			||||||
 | 
					void qemu_system_shutdown_request(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int audio_enabled;
 | 
					extern int audio_enabled;
 | 
				
			||||||
extern int ram_size;
 | 
					extern int ram_size;
 | 
				
			||||||
extern int bios_size;
 | 
					extern int bios_size;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user