| 1 | # HG changeset patch | 
|---|
| 2 | # User kfraser@localhost.localdomain | 
|---|
| 3 | # Node ID 71e2a165aa7f81602c569430b18ba1ea705f0b70 | 
|---|
| 4 | # Parent  da66691687dfd90c55420cfdf27f55d18cca7810 | 
|---|
| 5 | [HVM] Move RTC emulation into the hypervisor. | 
|---|
| 6 | Signed-off-by: Xiaowei Yang <xiaowei.yang@intel.com> | 
|---|
| 7 |  | 
|---|
| 8 | Index: ioemu/Makefile.target | 
|---|
| 9 | =================================================================== | 
|---|
| 10 | --- ioemu.orig/Makefile.target  2006-12-08 01:41:15.000000000 +0000 | 
|---|
| 11 | +++ ioemu/Makefile.target       2006-12-08 01:41:15.000000000 +0000 | 
|---|
| 12 | @@ -295,7 +295,11 @@ | 
|---|
| 13 | endif | 
|---|
| 14 |  | 
|---|
| 15 | # qemu-dm objects | 
|---|
| 16 | +ifeq ($(ARCH),ia64) | 
|---|
| 17 | LIBOBJS=helper2.o exec-dm.o i8259-dm.o | 
|---|
| 18 | +else | 
|---|
| 19 | +LIBOBJS=helper2.o exec-dm.o i8259-dm.o rtc-dm.o | 
|---|
| 20 | +endif | 
|---|
| 21 |  | 
|---|
| 22 | all: $(PROGS) | 
|---|
| 23 |  | 
|---|
| 24 | @@ -355,7 +359,11 @@ | 
|---|
| 25 | ifeq ($(TARGET_BASE_ARCH), i386) | 
|---|
| 26 | # Hardware support | 
|---|
| 27 | VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV) | 
|---|
| 28 | +ifeq ($(ARCH),ia64) | 
|---|
| 29 | VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o | 
|---|
| 30 | +else | 
|---|
| 31 | +VL_OBJS+= fdc.o serial.o pc.o | 
|---|
| 32 | +endif | 
|---|
| 33 | VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o | 
|---|
| 34 | VL_OBJS+= usb-uhci.o | 
|---|
| 35 | VL_OBJS+= piix4acpi.o | 
|---|
| 36 | Index: ioemu/target-i386-dm/rtc-dm.c | 
|---|
| 37 | =================================================================== | 
|---|
| 38 | --- /dev/null   1970-01-01 00:00:00.000000000 +0000 | 
|---|
| 39 | +++ ioemu/target-i386-dm/rtc-dm.c       2006-12-08 01:41:15.000000000 +0000 | 
|---|
| 40 | @@ -0,0 +1,107 @@ | 
|---|
| 41 | +/* | 
|---|
| 42 | + * QEMU MC146818 RTC emulation | 
|---|
| 43 | + * | 
|---|
| 44 | + * Copyright (c) 2003-2004 Fabrice Bellard | 
|---|
| 45 | + * | 
|---|
| 46 | + * Permission is hereby granted, free of charge, to any person obtaining a copy | 
|---|
| 47 | + * of this software and associated documentation files (the "Software"), to deal | 
|---|
| 48 | + * in the Software without restriction, including without limitation the rights | 
|---|
| 49 | + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|---|
| 50 | + * copies of the Software, and to permit persons to whom the Software is | 
|---|
| 51 | + * furnished to do so, subject to the following conditions: | 
|---|
| 52 | + * | 
|---|
| 53 | + * The above copyright notice and this permission notice shall be included in | 
|---|
| 54 | + * all copies or substantial portions of the Software. | 
|---|
| 55 | + * | 
|---|
| 56 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|---|
| 57 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|---|
| 58 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 
|---|
| 59 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|---|
| 60 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|---|
| 61 | + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
|---|
| 62 | + * THE SOFTWARE. | 
|---|
| 63 | + */ | 
|---|
| 64 | + | 
|---|
| 65 | +#include "vl.h" | 
|---|
| 66 | + | 
|---|
| 67 | +//#define DEBUG_CMOS | 
|---|
| 68 | + | 
|---|
| 69 | +struct RTCState { | 
|---|
| 70 | +    uint8_t cmos_data[128]; | 
|---|
| 71 | +    uint8_t cmos_index; | 
|---|
| 72 | +}; | 
|---|
| 73 | + | 
|---|
| 74 | +void rtc_set_memory(RTCState *s, int addr, int val) | 
|---|
| 75 | +{ | 
|---|
| 76 | +    if (addr >= 0 && addr <= 127) | 
|---|
| 77 | +        s->cmos_data[addr] = val; | 
|---|
| 78 | +} | 
|---|
| 79 | + | 
|---|
| 80 | +static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data) | 
|---|
| 81 | +{ | 
|---|
| 82 | +    RTCState *s = opaque; | 
|---|
| 83 | + | 
|---|
| 84 | +    if ((addr & 1) == 0) { | 
|---|
| 85 | +        s->cmos_index = data & 0x7f; | 
|---|
| 86 | +    } else { | 
|---|
| 87 | +#ifdef DEBUG_CMOS | 
|---|
| 88 | +        printf("cmos: write index=0x%02x val=0x%02x\n", | 
|---|
| 89 | +               s->cmos_index, data); | 
|---|
| 90 | +#endif | 
|---|
| 91 | +        s->cmos_data[s->cmos_index] = data; | 
|---|
| 92 | +    } | 
|---|
| 93 | +} | 
|---|
| 94 | + | 
|---|
| 95 | +static uint32_t cmos_ioport_read(void *opaque, uint32_t addr) | 
|---|
| 96 | +{ | 
|---|
| 97 | +    RTCState *s = opaque; | 
|---|
| 98 | +    int ret; | 
|---|
| 99 | +    if ((addr & 1) == 0) { | 
|---|
| 100 | +        return 0xff; | 
|---|
| 101 | +    } else { | 
|---|
| 102 | +        ret = s->cmos_data[s->cmos_index]; | 
|---|
| 103 | +#ifdef DEBUG_CMOS | 
|---|
| 104 | +        printf("cmos: read index=0x%02x val=0x%02x\n", | 
|---|
| 105 | +               s->cmos_index, ret); | 
|---|
| 106 | +#endif | 
|---|
| 107 | +        return ret; | 
|---|
| 108 | +    } | 
|---|
| 109 | +} | 
|---|
| 110 | + | 
|---|
| 111 | +static void rtc_save(QEMUFile *f, void *opaque) | 
|---|
| 112 | +{ | 
|---|
| 113 | +    RTCState *s = opaque; | 
|---|
| 114 | + | 
|---|
| 115 | +    qemu_put_buffer(f, s->cmos_data, 128); | 
|---|
| 116 | +    qemu_put_8s(f, &s->cmos_index); | 
|---|
| 117 | +} | 
|---|
| 118 | + | 
|---|
| 119 | +static int rtc_load(QEMUFile *f, void *opaque, int version_id) | 
|---|
| 120 | +{ | 
|---|
| 121 | +    RTCState *s = opaque; | 
|---|
| 122 | + | 
|---|
| 123 | +    if (version_id != 1) | 
|---|
| 124 | +        return -EINVAL; | 
|---|
| 125 | + | 
|---|
| 126 | +    qemu_get_buffer(f, s->cmos_data, 128); | 
|---|
| 127 | +    qemu_get_8s(f, &s->cmos_index); | 
|---|
| 128 | + | 
|---|
| 129 | +    return 0; | 
|---|
| 130 | +} | 
|---|
| 131 | + | 
|---|
| 132 | +RTCState *rtc_init(int base, int irq) | 
|---|
| 133 | +{ | 
|---|
| 134 | +    RTCState *s; | 
|---|
| 135 | + | 
|---|
| 136 | +    s = qemu_mallocz(sizeof(RTCState)); | 
|---|
| 137 | +    if (!s) | 
|---|
| 138 | +        return NULL; | 
|---|
| 139 | + | 
|---|
| 140 | +    register_ioport_write(base, 2, 1, cmos_ioport_write, s); | 
|---|
| 141 | +    register_ioport_read(base, 2, 1, cmos_ioport_read, s); | 
|---|
| 142 | + | 
|---|
| 143 | +    register_savevm("mc146818rtc", base, 1, rtc_save, rtc_load, s); | 
|---|
| 144 | +    return s; | 
|---|
| 145 | +} | 
|---|
| 146 | + | 
|---|
| 147 | +void rtc_set_date(RTCState *s, const struct tm *tm) {} | 
|---|