aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs
diff options
context:
space:
mode:
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs')
-rw-r--r--xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/block.h78
-rw-r--r--xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/hypervisor-if.h209
-rw-r--r--xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/network.h131
3 files changed, 418 insertions, 0 deletions
diff --git a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/block.h b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/block.h
new file mode 100644
index 0000000000..627055bf0b
--- /dev/null
+++ b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/block.h
@@ -0,0 +1,78 @@
+/******************************************************************************
+ * block.h
+ *
+ * Block IO communication rings.
+ *
+ * These are the ring data structures for buffering messages between
+ * the hypervisor and guestos's.
+ *
+ */
+
+#ifndef __BLOCK_H__
+#define __BLOCK_H__
+
+#include <linux/kdev_t.h>
+
+/* the first four definitions match fs.h */
+#define XEN_BLOCK_READ 0
+#define XEN_BLOCK_WRITE 1
+#define XEN_BLOCK_READA 2 /* currently unused */
+#define XEN_BLOCK_SPECIAL 4 /* currently unused */
+#define XEN_BLOCK_PROBE 8 /* determine io configuration from hypervisor */
+#define XEN_BLOCK_DEBUG 16 /* debug */
+
+#define BLK_RING_SIZE 128
+#define BLK_RING_MAX_ENTRIES (BLK_RING_SIZE - 2)
+#define BLK_RING_INC(_i) (((_i)+1) & (BLK_RING_SIZE-1))
+#define BLK_RING_ADD(_i,_j) (((_i)+(_j)) & (BLK_RING_SIZE-1))
+
+typedef struct blk_ring_req_entry
+{
+ void * id; /* for guest os use */
+ int operation; /* XEN_BLOCK_READ or XEN_BLOCK_WRITE */
+ char * buffer;
+ unsigned long block_number; /* block number */
+ unsigned short block_size; /* block size */
+ kdev_t device;
+ unsigned long sector_number; /* real buffer location on disk */
+} blk_ring_req_entry_t;
+
+typedef struct blk_ring_resp_entry
+{
+ void *id;
+ unsigned long status;
+} blk_ring_resp_entry_t;
+
+typedef struct blk_ring_st
+{
+ unsigned int req_prod; /* Request producer. Updated by guest OS. */
+ unsigned int resp_prod; /* Response producer. Updated by Xen. */
+ union {
+ blk_ring_req_entry_t req;
+ blk_ring_resp_entry_t resp;
+ } ring[BLK_RING_SIZE];
+} blk_ring_t;
+
+#define MAX_XEN_DISK_COUNT 100
+
+#define XEN_DISK_IDE 1
+#define XEN_DISK_SCSI 2
+
+typedef struct xen_disk /* physical disk */
+{
+ int type; /* disk type */
+ unsigned long capacity;
+ unsigned char heads; /* hdreg.h::hd_geometry */
+ unsigned char sectors; /* hdreg.h::hd_geometry */
+ unsigned int cylinders; /* hdreg.h::hd_big_geometry */
+ unsigned long start; /* hdreg.h::hd_geometry */
+ void * gendisk; /* struct gendisk ptr */
+} xen_disk_t;
+
+typedef struct xen_disk_info
+{
+ int count; /* number of subsequent xen_disk_t structures to follow */
+ xen_disk_t disks[100];
+} xen_disk_info_t;
+
+#endif
diff --git a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/hypervisor-if.h b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/hypervisor-if.h
new file mode 100644
index 0000000000..6ecac5848e
--- /dev/null
+++ b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/hypervisor-if.h
@@ -0,0 +1,209 @@
+/******************************************************************************
+ * hypervisor-if.h
+ *
+ * Interface to Xeno hypervisor.
+ */
+
+#include "network.h"
+#include "block.h"
+
+#ifndef __HYPERVISOR_IF_H__
+#define __HYPERVISOR_IF_H__
+
+/*
+ * Virtual addresses beyond this are not modifiable by guest OSes.
+ * The machine->physical mapping table starts at this address, read-only
+ * to all domains except DOM0.
+ */
+#define HYPERVISOR_VIRT_START (0xFC000000UL)
+#ifndef machine_to_phys_mapping
+#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START)
+#endif
+
+typedef struct trap_info_st
+{
+ unsigned char vector; /* exception/interrupt vector */
+ unsigned char dpl; /* privilege level */
+ unsigned short cs; /* code selector */
+ unsigned long address; /* code address */
+} trap_info_t;
+
+
+typedef struct
+{
+/*
+ * PGREQ_XXX: specified in least-significant bits of 'ptr' field.
+ * All requests specify relevent PTE or PT address in 'ptr'.
+ * Normal requests specify update value in 'value'.
+ * Extended requests specify command in least 8 bits of 'value'.
+ */
+/* A normal page-table update request. */
+#define PGREQ_NORMAL 0
+/* Update an entry in the machine->physical mapping table. */
+#define PGREQ_MPT_UPDATE 1
+/* An extended command. */
+#define PGREQ_EXTENDED_COMMAND 2
+/* DOM0 can make entirely unchecked updates which do not affect refcnts. */
+#define PGREQ_UNCHECKED_UPDATE 3
+ unsigned long ptr, val; /* *ptr = val */
+/* Announce a new top-level page table. */
+#define PGEXT_PIN_L1_TABLE 0
+#define PGEXT_PIN_L2_TABLE 1
+#define PGEXT_PIN_L3_TABLE 2
+#define PGEXT_PIN_L4_TABLE 3
+#define PGEXT_UNPIN_TABLE 4
+#define PGEXT_NEW_BASEPTR 5
+#define PGEXT_TLB_FLUSH 6
+#define PGEXT_INVLPG 7
+#define PGEXT_CMD_MASK 255
+#define PGEXT_CMD_SHIFT 8
+} page_update_request_t;
+
+
+/*
+ * Segment descriptor tables.
+ */
+/* 8 entries, plus a TSS entry for each CPU (up to 32 CPUs). */
+#define FIRST_DOMAIN_GDT_ENTRY 40
+/* These are flat segments for domain bootstrap and fallback. */
+#define FLAT_RING1_CS 0x11
+#define FLAT_RING1_DS 0x19
+#define FLAT_RING3_CS 0x23
+#define FLAT_RING3_DS 0x2b
+
+
+/* EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5. */
+
+#define __HYPERVISOR_set_trap_table 0
+#define __HYPERVISOR_pt_update 1
+#define __HYPERVISOR_console_write 2
+#define __HYPERVISOR_set_gdt 3
+#define __HYPERVISOR_stack_and_ldt_switch 4
+#define __HYPERVISOR_net_update 5
+#define __HYPERVISOR_fpu_taskswitch 6
+#define __HYPERVISOR_sched_op 7
+#define __HYPERVISOR_exit 8
+#define __HYPERVISOR_dom0_op 9
+#define __HYPERVISOR_network_op 10
+#define __HYPERVISOR_block_io_op 11
+#define __HYPERVISOR_set_debugreg 12
+#define __HYPERVISOR_get_debugreg 13
+#define __HYPERVISOR_update_descriptor 14
+#define __HYPERVISOR_set_fast_trap 15
+
+#define TRAP_INSTR "int $0x82"
+
+
+/* Event message note:
+ *
+ * Here, as in the interrupts to the guestos, additional network interfaces
+ * are defined. These definitions server as placeholders for the event bits,
+ * however, in the code these events will allways be referred to as shifted
+ * offsets from the base NET events.
+ */
+
+/* Events that a guest OS may receive from the hypervisor. */
+#define EVENT_BLK_RESP 0x01 /* A block device response has been queued. */
+#define EVENT_TIMER 0x02 /* A timeout has been updated. */
+#define EVENT_DIE 0x04 /* OS is about to be killed. Clean up please! */
+#define EVENT_DEBUG 0x08 /* Request guest to dump debug info (gross!) */
+#define EVENT_NET_TX 0x10 /* There are packets for transmission. */
+#define EVENT_NET_RX 0x20 /* There are empty buffers for receive. */
+
+/* Bit offsets, as opposed to the above masks. */
+#define _EVENT_BLK_RESP 0
+#define _EVENT_TIMER 1
+#define _EVENT_DIE 2
+#define _EVENT_NET_TX 3
+#define _EVENT_NET_RX 4
+#define _EVENT_DEBUG 5
+
+
+/*
+ * NB. We expect that this struct is smaller than a page.
+ */
+typedef struct shared_info_st {
+
+ /* Bitmask of outstanding event notifications hypervisor -> guest OS. */
+ unsigned long events;
+ /*
+ * Hypervisor will only signal event delivery via the "callback
+ * exception" when this value is non-zero. Hypervisor clears this when
+ * notiying the guest OS -- this prevents unbounded reentrancy and
+ * stack overflow (in this way, acts as an interrupt-enable flag).
+ */
+ unsigned long events_enable;
+
+ /*
+ * Address for callbacks hypervisor -> guest OS.
+ * Stack frame looks like that of an interrupt.
+ * Code segment is the default flat selector.
+ * This handler will only be called when events_enable is non-zero.
+ */
+ unsigned long event_address;
+
+ /*
+ * Hypervisor uses this callback when it takes a fault on behalf of
+ * an application. This can happen when returning from interrupts for
+ * example: various faults can occur when reloading the segment
+ * registers, and executing 'iret'.
+ * This callback is provided with an extended stack frame, augmented
+ * with saved values for segment registers %ds and %es:
+ * %ds, %es, %eip, %cs, %eflags [, %oldesp, %oldss]
+ * Code segment is the default flat selector.
+ * FAULTS WHEN CALLING THIS HANDLER WILL TERMINATE THE DOMAIN!!!
+ */
+ unsigned long failsafe_address;
+
+ /*
+ * Time:
+ * The following abstractions are exposed: System Time, Wall Clock
+ * Time, Domain Virtual Time. Domains can access Cycle counter time
+ * directly.
+ * XXX RN: Need something to pass NTP scaling to GuestOS.
+ */
+
+ u64 cpu_freq; /* to calculate ticks -> real time */
+
+ /* System Time */
+ long long system_time; /* in ns */
+ unsigned long st_timestamp; /* cyclecounter at last update */
+
+ /* Wall Clock Time */
+ u32 wc_version; /* a version number for info below */
+ long tv_sec; /* essentially a struct timeval */
+ long tv_usec;
+ long long wc_timestamp; /* system time at last update */
+
+ /* Domain Virtual Time */
+ unsigned long long domain_time;
+
+ /*
+ * Timeout values:
+ * Allow a domain to specify a timeout value in system time and
+ * domain virtual time.
+ */
+ unsigned long long wall_timeout;
+ unsigned long long domain_timeout;
+
+} shared_info_t;
+
+/*
+ * NB. We expect that this struct is smaller than a page.
+ */
+typedef struct start_info_st {
+ unsigned long nr_pages; /* total pages allocated to this domain */
+ shared_info_t *shared_info; /* VIRTUAL address of shared info struct */
+ unsigned long pt_base; /* VIRTUAL address of page directory */
+ unsigned long mod_start; /* VIRTUAL address of pre-loaded module */
+ unsigned long mod_len; /* size (bytes) of pre-loaded module */
+ net_ring_t *net_rings; /* network rings (VIRTUAL ADDRESS) */
+ int num_net_rings;
+ unsigned long blk_ring; /* block io ring (MACHINE ADDRESS) */
+ unsigned char cmd_line[1]; /* variable-length */
+} start_info_t;
+
+/* For use in guest OSes. */
+extern shared_info_t *HYPERVISOR_shared_info;
+
+#endif /* __HYPERVISOR_IF_H__ */
diff --git a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/network.h b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/network.h
new file mode 100644
index 0000000000..28cb94618c
--- /dev/null
+++ b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/network.h
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * network.h
+ *
+ * ring data structures for buffering messages between hypervisor and
+ * guestos's. As it stands this is only used for network buffer exchange.
+ *
+ * This file also contains structures and interfaces for the per-domain
+ * routing/filtering tables in the hypervisor.
+ *
+ */
+
+#ifndef __RING_H__
+#define __RING_H__
+
+#include <linux/types.h>
+
+typedef struct tx_entry_st {
+ unsigned long addr; /* virtual address */
+ unsigned long size; /* in bytes */
+ int status; /* per descriptor status. */
+} tx_entry_t;
+
+typedef struct rx_entry_st {
+ unsigned long addr; /* virtual address */
+ unsigned long size; /* in bytes */
+ int status; /* per descriptor status. */
+} rx_entry_t;
+
+#define TX_RING_SIZE 256
+#define RX_RING_SIZE 256
+typedef struct net_ring_st {
+ /*
+ * Guest OS places packets into ring at tx_prod.
+ * Hypervisor removes at tx_cons.
+ * Ring is empty when tx_prod == tx_cons.
+ * Guest OS receives a DOMAIN_EVENT_NET_TX when tx_cons passes tx_event.
+ * Hypervisor may be prodded whenever tx_prod is updated, but this is
+ * only necessary when tx_cons == old_tx_prod (ie. transmitter stalled).
+ */
+ tx_entry_t *tx_ring;
+ unsigned int tx_prod, tx_cons, tx_event;
+
+ /*
+ * Guest OS places empty buffers into ring at rx_prod.
+ * Hypervisor fills buffers as rx_cons.
+ * Ring is empty when rx_prod == rx_cons.
+ * Guest OS receives a DOMAIN_EVENT_NET_RX when rx_cons passes rx_event.
+ * Hypervisor may be prodded whenever rx_prod is updated, but this is
+ * only necessary when rx_cons == old_rx_prod (ie. receiver stalled).
+ */
+ rx_entry_t *rx_ring;
+ unsigned int rx_prod, rx_cons, rx_event;
+} net_ring_t;
+
+/* Specify base of per-domain array. Get returned free slot in the array. */
+/*net_ring_t *create_net_vif(int domain);*/
+
+/* Packet routing/filtering code follows:
+ */
+
+#define NETWORK_ACTION_ACCEPT 0
+#define NETWORK_ACTION_COUNT 1
+
+#define NETWORK_PROTO_ANY 0
+#define NETWORK_PROTO_IP 1
+#define NETWORK_PROTO_TCP 2
+#define NETWORK_PROTO_UDP 3
+#define NETWORK_PROTO_ARP 4
+
+typedef struct net_rule_st
+{
+ u32 src_addr;
+ u32 dst_addr;
+ u16 src_port;
+ u16 dst_port;
+ u32 src_addr_mask;
+ u32 dst_addr_mask;
+ u16 src_port_mask;
+ u16 dst_port_mask;
+ u16 proto;
+
+ int src_interface;
+ int dst_interface;
+ u16 action;
+} net_rule_t;
+
+typedef struct vif_query_st
+{
+ unsigned int domain;
+ char *buf; // where to put the reply -- guest virtual address
+} vif_query_t;
+
+/* Network trap operations and associated structure.
+ * This presently just handles rule insertion and deletion, but will
+ * evenually have code to add and remove interfaces.
+ */
+
+#define NETWORK_OP_ADDRULE 0
+#define NETWORK_OP_DELETERULE 1
+#define NETWORK_OP_GETRULELIST 2
+#define NETWORK_OP_VIFQUERY 3
+
+typedef struct network_op_st
+{
+ unsigned long cmd;
+ union
+ {
+ net_rule_t net_rule;
+ vif_query_t vif_query;
+ }
+ u;
+} network_op_t;
+
+typedef struct net_rule_ent_st
+{
+ net_rule_t r;
+ struct net_rule_ent_st *next;
+} net_rule_ent_t;
+
+/* Drop a new rule down to the network tables. */
+int add_net_rule(net_rule_t *rule);
+
+
+/* Descriptor status values:
+ */
+
+#define RING_STATUS_OK 0 // Everything is gravy.
+#define RING_STATUS_ERR_CFU -1 // Copy from user problems.
+#define RING_STATUS_BAD_PAGE -2 // What they gave us was pure evil.
+
+#endif