PERFORCE change 90915 for review
Kip Macy
kmacy at FreeBSD.org
Wed Feb 1 22:57:13 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=90915
Change 90915 by kmacy at kmacy:freebsd7_xen3 on 2006/02/02 06:56:43
enable INITDOMAIN and PHYSDEV_ACCESS by default
fix compile-time errors
fix errors caused by running as domU with this set
Affected files ...
.. //depot/projects/xen3/src/sys/i386-xen/conf/XENCONF#5 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/clock.c#10 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#9 edit
.. //depot/projects/xen3/src/sys/i386/i386/bios.c#3 edit
Differences ...
==== //depot/projects/xen3/src/sys/i386-xen/conf/XENCONF#5 (text+ko) ====
@@ -144,6 +144,8 @@
#options BOOTP
options XEN
+options XEN_PHYSDEV_ACCESS
+options XEN_PRIVILEGED_GUEST
options MCLSHIFT=12 # this has to be enabled for Xen as we can only have one cluster per page
options MSIZE=256
options DIAGNOSTIC
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/clock.c#10 (text+ko) ====
@@ -109,6 +109,8 @@
#define RTC_UNLOCK mtx_unlock_spin(&clock_lock)
static const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+static u_char rtc_statusb = RTCSB_24HR;
+
/* Values for timerX_state: */
#define RELEASED 0
@@ -517,6 +519,111 @@
rdtscll(alarm);
}
+/*
+ * RTC support routines
+ */
+
+int
+rtcin(reg)
+ int reg;
+{
+ u_char val;
+
+ RTC_LOCK;
+ outb(IO_RTC, reg);
+ inb(0x84);
+ val = inb(IO_RTC + 1);
+ inb(0x84);
+ RTC_UNLOCK;
+ return (val);
+}
+
+static __inline void
+writertc(u_char reg, u_char val)
+{
+
+ RTC_LOCK;
+ inb(0x84);
+ outb(IO_RTC, reg);
+ inb(0x84);
+ outb(IO_RTC + 1, val);
+ inb(0x84); /* XXX work around wrong order in rtcin() */
+ RTC_UNLOCK;
+}
+
+static __inline int
+readrtc(int port)
+{
+ return(bcd2bin(rtcin(port)));
+}
+
+
+/*
+ * Initialize the time of day register, based on the time base which is, e.g.
+ * from a filesystem.
+ */
+static void
+domu_inittodr(time_t base)
+{
+ unsigned long sec;
+ int s, y;
+ struct timespec ts;
+
+ update_wallclock();
+
+ s = splclock();
+ if (base) {
+ ts.tv_sec = base;
+ ts.tv_nsec = 0;
+ tc_setclock(&ts);
+ }
+
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+
+ y = time_second - shadow_tv.tv_sec;
+ if (y <= -2 || y >= 2) {
+ /* badly off, adjust it */
+ tc_setclock(&shadow_tv);
+ }
+ splx(s);
+}
+
+/*
+ * Write system time back to RTC.
+ */
+static void
+domu_resettodr(void)
+{
+ unsigned long tm;
+ int s;
+ dom0_op_t op;
+ struct shadow_time_info *shadow;
+
+ shadow = &per_cpu(shadow_time, smp_processor_id());
+ if (disable_rtc_set)
+ return;
+
+ s = splclock();
+ tm = time_second;
+ splx(s);
+
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+
+ if ((xen_start_info->flags & SIF_INITDOMAIN) &&
+ !independent_wallclock)
+ {
+ op.cmd = DOM0_SETTIME;
+ op.u.settime.secs = tm;
+ op.u.settime.nsecs = 0;
+ op.u.settime.system_time = shadow->system_timestamp;
+ HYPERVISOR_dom0_op(&op);
+ update_wallclock();
+ } else if (independent_wallclock) {
+ /* notyet */
+ ;
+ }
+}
+
#ifdef XEN_PRIVILEGED_GUEST
/*
* Initialize the time of day register, based on the time base which is, e.g.
@@ -530,6 +637,11 @@
int y, m, s;
struct timespec ts;
+ if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+ domu_inittodr(base);
+ return;
+ }
+
if (base) {
s = splclock();
ts.tv_sec = base;
@@ -605,6 +717,11 @@
unsigned long tm;
int y, m, s;
+ if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+ domu_resettodr();
+ return;
+ }
+
if (disable_rtc_set)
return;
@@ -654,113 +771,9 @@
rtcin(RTC_INTR);
}
-#else
-/*
- * Initialize the time of day register, based on the time base which is, e.g.
- * from a filesystem.
- */
-void
-inittodr(time_t base)
-{
- unsigned long sec;
- int s, y;
- struct timespec ts;
-
- update_wallclock();
-
- s = splclock();
- if (base) {
- ts.tv_sec = base;
- ts.tv_nsec = 0;
- tc_setclock(&ts);
- }
-
- sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- y = time_second - shadow_tv.tv_sec;
- if (y <= -2 || y >= 2) {
- /* badly off, adjust it */
- tc_setclock(&shadow_tv);
- }
- splx(s);
-}
-
-/*
- * Write system time back to RTC.
- */
-void
-resettodr()
-{
- unsigned long tm;
- int s;
- dom0_op_t op;
- struct shadow_time_info *shadow;
-
- shadow = &per_cpu(shadow_time, smp_processor_id());
- if (disable_rtc_set)
- return;
-
- s = splclock();
- tm = time_second;
- splx(s);
-
- tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- if ((xen_start_info->flags & SIF_INITDOMAIN) &&
- !independent_wallclock)
- {
- op.cmd = DOM0_SETTIME;
- op.u.settime.secs = tm;
- op.u.settime.nsecs = 0;
- op.u.settime.system_time = shadow->system_timestamp;
- HYPERVISOR_dom0_op(&op);
- update_wallclock();
- } else if (independent_wallclock) {
- /* notyet */
- ;
- }
-}
#endif
-/*
- * RTC support routines
- */
-
-int
-rtcin(reg)
- int reg;
-{
- u_char val;
-
- RTC_LOCK;
- outb(IO_RTC, reg);
- inb(0x84);
- val = inb(IO_RTC + 1);
- inb(0x84);
- RTC_UNLOCK;
- return (val);
-}
-
-static __inline void
-writertc(u_char reg, u_char val)
-{
-
- RTC_LOCK;
- inb(0x84);
- outb(IO_RTC, reg);
- inb(0x84);
- outb(IO_RTC + 1, val);
- inb(0x84); /* XXX work around wrong order in rtcin() */
- RTC_UNLOCK;
-}
-
-static __inline int
-readrtc(int port)
-{
- return(bcd2bin(rtcin(port)));
-}
-
int
acquire_timer2(int mode)
{
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#9 (text+ko) ====
@@ -1695,20 +1695,22 @@
* this will panic with the current bootmem allocator - still need to
* figure out how little I can get away with there
*/
+ if (xen_start_info->flags & SIF_INITDOMAIN) {
map = bootmem_alloc(PAGE_SIZE);
op.cmd = DOM0_PHYSICAL_MEMORY_MAP;
- op.u.physical_memory_map.memory_may = map;
+ op.u.physical_memory_map.memory_map = map;
op.u.physical_memory_map.max_map_entries =
PAGE_SIZE / sizeof(struct dom0_memory_map_entry);
- PANIC_IF(HYPERVISOR_dom0_op(&ap));
+ PANIC_IF(HYPERVISOR_dom0_op(&op));
last = 0x100000000ULL;
gapstart = 0x10000000;
gapsize = 0x400000;
for (i = op.u.physical_memory_map.nr_map_entries - 1; i >= 0; i--) {
+#if 0
struct resource *res;
-
+#endif
if ((last > map[i].end) && ((last - map[i].end) > gapsize)) {
gapsize = last - map[i].end;
gapstart = map[i].end;
@@ -1749,8 +1751,9 @@
printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
pci_mem_start, gapstart, gapsize);
#endif
+ }
-#elif defined(XEN)
+#if defined(XEN)
Maxmem = xen_start_info->nr_pages - init_first;
pmap_bootstrap((init_first << PAGE_SHIFT), 0);
for (i = 0; i < 10; i++)
@@ -1762,7 +1765,7 @@
phys_avail[1] = avail_end;
return;
#endif
-
+#endif
hasbrokenint12 = 0;
TUNABLE_INT_FETCH("hw.hasbrokenint12", &hasbrokenint12);
bzero(&vmf, sizeof(vmf));
==== //depot/projects/xen3/src/sys/i386/i386/bios.c#3 (text+ko) ====
@@ -83,8 +83,9 @@
int i;
char *p;
-#if defined(XEN) && !defined(XEN_PRIVILEGED_GUEST)
- return;
+#if defined(XEN)
+ if (!(xen_start_info->flags & SIF_INITDOMAIN))
+ return;
#endif
/*
* BIOS32 Service Directory, PCI BIOS
More information about the p4-projects
mailing list