aboutsummaryrefslogtreecommitdiff
path: root/vl.c
diff options
context:
space:
mode:
Diffstat (limited to 'vl.c')
-rw-r--r--vl.c123
1 files changed, 87 insertions, 36 deletions
diff --git a/vl.c b/vl.c
index 3d64188b68..484d4becc5 100644
--- a/vl.c
+++ b/vl.c
@@ -982,6 +982,12 @@ void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
va_end(ap);
}
+void qemu_chr_send_event(CharDriverState *s, int event)
+{
+ if (s->chr_send_event)
+ s->chr_send_event(s, event);
+}
+
void qemu_chr_add_read_handler(CharDriverState *s,
IOCanRWHandler *fd_can_read,
IOReadHandler *fd_read, void *opaque)
@@ -2179,7 +2185,7 @@ static void main_cpu_reset(void *opaque)
#endif
}
-int main_loop(void)
+void main_loop_wait(int timeout)
{
#ifndef _WIN32
struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
@@ -2187,39 +2193,12 @@ int main_loop(void)
uint8_t buf[4096];
int n, max_size;
#endif
- int ret, timeout;
- CPUState *env = global_env;
-
- for(;;) {
- if (vm_running) {
- ret = cpu_exec(env);
- if (shutdown_requested) {
- ret = EXCP_INTERRUPT;
- break;
- }
- if (reset_requested) {
- reset_requested = 0;
- qemu_system_reset();
- ret = EXCP_INTERRUPT;
- }
- if (ret == EXCP_DEBUG) {
- vm_stop(EXCP_DEBUG);
- }
- /* if hlt instruction, we wait until the next IRQ */
- /* XXX: use timeout computed from timers */
- if (ret == EXCP_HLT)
- timeout = 10;
- else
- timeout = 0;
- } else {
- timeout = 10;
- }
+ int ret;
#ifdef _WIN32
if (timeout > 0)
Sleep(timeout);
#else
-
/* poll any events */
/* XXX: separate device handlers from system ones */
pf = ufds;
@@ -2269,7 +2248,7 @@ int main_loop(void)
}
}
}
-
+#endif /* !defined(_WIN32) */
#if defined(CONFIG_SLIRP)
/* XXX: merge with poll() */
if (slirp_inited) {
@@ -2291,8 +2270,6 @@ int main_loop(void)
}
#endif
-#endif
-
if (vm_running) {
qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
qemu_get_clock(vm_clock));
@@ -2309,6 +2286,38 @@ int main_loop(void)
/* real time timers */
qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
qemu_get_clock(rt_clock));
+}
+
+int main_loop(void)
+{
+ int ret, timeout;
+ CPUState *env = global_env;
+
+ for(;;) {
+ if (vm_running) {
+ ret = cpu_exec(env);
+ if (shutdown_requested) {
+ ret = EXCP_INTERRUPT;
+ break;
+ }
+ if (reset_requested) {
+ reset_requested = 0;
+ qemu_system_reset();
+ ret = EXCP_INTERRUPT;
+ }
+ if (ret == EXCP_DEBUG) {
+ vm_stop(EXCP_DEBUG);
+ }
+ /* if hlt instruction, we wait until the next IRQ */
+ /* XXX: use timeout computed from timers */
+ if (ret == EXCP_HLT)
+ timeout = 10;
+ else
+ timeout = 0;
+ } else {
+ timeout = 10;
+ }
+ main_loop_wait(timeout);
}
cpu_disable_ticks();
return ret;
@@ -2509,6 +2518,43 @@ static uint8_t *signal_stack;
#endif
+/* password input */
+
+static BlockDriverState *get_bdrv(int index)
+{
+ BlockDriverState *bs;
+
+ if (index < 4) {
+ bs = bs_table[index];
+ } else if (index < 6) {
+ bs = fd_table[index - 4];
+ } else {
+ bs = NULL;
+ }
+ return bs;
+}
+
+static void read_passwords(void)
+{
+ BlockDriverState *bs;
+ int i, j;
+ char password[256];
+
+ for(i = 0; i < 6; i++) {
+ bs = get_bdrv(i);
+ if (bs && bdrv_is_encrypted(bs)) {
+ term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
+ for(j = 0; j < 3; j++) {
+ monitor_readline("Password: ",
+ 1, password, sizeof(password));
+ if (bdrv_set_key(bs, password) == 0)
+ break;
+ term_printf("invalid password\n");
+ }
+ }
+ }
+}
+
#define NET_IF_TUN 0
#define NET_IF_USER 1
#define NET_IF_DUMMY 2
@@ -2952,6 +2998,7 @@ int main(int argc, char **argv)
#endif
/* we always create the cdrom drive, even if no disk is there */
+ bdrv_init();
if (has_cdrom) {
bs_table[2] = bdrv_new("cdrom");
bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM);
@@ -2966,7 +3013,7 @@ int main(int argc, char **argv)
bs_table[i] = bdrv_new(buf);
}
if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
- fprintf(stderr, "qemu: could not open hard disk image '%s\n",
+ fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
hd_filename[i]);
exit(1);
}
@@ -3106,13 +3153,17 @@ int main(int argc, char **argv)
} else {
printf("Waiting gdb connection on port %d\n", gdbstub_port);
}
+ term_init();
} else
#endif
- if (start_emulation)
{
- vm_start();
+ term_init();
+ /* XXX: simplify init */
+ read_passwords();
+ if (start_emulation) {
+ vm_start();
+ }
}
- term_init();
main_loop();
quit_timers();
return 0;