On Thu, Apr 11, 2013 at 04:51:46PM +0200, Igor Mammedov wrote:
> ... so that on reboot BIOS could read current available CPU count
>
> Signed-off-by: Igor Mammedov <[email protected]>
> v2:
> * s/qemu_register_cpu_add_notifier()/qemu_register_cpu_added_notifier()/
> ---
> hw/timer/mc146818rtc.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
Initialization of the cmos fields (including 0x5F) is done on
pc.c:pc_cmos_init(). What about making the field increment inside pc.c
as well?
What happens if a CPU is hotplugged after the machine has started but
before the guest OS has booted? Are we supposed to make sure the BIOS do
the right thing if a CPU is hotplugged before the OS has booted, or this
simply won't be supported?
>
> diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
> index 69e6844..958ed6b 100644
> --- a/hw/timer/mc146818rtc.c
> +++ b/hw/timer/mc146818rtc.c
> @@ -82,6 +82,7 @@ typedef struct RTCState {
> Notifier clock_reset_notifier;
> LostTickPolicy lost_tick_policy;
> Notifier suspend_notifier;
> + Notifier cpu_added_notifier;
> } RTCState;
>
> static void rtc_set_time(RTCState *s);
> @@ -759,6 +760,14 @@ static void rtc_notify_suspend(Notifier *notifier, void
> *data)
> rtc_set_memory(&s->dev, 0xF, 0xFE);
> }
>
> +static void rtc_notify_cpu_added(Notifier *notifier, void *data)
> +{
> + RTCState *s = container_of(notifier, RTCState, cpu_added_notifier);
> +
> + /* increment the number of CPUs */
> + s->cmos_data[0x5f] += 1;
> +}
> +
> static void rtc_reset(void *opaque)
> {
> RTCState *s = opaque;
> @@ -852,6 +861,9 @@ static int rtc_initfn(ISADevice *dev)
> s->suspend_notifier.notify = rtc_notify_suspend;
> qemu_register_suspend_notifier(&s->suspend_notifier);
>
> + s->cpu_added_notifier.notify = rtc_notify_cpu_added;
> + qemu_register_cpu_added_notifier(&s->cpu_added_notifier);
> +
> memory_region_init_io(&s->io, &cmos_ops, s, "rtc", 2);
> isa_register_ioport(dev, &s->io, base);
>
> --
> 1.8.2
>
--
Eduardo