From: Gildas <gildas.ml@gmail.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] allow bootdevice change from the monitor
Date: Sun, 30 Mar 2008 09:32:31 +0200 [thread overview]
Message-ID: <b2ace7f20803300032j995bac3gd546003ecfe27610@mail.gmail.com> (raw)
In-Reply-To: <20080329002916.GA25367@hall.aurel32.net>
2008/3/29, Aurelien Jarno <aurelien@aurel32.net>:
> On Wed, Mar 26, 2008 at 02:12:25PM +0100, Gildas wrote:
> > This patch allows changing the boot device from within the monitor.
>
>
> I have just updated BOCHS BIOS from upstream CVS. The new version allows
> to select the boot device via a menu after the POST. I am therefore not
> sure anymore that your patch is still useful. What do you think?
Hi Aurelien,
I see the monitor as some kind of iLO/management interface and I think
the two approaches are somewhat orthogonal and have different use
cases, so I believe they should be both present:
- the boot menu after POST is user interactive
- the command in the monitor may be interactive but can also be
triggered by scripts (think automated installation such as FAI which
boot on pxe then on the local drive) or a management layer (think
libvirt).
Also I wanted the entry in the monitor menu to be hardware independant
so even if there is only x86 support for now it might be possible to
use a single approach to set the boot device for all archs (at least
the ones making use of the bootdevice parameter, such as sparc and
ppc).
Regards,
Gildas
> > Signed-off-by: Gildas Le Nadan <3ntr0p13@gmail.com>
> >
> > diff -Nur a/hw/pc.c b/hw/pc.c
> > --- a/hw/pc.c 2008-03-18 07:53:05.000000000 +0100
> > +++ b/hw/pc.c 2008-03-26 13:18:16.000000000 +0100
> > @@ -180,6 +180,33 @@
> > return 0;
> > }
> >
> > +/* copy/pasted from cmos_init, should be made a general function
> > + and used there as well */
> > +int pc_set_bootdevice(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) {
> > + fprintf(stderr, "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) {
> > + fprintf(stderr, "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(int ram_size, const char *boot_device,
> > BlockDriverState **hd_table)
> > {
> > @@ -717,6 +744,8 @@
> > BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
> > BlockDriverState *fd[MAX_FD];
> >
> > + set_bootdevice_fct = pc_set_bootdevice;
> > +
> > linux_boot = (kernel_filename != NULL);
> >
> > /* init CPUs */
> > diff -Nur a/monitor.c b/monitor.c
> > --- a/monitor.c 2008-02-10 17:33:13.000000000 +0100
> > +++ b/monitor.c 2008-03-26 13:17:56.000000000 +0100
> > @@ -993,6 +993,21 @@
> > suffix, addr, size * 2, val);
> > }
> >
> > +static void do_bootdevice_set(const char *bootdevice)
> > +{
> > + int res;
> > +
> > + if (set_bootdevice_fct != NULL) {
> > + res = set_bootdevice_fct(bootdevice);
> > + if (res == 0)
> > + term_printf("boot device list now set to %s\n", bootdevice);
> > + else
> > + term_printf("setting boot device list failed with error
> > %i\n", res);
> > + } else {
> > + term_printf("no function defined to set boot device list for
> > this architecture\n");
> > + }
> > +}
> > +
> > static void do_system_reset(void)
> > {
> > qemu_system_reset_request();
> > @@ -1328,6 +1343,8 @@
> > "capture index", "stop capture" },
> > { "memsave", "lis", do_memory_save,
> > "addr size file", "save to disk virtual memory dump starting at
> > 'addr' of size 'size'", },
> > + { "boot_set", "s", do_bootdevice_set,
> > + "bootdevice", "define new values for the boot device list" },
> > { NULL, NULL, },
> > };
> >
> > diff -Nur a/sysemu.h b/sysemu.h
> > --- a/sysemu.h 2008-03-18 07:53:05.000000000 +0100
> > +++ b/sysemu.h 2008-03-26 13:12:20.000000000 +0100
> > @@ -9,6 +9,11 @@
> > extern int vm_running;
> > extern const char *qemu_name;
> >
> > +/* handler to set the boot_device for a specific type of QEMUMachine */
> > +/* return 0 if success */
> > +typedef int QEMUMachineSetBootFunc(const char *boot_device);
> > +QEMUMachineSetBootFunc *set_bootdevice_fct;
> > +
> > typedef struct vm_change_state_entry VMChangeStateEntry;
> > typedef void VMChangeStateHandler(void *opaque, int running);
> > typedef void VMStopHandler(void *opaque, int reason);
> >
> >
> >
>
>
> --
> .''`. Aurelien Jarno | GPG: 1024D/F1BCDB73
> : :' : Debian developer | Electrical Engineer
> `. `' aurel32@debian.org | aurelien@aurel32.net
> `- people.debian.org/~aurel32 | www.aurel32.net
>
>
>
next prev parent reply other threads:[~2008-03-30 7:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-26 13:12 [Qemu-devel] [PATCH] allow bootdevice change from the monitor Gildas
2008-03-29 0:29 ` Aurelien Jarno
2008-03-30 7:32 ` Gildas [this message]
2008-04-08 20:54 ` Aurelien Jarno
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b2ace7f20803300032j995bac3gd546003ecfe27610@mail.gmail.com \
--to=gildas.ml@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).