summaryrefslogtreecommitdiff
path: root/hw/pc.c
diff options
context:
space:
mode:
authoraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-05-04 20:11:34 +0000
committeraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-05-04 20:11:34 +0000
commit0ecdffbb60a2723779a37fa17b717d919d670336 (patch)
tree17aff64cd35df25fee555574ee67af87c5e48ff2 /hw/pc.c
parent4001a81e8e1af1e4bda63baa404a8ebb4919d1f9 (diff)
downloadqemu-0ecdffbb60a2723779a37fa17b717d919d670336.zip
Allow bootdevice change from the monitor
(Gildas Le Nadan) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4333 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/pc.c')
-rw-r--r--hw/pc.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/hw/pc.c b/hw/pc.c
index 5d5a764bb2..265ced4809 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -189,6 +189,33 @@ static int boot_device2nibble(char boot_device)
return 0;
}
+/* copy/pasted from cmos_init, should be made a general function
+ and used there as well */
+int pc_boot_set(const char *boot_device)
+{
+#define PC_MAX_BOOT_DEVICES 3
+ RTCState *s = rtc_state;
+ int nbds, bds[3] = { 0, };
+ int i;
+
+ nbds = strlen(boot_device);
+ if (nbds > PC_MAX_BOOT_DEVICES) {
+ term_printf("Too many boot devices for PC\n");
+ return(1);
+ }
+ for (i = 0; i < nbds; i++) {
+ bds[i] = boot_device2nibble(boot_device[i]);
+ if (bds[i] == 0) {
+ term_printf("Invalid boot device for PC: '%c'\n",
+ boot_device[i]);
+ return(1);
+ }
+ }
+ rtc_set_memory(s, 0x3d, (bds[1] << 4) | bds[0]);
+ rtc_set_memory(s, 0x38, (bds[2] << 4));
+ return(0);
+}
+
/* hd_table must contain 4 block drivers */
static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
const char *boot_device, BlockDriverState **hd_table)
@@ -713,6 +740,8 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
below_4g_mem_size = ram_size;
}
+ qemu_register_boot_set(pc_boot_set);
+
linux_boot = (kernel_filename != NULL);
/* init CPUs */