PERFORCE change 96502 for review
tkuik
tkuik at FreeBSD.org
Mon May 1 19:22:37 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=96502
Change 96502 by tkuik at tkuik_freebsd on 2006/05/01 19:22:23
Moved xen-public files up to 3.0.2-2 versions
Added support for driver domains along with bug fixes necessary for
them to work. This includes the netback & pcifront drivers.
Affected files ...
.. //depot/projects/xen3/src/sys/conf/Makefile.i386-xen#3 edit
.. //depot/projects/xen3/src/sys/conf/files.i386-xen#5 edit
.. //depot/projects/xen3/src/sys/conf/options.i386-xen#4 edit
.. //depot/projects/xen3/src/sys/dev/pci/pci.c#3 edit
.. //depot/projects/xen3/src/sys/dev/xen/blkfront/blkfront.c#5 edit
.. //depot/projects/xen3/src/sys/dev/xen/console/xencons_ring.c#3 edit
.. //depot/projects/xen3/src/sys/dev/xen/netback/netback.c#1 add
.. //depot/projects/xen3/src/sys/dev/xen/netfront/netfront.c#7 edit
.. //depot/projects/xen3/src/sys/dev/xen/pcifront/pcifront.c#1 add
.. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.c#3 edit
.. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.h#2 edit
.. //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_probe.c#4 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/clock.c#11 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/evtchn.c#4 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/io_apic.c#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#12 edit
.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/pmap.c#5 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/bus_dma.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/hypercall.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/hypervisor-ifs.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/hypervisor.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/pmap.h#4 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm_ops.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-ia64.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-x86_32.h#3 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/arch-x86_64.h#3 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/dom0_ops.h#3 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/event_channel.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/features.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/grant_table.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/hvm/hvm_info_table.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/hvm/ioreq.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/hvm/vmx_assist.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/blkif.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/console.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/ioreq.h#2 delete
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/netif.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/pciif.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/ring.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/tpmif.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/xenbus.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/io/xs_wire.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/memory.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/nmi.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/physdev.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/sched.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/sched_ctl.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/trace.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/vcpu.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/version.h#3 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/vmx_assist.h#2 delete
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/xen-compat.h#1 add
.. //depot/projects/xen3/src/sys/i386-xen/include/xen-public/xen.h#3 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xen_intr.h#2 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xenbus.h#3 edit
.. //depot/projects/xen3/src/sys/i386/i386/busdma_machdep.c#3 edit
.. //depot/projects/xen3/src/sys/i386/i386/vm_machdep.c#4 edit
.. //depot/projects/xen3/src/sys/i386/include/bus_dma.h#2 edit
.. //depot/projects/xen3/src/sys/kern/kern_shutdown.c#6 edit
.. //depot/projects/xen3/src/sys/kern/kern_tc.c#3 edit
.. //depot/projects/xen3/src/sys/net/if_bridge.c#3 edit
.. //depot/projects/xen3/src/sys/net/if_bridgevar.h#3 edit
.. //depot/projects/xen3/src/sys/netinet/in_rmx.c#2 edit
Differences ...
==== //depot/projects/xen3/src/sys/conf/Makefile.i386-xen#3 (text+ko) ====
@@ -29,6 +29,7 @@
.endif
.endif
.include "$S/conf/kern.pre.mk"
+INCLUDES+= -I$S/i386-xen/include/xen-public -I$S/i386-xen/include/xen-public/io
MKMODULESENV+= MACHINE=i386-xen
==== //depot/projects/xen3/src/sys/conf/files.i386-xen#5 (text+ko) ====
@@ -456,3 +456,5 @@
dev/xen/blkfront/blkfront.c standard
dev/xen/netfront/netfront.c standard
dev/xen/balloon/balloon.c standard
+dev/xen/netback/netback.c optional xen_netdev_backend
+dev/xen/pcifront/pcifront.c optional xen_pcidev_frontend
==== //depot/projects/xen3/src/sys/conf/options.i386-xen#4 (text+ko) ====
@@ -36,6 +36,11 @@
# support xen hypervisor.
XEN opt_global.h
+# support network backend driver
+XEN_NETDEV_BACKEND opt_global.h
+XEN_NETBACK_DEBUG opt_global.h
+XEN_NETBACK_DEBUG_LOTS opt_global.h
+
# support physical device access
XEN_PHYSDEV_ACCESS opt_global.h
@@ -43,6 +48,9 @@
# stay consistent with mainline for now
XEN_PRIVILEGED_GUEST opt_global.h
+# support pci device access via front end driver
+XEN_PCIDEV_FRONTEND opt_global.h
+XEN_PCIDEV_FE_DEBUG opt_global.h
# Physical address extensions and support for >4G ram. As above.
PAE opt_global.h
==== //depot/projects/xen3/src/sys/dev/pci/pci.c#3 (text+ko) ====
@@ -1112,22 +1112,14 @@
device_t pcib = device_get_parent(dev);
struct pci_devinfo *dinfo;
int maxslots;
- int s, f, pcifunchigh;
- uint8_t hdrtype;
+ int s, f;
KASSERT(dinfo_size >= sizeof(struct pci_devinfo),
("dinfo_size too small"));
maxslots = PCIB_MAXSLOTS(pcib);
for (s = 0; s <= maxslots; s++) {
- pcifunchigh = 0;
- f = 0;
DELAY(1);
- hdrtype = REG(PCIR_HDRTYPE, 1);
- if ((hdrtype & PCIM_HDRTYPE) > PCI_MAXHDRTYPE)
- continue;
- if (hdrtype & PCIM_MFDEV)
- pcifunchigh = PCI_FUNCMAX;
- for (f = 0; f <= pcifunchigh; f++) {
+ for (f = 0; f <= PCI_FUNCMAX; f++) {
dinfo = pci_read_device(pcib, busno, s, f, dinfo_size);
if (dinfo != NULL) {
pci_add_child(dev, dinfo);
==== //depot/projects/xen3/src/sys/dev/xen/blkfront/blkfront.c#5 (text+ko) ====
@@ -383,7 +383,7 @@
goto fail;
err = bind_evtchn_to_irqhandler(info->evtchn, "xbd",
(driver_intr_t *)blkif_int,
- info, INTR_TYPE_BIO | INTR_MPSAFE);
+ info, INTR_TYPE_BIO | INTR_MPSAFE, NULL);
if (err <= 0) {
xenbus_dev_fatal(dev, err,
"bind_evtchn_to_irqhandler failed");
==== //depot/projects/xen3/src/sys/dev/xen/console/xencons_ring.c#3 (text+ko) ====
@@ -102,7 +102,7 @@
err = bind_evtchn_to_irqhandler(xen_start_info->console_evtchn,
"xencons", handle_input, NULL,
- INTR_TYPE_MISC | INTR_MPSAFE);
+ INTR_TYPE_MISC | INTR_MPSAFE, NULL);
if (err) {
XENPRINTF("XEN console request irq failed %i\n", err);
return err;
==== //depot/projects/xen3/src/sys/dev/xen/netfront/netfront.c#7 (text+ko) ====
@@ -490,7 +490,7 @@
network_connect(ifp);
info->irq = bind_evtchn_to_irqhandler(
- info->evtchn, "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE);
+ info->evtchn, "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, NULL);
show_device(info);
==== //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.c#3 (text+ko) ====
@@ -195,7 +195,7 @@
unbind_from_irqhandler(xenbus_irq, &xb_waitq);
err = bind_evtchn_to_irqhandler(
- xen_start_info->store_evtchn, "xenbus", wake_waiting, NULL, INTR_TYPE_NET);
+ xen_start_info->store_evtchn, "xenbus", wake_waiting, NULL, INTR_TYPE_NET, NULL);
if (err <= 0) {
printk("XENBUS request irq failed %i\n", err);
return err;
==== //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_comms.h#2 (text+ko) ====
@@ -68,7 +68,7 @@
*
*/
#define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
==== //depot/projects/xen3/src/sys/dev/xen/xenbus/xenbus_probe.c#4 (text+ko) ====
@@ -92,6 +92,7 @@
#define streq(a, b) (strcmp((a), (b)) == 0)
static char *kasprintf(const char *fmt, ...);
+static int watch_otherend(struct xenbus_device *dev);
/* If something in array of ids matches this device, return it. */
@@ -174,7 +175,7 @@
xendev->nodename);
kfree(xendev->otherend);
xendev->otherend = NULL;
- return ENOENT;
+ return ENOENT;
}
return 0;
@@ -183,15 +184,77 @@
static int read_backend_details(struct xenbus_device *xendev)
{
+ if (!strncmp(xendev->nodename, "backend", 7))
+ return -ENOENT;
return read_otherend_details(xendev, "backend-id", "backend");
}
static int read_frontend_details(struct xenbus_device *xendev)
{
+ if (strncmp(xendev->nodename, "backend", 7))
+ return -ENOENT;
return read_otherend_details(xendev, "frontend-id", "frontend");
}
+static int watch_otherend_backend(struct xenbus_device *dev)
+{
+ struct xenbus_transaction *xbt;
+
+ /* We need to add the hotplug-status because we don't */
+ /* have a hotplug script to do this. If we ever do, */
+ /* this can be removed -- WORK */
+ xbt = xenbus_transaction_start();
+ xenbus_printf(xbt, dev->nodename, "hotplug-status","%s","connected");
+ xenbus_transaction_end(xbt, 0);
+
+ return watch_otherend(dev);
+}
+
+static int watch_otherend_frontend(struct xenbus_device *dev)
+{
+ return watch_otherend(dev);
+}
+
+/* We need to remove the backend device node from the xenbus */
+/* because we don't have a hotplug script to do this. If we */
+/* ever do, this can be removed -- WORK */
+static int
+xenbus_cleanup_backend_device(struct xenbus_device *dev)
+{
+ char *node, **dir;
+ unsigned int dir_n;
+ int i;
+
+ i = strlen(dev->nodename);
+ if (!i)
+ return 0;
+
+ node = malloc(i+1, M_DEVBUF, M_WAITOK);
+ if (!node)
+ return ENOMEM;
+ strcpy(node, dev->nodename);
+again:
+ DPRINTK("removing %s\n", node);
+ if (!xenbus_rm(NULL, node, "")) {
+ while (i > 7) {
+ if (node[i] == '/') {
+ node[i] = '\0';
+ dir = xenbus_directory(NULL, node, "", &dir_n);
+ if (!IS_ERR(dir)) {
+ kfree(dir);
+ if (dir_n == 0)
+ goto again;
+ }
+ break;
+ }
+ i--;
+ }
+ }
+ free(node, M_DEVBUF);
+ return 0;
+}
+
static void free_otherend_details(struct xenbus_device *dev)
{
kfree(dev->otherend);
@@ -424,14 +487,14 @@
printk(KERN_WARNING
"xenbus_probe: talk_to_otherend on %s failed.\n",
dev->nodename);
- return err;
+ return err;
}
err = drv->probe(dev, id);
if (err)
goto fail;
-
- err = watch_otherend(dev);
+
+ err = drv->watch_otherend(dev);
if (err) {
printk(KERN_WARNING
"xenbus_probe: watch_otherend on %s failed.\n",
@@ -445,11 +508,16 @@
xenbus_switch_state(dev, NULL, XenbusStateClosed);
return ENODEV;
}
-#if 0
-static int
-xenbus_dev_remove(device_t _dev)
+
+static void xenbus_dev_free(struct xenbus_device *xendev)
+{
+ LIST_REMOVE(xendev, list);
+ kfree(xendev);
+}
+
+int
+xenbus_remove_device(struct xenbus_device *dev)
{
- struct xenbus_device *dev = to_xenbus_device(_dev);
struct xenbus_driver *drv = dev->driver;
DPRINTK("");
@@ -461,9 +529,23 @@
drv->remove(dev);
xenbus_switch_state(dev, NULL, XenbusStateClosed);
+
+ if (drv->cleanup_device)
+ return drv->cleanup_device(dev);
+
+ xenbus_dev_free(dev);
+
return 0;
}
+
+#if 0
+static int
+xenbus_dev_remove(device_t _dev)
+{
+ return xenbus_remove_device(to_xenbus_device(_dev));
+}
#endif
+
static int xenbus_register_driver_common(struct xenbus_driver *drv,
struct xen_bus_type *bus)
{
@@ -488,17 +570,19 @@
LIST_INSERT_HEAD(&xendrv_list, drv, list);
up(&xenwatch_mutex);
LIST_FOREACH(xdev, bus->bus, list) {
- if (streq(drv->name, xdev->devicetype)) {
+ if (match_device(drv->ids, xdev)) {
xdev->driver = drv;
xenbus_dev_probe(xdev);
- }
}
+ }
return 0;
}
int xenbus_register_frontend(struct xenbus_driver *drv)
{
drv->read_otherend_details = read_backend_details;
+ drv->watch_otherend = watch_otherend_frontend;
+ drv->cleanup_device = NULL;
return xenbus_register_driver_common(drv, &xenbus_frontend);
}
@@ -507,6 +591,8 @@
int xenbus_register_backend(struct xenbus_driver *drv)
{
drv->read_otherend_details = read_frontend_details;
+ drv->watch_otherend = watch_otherend_backend;
+ drv->cleanup_device = xenbus_cleanup_backend_device;
return xenbus_register_driver_common(drv, &xenbus_backend);
}
@@ -562,7 +648,6 @@
#endif
static void xenbus_cleanup_devices(const char *path, struct xendev_list_head * bus)
{
- panic("unimplemented");
#if 0
struct xb_find_info info = { .nodename = path };
@@ -578,12 +663,6 @@
}
#if 0
-static void xenbus_dev_free(struct xenbus_device *xendev)
-{
- kfree(xendev);
-}
-
-
void xenbus_dev_release(device_t dev)
{
/*
@@ -645,25 +724,25 @@
char *tmpstring;
XenbusState state = xenbus_read_driver_state(nodename);
-
+
if (state != XenbusStateInitialising) {
/* Device is not new, so ignore it. This can happen if a
device is going away after switching to Closed. */
return 0;
}
-
+
stringlen = strlen(nodename) + 1 + strlen(type) + 1;
xendev = kmalloc(sizeof(*xendev) + stringlen, GFP_KERNEL);
if (!xendev)
return ENOMEM;
memset(xendev, 0, sizeof(*xendev));
-
+
/* Copy the strings into the extra space. */
-
+
tmpstring = (char *)(xendev + 1);
strcpy(tmpstring, nodename);
xendev->nodename = tmpstring;
-
+
tmpstring += strlen(tmpstring) + 1;
strcpy(tmpstring, type);
xendev->devicetype = tmpstring;
@@ -673,30 +752,30 @@
*/
LIST_INSERT_HEAD(bus->bus, xendev, list);
LIST_FOREACH(xdrv, &xendrv_list, list) {
- if (streq(xdrv->name, xendev->devicetype))
+ if (match_device(xdrv->ids, xendev)) {
xendev->driver = xdrv;
+ if (!xenbus_dev_probe(xendev))
+ break;
+ }
}
- if (xendev->driver != NULL)
- xenbus_dev_probe(xendev);
-
#if 0
xendev->dev.parent = &bus->dev;
xendev->dev.bus = &bus->bus;
xendev->dev.release = xenbus_dev_release;
-
+
err = bus->get_bus_id(xendev->dev.bus_id, xendev->nodename);
CHECK_FAIL;
-
+
/* Register with generic device framework. */
err = device_register(&xendev->dev);
CHECK_FAIL;
-
+
device_create_file(&xendev->dev, &dev_attr_nodename);
device_create_file(&xendev->dev, &dev_attr_devtype);
#endif
return 0;
-
+
#undef CHECK_FAIL
#if 0
fail:
@@ -806,7 +885,7 @@
break;
}
kfree(dir);
-
+
return err;
}
@@ -913,7 +992,7 @@
xdev = device_get_softc(dev);
drv = xdev->driver;
-
+
if (device_get_driver(dev) == NULL)
return 0;
@@ -922,7 +1001,7 @@
#if 0
/* bus_id ? */
if (err)
- printk(KERN_WARNING "xenbus: suspend %s failed: %i\n",
+ printk(KERN_WARNING "xenbus: suspend %s failed: %i\n",
dev->bus_id, err);
#endif
return 0;
@@ -947,8 +1026,8 @@
#if 0
if (err) {
printk(KERN_WARNING
- "xenbus: resume (talk_to_otherend) %s failed: %i\n",
- dev->bus_id, err);
+ "xenbus: resume (talk_to_otherend) %s failed: %i\n",
+ dev->bus_id, err);
return err;
}
#endif
@@ -993,9 +1072,9 @@
xenbus_add_child(device_t bus, int order, const char *name, int unit)
{
device_t child;
-
+
child = device_add_child_ordered(bus, order, name, unit);
-
+
return(child);
}
#endif
@@ -1080,7 +1159,7 @@
*/
dom0 = (xen_start_info->store_evtchn == 0);
-
+
#ifdef DOM0
if (dom0) {
@@ -1101,7 +1180,7 @@
xen_start_info->store_mfn =
pfn_to_mfn(virt_to_phys((void *)page) >>
PAGE_SHIFT);
-
+
/* Next allocate a local port which xenstored can bind to */
op.cmd = EVTCHNOP_alloc_unbound;
op.u.alloc_unbound.dom = DOMID_SELF;
@@ -1137,16 +1216,16 @@
panic("xenbus: could not attach");
#endif
BUG_ON((xenstored_ready <= 0));
-
-
+
+
/* Enumerate devices in xenstore. */
xenbus_probe_devices(&xenbus_frontend);
xenbus_probe_devices(&xenbus_backend);
-
+
/* Watch for changes. */
register_xenbus_watch(&fe_watch);
register_xenbus_watch(&be_watch);
-
+
/* Notify others that xenstore is up */
EVENTHANDLER_INVOKE(xenstore_event);
}
@@ -1204,6 +1283,10 @@
#endif
+
+
+
+
/*
* Local variables:
* c-file-style: "bsd"
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/clock.c#11 (text+ko) ====
@@ -314,31 +314,29 @@
int64_t delta_cpu, delta;
int cpu = smp_processor_id();
struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
- long lticks = 0;
do {
__get_time_values_from_xen();
delta = delta_cpu =
shadow->system_timestamp + get_nsec_offset(shadow);
-
delta -= processed_system_time;
delta_cpu -= per_cpu(processed_system_time, cpu);
} while (!time_values_up_to_date(cpu));
- if (unlikely(delta < (int64_t)-1000000) || unlikely(delta_cpu < 0)) {
+ if (unlikely(delta < (int64_t)0) || unlikely(delta_cpu < (int64_t)0)) {
printf("Timer ISR: Time went backwards: %lld\n", delta);
return;
}
/* Process elapsed ticks since last call. */
if (delta >= NS_PER_TICK) {
- lticks = (delta / NS_PER_TICK);
- processed_system_time += lticks*NS_PER_TICK;
- per_cpu(processed_system_time, cpu) += lticks*NS_PER_TICK;
+ processed_system_time += (delta / NS_PER_TICK) * NS_PER_TICK;
+ per_cpu(processed_system_time, cpu) += (delta_cpu / NS_PER_TICK) * NS_PER_TICK;
}
hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame));
+
/*
* Take synchronised time from Xen once a minute if we're not
* synchronised ourselves, and we haven't chosen to keep an independent
@@ -357,10 +355,13 @@
static uint32_t
getit(void)
{
+ struct shadow_time_info *shadow;
+ shadow = &per_cpu(shadow_time, smp_processor_id());
__get_time_values_from_xen();
- return per_cpu(shadow_time, smp_processor_id()).system_timestamp;
+ return shadow->system_timestamp + get_nsec_offset(shadow);
}
+
/*
* Wait "n" microseconds.
* Relies on timer 1 counting down from (timer_freq / hz)
@@ -512,7 +513,9 @@
}
set_cyc2ns_scale(cpu_khz/1000);
- timer_freq = tsc_freq = xen_timecounter.tc_frequency = cpu_khz * 1000;
+ tsc_freq = cpu_khz * 1000;
+
+ timer_freq = xen_timecounter.tc_frequency = 1000000000LL;
tc_init(&xen_timecounter);
@@ -831,9 +834,8 @@
int irq;
int cpu = smp_processor_id();
-
per_cpu(processed_system_time, cpu) = processed_system_time;
-
+
irq = bind_virq_to_irq(VIRQ_TIMER);
PCPU_SET(time_irq, irq);
PANIC_IF(intr_add_handler("clk", irq, (driver_intr_t *)clkintr,
@@ -859,13 +861,23 @@
static uint32_t
xen_get_timecount(struct timecounter *tc)
{
+ uint64_t clk;
struct shadow_time_info *shadow;
shadow = &per_cpu(shadow_time, smp_processor_id());
__get_time_values_from_xen();
- return (uint32_t)(processed_system_time + shadow->system_timestamp + get_nsec_offset(shadow));
+ clk = shadow->system_timestamp + get_nsec_offset(shadow);
+
+ return (uint32_t)((clk / NS_PER_TICK) * NS_PER_TICK);
+
+}
+/* Return system time offset by ticks */
+uint64_t
+get_system_time(int ticks)
+{
+ return processed_system_time + (ticks * NS_PER_TICK);
}
/*
@@ -908,7 +920,6 @@
{
__get_time_values_from_xen();
- processed_system_time = per_cpu(processed_system_time, smp_processor_id());
PANIC_IF(HYPERVISOR_set_timer_op(processed_system_time + NS_PER_TICK) != 0);
HYPERVISOR_sched_op(SCHEDOP_block, 0);
}
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/evtchn.c#4 (text+ko) ====
@@ -348,14 +348,15 @@
const char *devname,
driver_intr_t handler,
void *arg,
- unsigned long irqflags)
+ unsigned long irqflags,
+ void **cookiep)
{
unsigned int irq;
int retval;
irq = bind_evtchn_to_irq(evtchn);
intr_register_source(&xp->xp_pins[irq].xp_intsrc);
- retval = intr_add_handler(devname, irq, handler, arg, irqflags, NULL);
+ retval = intr_add_handler(devname, irq, handler, arg, irqflags, cookiep);
if (retval != 0) {
unbind_from_irq(irq);
return retval;
@@ -407,9 +408,8 @@
void unbind_from_irqhandler(unsigned int irq, void *dev_id)
{
-#ifdef notyet
- intr_remove_handler(dev_id); /* XXX */
-#endif
+ if (dev_id)
+ intr_remove_handler(dev_id); /* XXX */
unbind_from_irq(irq);
}
@@ -915,6 +915,8 @@
tpin = &pin[pirq_to_irq(i)];
tpin->xp_intsrc.is_pic = xp->xp_pirq_pic;
tpin->xp_vector = pirq_to_irq(i);
+
+ intr_register_source(&tpin->xp_intsrc);
}
}
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/io_apic.c#2 (text+ko) ====
@@ -14,8 +14,8 @@
int ret;
op.cmd = PHYSDEVOP_APIC_READ;
- op.u.apic_op.apic = io->io_apic_id;
- op.u.apic_op.offset = reg;
+ op.u.apic_op.apic_physbase = (unsigned long)io->io_addr;
+ op.u.apic_op.reg = reg;
ret = HYPERVISOR_physdev_op(&op);
if (ret)
return ret;
@@ -28,8 +28,8 @@
physdev_op_t op;
op.cmd = PHYSDEVOP_APIC_WRITE;
- op.u.apic_op.apic = io->io_apic_id;
- op.u.apic_op.offset = reg;
+ op.u.apic_op.apic_physbase = (unsigned long)io->io_addr;
+ op.u.apic_op.reg = reg;
op.u.apic_op.value = value;
HYPERVISOR_physdev_op(&op);
}
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/machdep.c#12 (text+ko) ====
@@ -1114,7 +1114,7 @@
for (;;)
__asm__ ("hlt");
#else
- HYPERVISOR_sched_op(SCHEDOP_shutdown, SHUTDOWN_poweroff);
+ HYPERVISOR_shutdown(SHUTDOWN_poweroff);
#endif
}
==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/pmap.c#5 (text+ko) ====
@@ -895,6 +895,35 @@
}
/*
+ * Routine: pmap_extract_ma
+ * Function:
+ * Like pmap_extract, but returns machine address
+ */
+vm_paddr_t
+pmap_extract_ma(pmap_t pmap, vm_offset_t va)
+{
+ vm_paddr_t rtval;
+ pt_entry_t *pte;
+ pd_entry_t pde;
+
+ rtval = 0;
+ PMAP_LOCK(pmap);
+ pde = pmap->pm_pdir[va >> PDRSHIFT];
+ if (pde != 0) {
+ if ((pde & PG_PS) != 0) {
+ rtval = (pde & ~PDRMASK) | (va & PDRMASK);
+ PMAP_UNLOCK(pmap);
+ return rtval;
+ }
+ pte = pmap_pte(pmap, va);
+ rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
+ pmap_pte_release(pte);
+ }
+ PMAP_UNLOCK(pmap);
+ return (rtval);
+}
+
+/*
* Routine: pmap_extract_and_hold
* Function:
* Atomically extract and hold the physical page
@@ -3205,7 +3234,7 @@
panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
for (tmpva = va; size > 0; ) {
- pmap_kenter(tmpva, pa);
+ pmap_kenter_ma(tmpva, pa);
size -= PAGE_SIZE;
tmpva += PAGE_SIZE;
pa += PAGE_SIZE;
==== //depot/projects/xen3/src/sys/i386-xen/include/bus_dma.h#2 (text+ko) ====
@@ -1,1 +1,7 @@
#include <i386/include/bus_dma.h>
+
+#undef _BUS_VIRT_TO_BUS
+#define _BUS_VIRT_TO_BUS(pm, va) pmap_extract_ma(pm, va)
+
+#undef _BUS_VIRT_TO_BUS_KERN
+#define _BUS_VIRT_TO_BUS_KERN(va) pmap_kextract_ma(va)
==== //depot/projects/xen3/src/sys/i386-xen/include/hypercall.h#2 (text+ko) ====
@@ -162,7 +162,7 @@
static inline int
HYPERVISOR_sched_op(
- int cmd, unsigned long arg)
+ int cmd, void *arg)
{
return _hypercall2(int, sched_op, cmd, arg);
}
@@ -296,8 +296,11 @@
HYPERVISOR_suspend(
unsigned long srec)
{
+ struct sched_shutdown sched_shutdown = {
+ .reason = SHUTDOWN_suspend
+ };
return _hypercall3(int, sched_op, SCHEDOP_shutdown,
- SHUTDOWN_suspend, srec);
+ &sched_shutdown, srec);
}
#endif /* __HYPERCALL_H__ */
==== //depot/projects/xen3/src/sys/i386-xen/include/hypervisor-ifs.h#2 (text+ko) ====
@@ -18,6 +18,7 @@
#endif
} pte_t;
+#define __XEN_INTERFACE_VERSION__ 0x00030101
#define CONFIG_XEN_BLKDEV_GRANT
#include <machine/xen-public/xen.h>
#include <machine/xen-public/grant_table.h>
==== //depot/projects/xen3/src/sys/i386-xen/include/hypervisor.h#2 (text+ko) ====
@@ -25,6 +25,8 @@
extern start_info_t *xen_start_info;
extern shared_info_t *HYPERVISOR_shared_info;
+extern uint64_t get_system_time(int ticks);
+
static inline int
HYPERVISOR_console_write(char *str, int count)
{
@@ -33,13 +35,37 @@
static inline void HYPERVISOR_crash(void) __dead2;
+static inline int
+HYPERVISOR_shutdown(unsigned int reason)
+{
+ struct sched_shutdown sched_shutdown = {
+ .reason = reason
+ };
+
+ return HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
+}
+
static inline void
HYPERVISOR_crash(void)
{
- _hypercall2(void, sched_op, SCHEDOP_shutdown, SHUTDOWN_crash);
+ HYPERVISOR_shutdown(SHUTDOWN_crash);
/* NEVER REACHED */
for (;;) ; /* eliminate noreturn error */
}
+/* Transfer control to hypervisor until an event is detected on one */
+/* of the specified ports or the specified number of ticks elapse */
+static inline int
+HYPERVISOR_poll(
+ evtchn_port_t *ports, unsigned int nr_ports, int ticks)
+{
+ struct sched_poll sched_poll = {
+ .ports = ports,
+ .nr_ports = nr_ports,
+ .timeout = get_system_time(ticks)
+ };
+
+ return HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
+}
#endif /* __HYPERVISOR_H__ */
==== //depot/projects/xen3/src/sys/i386-xen/include/pmap.h#4 (text+ko) ====
@@ -429,6 +429,8 @@
void pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t);
void pmap_invalidate_all(pmap_t);
+vm_paddr_t pmap_extract_ma(pmap_t pmap, vm_offset_t va);
+
void pmap_kenter_ma(vm_offset_t va, vm_paddr_t pa);
void pmap_map_readonly(pmap_t pmap, vm_offset_t va, int len);
void pmap_map_readwrite(pmap_t pmap, vm_offset_t va, int len);
==== //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm.h#2 (text+ko) ====
@@ -1,25 +1,8 @@
-/****************************************************************
- * acm.h
- *
- * Copyright (C) 2005 IBM Corporation
+/*
+ * acm.h: Xen access control module interface defintions
*
- * Author:
* Reiner Sailer <sailer at watson.ibm.com>
- *
- * Contributors:
- * Stefan Berger <stefanb at watson.ibm.com>
- * added network byte order support for binary policies
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * sHype general access control module header file.
- * here are all definitions that are shared between
- * xen-core, guest-kernels, and applications.
- *
- * todo: move from static policy choice to compile option.
+ * Copyright (c) 2005, International Business Machines Corporation.
*/
#ifndef _XEN_PUBLIC_ACM_H
@@ -169,7 +152,7 @@
uint32_t ec_eval_count;
uint32_t gt_eval_count;
uint32_t ec_denied_count;
- uint32_t gt_denied_count;
+ uint32_t gt_denied_count;
uint32_t ec_cachehit_count;
uint32_t gt_cachehit_count;
};
==== //depot/projects/xen3/src/sys/i386-xen/include/xen-public/acm_ops.h#2 (text+ko) ====
@@ -1,19 +1,8 @@
-/******************************************************************************
- * acm_ops.h
- *
- * Copyright (C) 2005 IBM Corporation
+/*
+ * acm_ops.h: Xen access control module hypervisor commands
*
- * Author:
* Reiner Sailer <sailer at watson.ibm.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * Process acm policy command requests from guest OS.
- * access checked by policy; not restricted to DOM0
- *
+ * Copyright (c) 2005, International Business Machines Corporation.
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list