bitkeeper revision 1.936 (40c09331NirwCvM2egwMlUy301iNmg)

Merge scramble.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk
into scramble.cl.cam.ac.uk:/local/scratch/kaf24/xeno
This commit is contained in:
kaf24@scramble.cl.cam.ac.uk committed 2004-06-04 15:20:17 +00:00
commit 6d7d5203ba
8 files changed
+503 -206

No files matched your search

+1
View File
@@ -91,6 +91,7 @@ vbd_list = []; cmdline_ip = ''; cmdline_root=''; cmdline_extra=''
pci_device_list = []; console_port = -1
auto_console = False
dontstart = False
flags = 0
##### Determine location of defaults file
#####
+36 -22
View File
@@ -43,19 +43,29 @@ def backend_rx_rsp(port, msg):
rsp = { 'success': True }
xend.main.send_management_response(rsp, xend.blkif.pendaddr)
elif subtype == CMSG_BLKIF_BE_CONNECT:
(dom,hnd,evtchn,frame,st) = struct.unpack("IIILI", msg.get_payload())
pl = msg.get_payload()
(dom, hnd, frame, evtchn, st) = (pl['domid'], pl['blkif_handle'],
pl['shmem_frame'], pl['evtchn'],
pl['status'])
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
msg = xend.utils.message(CMSG_BLKIF_FE, \
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
msg.append_payload(struct.pack("III",0,2,blkif.evtchn['port2']))
msg = xend.utils.message(CMSG_BLKIF_FE,
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0,
{ 'handle' : 0, 'status' : 2,
'evtchn' : blkif.evtchn['port2'] })
blkif.ctrlif_tx_req(xend.main.port_list[blkif.key], msg)
elif subtype == CMSG_BLKIF_BE_VBD_CREATE:
(dom,hnd,vdev,ro,st) = struct.unpack("IIHII", msg.get_payload())
pl = msg.get_payload()
(dom, hnd, vdev, ro, st) = (pl['domid'], pl['blkif_handle'],
pl['vdevice'], pl['readonly'],
pl['status'])
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
(pdev, start_sect, nr_sect, readonly) = blkif.devices[vdev]
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0)
msg.append_payload(struct.pack("IIHHHQQI",dom,0,vdev,0, \
pdev,start_sect,nr_sect,0))
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0,
{ 'domid' : dom, 'blkif_handle' : 0,
'vdevice' : vdev,
'extent.sector_start' : start_sect,
'extent.sector.length' : nr_sect,
'extent.device' : pdev })
backend_tx_req(msg)
elif subtype == CMSG_BLKIF_BE_VBD_GROW:
rsp = { 'success': True }
@@ -83,8 +93,8 @@ class interface:
self.devices = {}
self.pendmsg = None
interface.list[key] = self
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0)
msg.append_payload(struct.pack("III",dom,0,0))
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0,
{ 'domid' : dom, 'blkif_handle' : 0 })
xend.blkif.pendaddr = xend.main.mgmt_req_addr
backend_tx_req(msg)
@@ -93,8 +103,9 @@ class interface:
if self.devices.has_key(vdev):
return False
self.devices[vdev] = (pdev, start_sect, nr_sect, readonly)
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE, 0)
msg.append_payload(struct.pack("IIHII",self.dom,0,vdev,readonly,0))
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE, 0,
{ 'domid' : self.dom, 'blkif_handle' : 0,
'vdevice' : vdev, 'readonly' : readonly })
xend.blkif.pendaddr = xend.main.mgmt_req_addr
backend_tx_req(msg)
return True
@@ -103,8 +114,8 @@ class interface:
# Completely destroy this interface.
def destroy(self):
del interface.list[self.key]
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY, 0)
msg.append_payload(struct.pack("III",self.dom,0,0))
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY, 0,
{ 'domid' : self.dom, 'blkif_handle' : 0 })
backend_tx_req(msg)
@@ -128,16 +139,19 @@ class interface:
port.write_response(msg)
subtype = (msg.get_header())['subtype']
if subtype == CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED:
msg = xend.utils.message(CMSG_BLKIF_FE, \
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
msg.append_payload(struct.pack("III",0,1,0))
msg = xend.utils.message(CMSG_BLKIF_FE,
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED,
0,
{ 'handle' : 0, 'status' : 1 })
self.ctrlif_tx_req(port, msg)
elif subtype == CMSG_BLKIF_FE_INTERFACE_CONNECT:
(hnd,frame) = struct.unpack("IL", msg.get_payload())
pl = msg.get_payload()
(hnd, frame) = (pl['handle'], pl['shmem_frame'])
xc = Xc.new()
self.evtchn = xc.evtchn_bind_interdomain(dom1=0,dom2=self.dom)
msg = xend.utils.message(CMSG_BLKIF_BE, \
CMSG_BLKIF_BE_CONNECT, 0)
msg.append_payload(struct.pack("IIILI",self.dom,0, \
self.evtchn['port1'],frame,0))
msg = xend.utils.message(CMSG_BLKIF_BE,
CMSG_BLKIF_BE_CONNECT, 0,
{ 'domid' : self.dom, 'blkif_handle' : 0,
'shmem_frame' : frame,
'evtchn' : self.evtchn['port1'] })
backend_tx_req(msg)
+125 -123
View File
@@ -22,8 +22,10 @@
typedef struct {
BASIC_START_INFO;
unsigned int domain_controller_evtchn;
} extended_start_info_t;
u16 domain_controller_evtchn; /* 320 */
} PACKED extended_start_info_t; /* 322 bytes */
#define SIF_BLK_BE_DOMAIN (1<<4) /* Is this a block backend domain? */
#define SIF_NET_BE_DOMAIN (1<<5) /* Is this a net backend domain? */
/*
@@ -31,23 +33,23 @@ typedef struct {
*/
typedef struct {
u8 type; /* echoed in response */
u8 subtype; /* echoed in response */
u8 id; /* echoed in response */
u8 length; /* number of bytes in 'msg' */
unsigned char msg[60]; /* type-specific message data */
} control_msg_t;
u8 type; /* 0: echoed in response */
u8 subtype; /* 1: echoed in response */
u8 id; /* 2: echoed in response */
u8 length; /* 3: number of bytes in 'msg' */
u8 msg[60]; /* 4: type-specific message data */
} PACKED control_msg_t; /* 64 bytes */
#define CONTROL_RING_SIZE 8
typedef unsigned int CONTROL_RING_IDX;
typedef u32 CONTROL_RING_IDX;
#define MASK_CONTROL_IDX(_i) ((_i)&(CONTROL_RING_SIZE-1))
typedef struct {
control_msg_t tx_ring[CONTROL_RING_SIZE]; /* guest-OS -> controller */
control_msg_t rx_ring[CONTROL_RING_SIZE]; /* controller -> guest-OS */
CONTROL_RING_IDX tx_req_prod, tx_resp_prod;
CONTROL_RING_IDX rx_req_prod, rx_resp_prod;
} control_if_t;
control_msg_t tx_ring[CONTROL_RING_SIZE]; /* 0: guest -> controller */
control_msg_t rx_ring[CONTROL_RING_SIZE]; /* 512: controller -> guest */
CONTROL_RING_IDX tx_req_prod, tx_resp_prod; /* 1024, 1028 */
CONTROL_RING_IDX rx_req_prod, rx_resp_prod; /* 1032, 1036 */
} PACKED control_if_t; /* 1040 bytes */
/*
* Top-level command types.
@@ -97,10 +99,10 @@ typedef struct {
#define BLKIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
#define BLKIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */
typedef struct {
unsigned int handle;
unsigned int status;
unsigned int evtchn; /* status == BLKIF_INTERFACE_STATUS_CONNECTED */
} blkif_fe_interface_status_changed_t;
u32 handle; /* 0 */
u32 status; /* 4 */
u16 evtchn; /* 8: (only if status == BLKIF_INTERFACE_STATUS_CONNECTED). */
} PACKED blkif_fe_interface_status_changed_t; /* 10 bytes */
/*
* CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED:
@@ -115,14 +117,14 @@ typedef struct {
#define BLKIF_DRIVER_STATUS_UP 1
typedef struct {
/* IN */
unsigned int status; /* BLKIF_DRIVER_STATUS_??? */
u32 status; /* 0: BLKIF_DRIVER_STATUS_??? */
/* OUT */
/*
* Tells driver how many interfaces it should expect to immediately
* receive notifications about.
*/
unsigned int nr_interfaces;
} blkif_fe_driver_status_changed_t;
u32 nr_interfaces; /* 4 */
} PACKED blkif_fe_driver_status_changed_t; /* 8 bytes */
/*
* CMSG_BLKIF_FE_INTERFACE_CONNECT:
@@ -130,9 +132,11 @@ typedef struct {
* STATUS_CONNECTED message.
*/
typedef struct {
unsigned int handle;
unsigned long shmem_frame;
} blkif_fe_interface_connect_t;
u32 handle; /* 0 */
u32 __pad;
memory_t shmem_frame; /* 8 */
MEMORY_PADDING;
} PACKED blkif_fe_interface_connect_t; /* 16 bytes */
/*
* CMSG_BLKIF_FE_INTERFACE_DISCONNECT:
@@ -140,8 +144,8 @@ typedef struct {
* STATUS_DISCONNECTED message.
*/
typedef struct {
unsigned int handle;
} blkif_fe_interface_disconnect_t;
u32 handle; /* 0 */
} PACKED blkif_fe_interface_disconnect_t; /* 4 bytes */
/******************************************************************************
@@ -166,10 +170,11 @@ typedef struct {
*/
typedef struct {
blkif_pdev_t device;
blkif_sector_t sector_start;
blkif_sector_t sector_length;
} blkif_extent_t;
blkif_sector_t sector_start; /* 0 */
blkif_sector_t sector_length; /* 8 */
blkif_pdev_t device; /* 16 */
u16 __pad; /* 18 */
} PACKED blkif_extent_t; /* 20 bytes */
/* Non-specific 'okay' return. */
#define BLKIF_BE_STATUS_OKAY 0
@@ -206,11 +211,11 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int blkif_handle; /* Domain-specific interface handle. */
domid_t domid; /* 0: Domain attached to new interface. */
u32 blkif_handle; /* 4: Domain-specific interface handle. */
/* OUT */
unsigned int status;
} blkif_be_create_t;
u32 status; /* 8 */
} PACKED blkif_be_create_t; /* 12 bytes */
/*
* CMSG_BLKIF_BE_DESTROY:
@@ -220,11 +225,11 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Identify interface to be destroyed. */
unsigned int blkif_handle; /* ...ditto... */
domid_t domid; /* 0: Identify interface to be destroyed. */
u32 blkif_handle; /* 4: ...ditto... */
/* OUT */
unsigned int status;
} blkif_be_destroy_t;
u32 status; /* 8 */
} PACKED blkif_be_destroy_t; /* 12 bytes */
/*
* CMSG_BLKIF_BE_CONNECT:
@@ -234,13 +239,14 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int blkif_handle; /* Domain-specific interface handle. */
unsigned int evtchn; /* Event channel for notifications. */
unsigned long shmem_frame; /* Page cont. shared comms window. */
domid_t domid; /* 0: Domain attached to new interface. */
u32 blkif_handle; /* 4: Domain-specific interface handle. */
memory_t shmem_frame; /* 8: Page cont. shared comms window. */
MEMORY_PADDING;
u32 evtchn; /* 16: Event channel for notifications. */
/* OUT */
unsigned int status;
} blkif_be_connect_t;
u32 status; /* 20 */
} PACKED blkif_be_connect_t; /* 24 bytes */
/*
* CMSG_BLKIF_BE_DISCONNECT:
@@ -250,70 +256,66 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int blkif_handle; /* Domain-specific interface handle. */
domid_t domid; /* 0: Domain attached to new interface. */
u32 blkif_handle; /* 4: Domain-specific interface handle. */
/* OUT */
unsigned int status;
} blkif_be_disconnect_t;
u32 status; /* 8 */
} PACKED blkif_be_disconnect_t; /* 12 bytes */
/* CMSG_BLKIF_BE_VBD_CREATE */
typedef struct {
/* IN */
domid_t domid; /* Identify blkdev interface. */
unsigned int blkif_handle; /* ...ditto... */
blkif_vdev_t vdevice; /* Interface-specific id for this VBD. */
int readonly; /* Non-zero -> VBD isn't writeable. */
domid_t domid; /* 0: Identify blkdev interface. */
u32 blkif_handle; /* 4: ...ditto... */
blkif_vdev_t vdevice; /* 8: Interface-specific id for this VBD. */
u16 readonly; /* 10: Non-zero -> VBD isn't writeable. */
/* OUT */
unsigned int status;
} blkif_be_vbd_create_t;
u32 status; /* 12 */
} PACKED blkif_be_vbd_create_t; /* 16 bytes */
/* CMSG_BLKIF_BE_VBD_DESTROY */
typedef struct {
/* IN */
domid_t domid; /* Identify blkdev interface. */
unsigned int blkif_handle; /* ...ditto... */
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
domid_t domid; /* 0: Identify blkdev interface. */
u32 blkif_handle; /* 4: ...ditto... */
blkif_vdev_t vdevice; /* 8: Interface-specific id of the VBD. */
u16 __pad; /* 10 */
/* OUT */
unsigned int status;
} blkif_be_vbd_destroy_t;
u32 status; /* 12 */
} PACKED blkif_be_vbd_destroy_t; /* 16 bytes */
/* CMSG_BLKIF_BE_VBD_GROW */
typedef struct {
/* IN */
domid_t domid; /* Identify blkdev interface. */
unsigned int blkif_handle; /* ...ditto... */
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
blkif_extent_t extent; /* Physical extent to append to VBD. */
domid_t domid; /* 0: Identify blkdev interface. */
u32 blkif_handle; /* 4: ...ditto... */
blkif_extent_t extent; /* 8: Physical extent to append to VBD. */
blkif_vdev_t vdevice; /* 28: Interface-specific id of the VBD. */
u16 __pad; /* 30 */
/* OUT */
unsigned int status;
} blkif_be_vbd_grow_t;
u32 status; /* 32 */
} PACKED blkif_be_vbd_grow_t; /* 36 bytes */
/* CMSG_BLKIF_BE_VBD_SHRINK */
typedef struct {
/* IN */
domid_t domid; /* Identify blkdev interface. */
unsigned int blkif_handle; /* ...ditto... */
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
domid_t domid; /* 0: Identify blkdev interface. */
u32 blkif_handle; /* 4: ...ditto... */
blkif_vdev_t vdevice; /* 8: Interface-specific id of the VBD. */
u16 __pad; /* 10 */
/* OUT */
unsigned int status;
} blkif_be_vbd_shrink_t;
u32 status; /* 12 */
} PACKED blkif_be_vbd_shrink_t; /* 16 bytes */
/*
* CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED:
* Notify the domain controller that the back-end driver is DOWN or UP.
* If the driver goes DOWN while interfaces are still UP, the domain
* If the driver goes DOWN while interfaces are still UP, the controller
* will automatically send DOWN notifications.
*/
typedef struct {
/* IN */
unsigned int status; /* BLKIF_DRIVER_STATUS_??? */
/* OUT */
/*
* Tells driver how many interfaces it should expect to immediately
* receive notifications about.
*/
unsigned int nr_interfaces;
} blkif_be_driver_status_changed_t;
u32 status; /* 0: BLKIF_DRIVER_STATUS_??? */
} PACKED blkif_be_driver_status_changed_t; /* 4 bytes */
/******************************************************************************
@@ -339,11 +341,11 @@ typedef struct {
#define NETIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
#define NETIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */
typedef struct {
unsigned int handle;
unsigned int status;
unsigned int evtchn; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
u8 mac[6]; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
} netif_fe_interface_status_changed_t;
u32 handle; /* 0 */
u32 status; /* 4 */
u16 evtchn; /* 8: status == NETIF_INTERFACE_STATUS_CONNECTED */
u8 mac[6]; /* 10: status == NETIF_INTERFACE_STATUS_CONNECTED */
} PACKED netif_fe_interface_status_changed_t; /* 16 bytes */
/*
* CMSG_NETIF_FE_DRIVER_STATUS_CHANGED:
@@ -358,14 +360,14 @@ typedef struct {
#define NETIF_DRIVER_STATUS_UP 1
typedef struct {
/* IN */
unsigned int status; /* NETIF_DRIVER_STATUS_??? */
u32 status; /* 0: NETIF_DRIVER_STATUS_??? */
/* OUT */
/*
* Tells driver how many interfaces it should expect to immediately
* receive notifications about.
*/
unsigned int nr_interfaces;
} netif_fe_driver_status_changed_t;
u32 nr_interfaces; /* 4 */
} PACKED netif_fe_driver_status_changed_t; /* 8 bytes */
/*
* CMSG_NETIF_FE_INTERFACE_CONNECT:
@@ -373,10 +375,13 @@ typedef struct {
* STATUS_CONNECTED message.
*/
typedef struct {
unsigned int handle;
unsigned long tx_shmem_frame;
unsigned long rx_shmem_frame;
} netif_fe_interface_connect_t;
u32 handle; /* 0 */
u32 __pad; /* 4 */
memory_t tx_shmem_frame; /* 8 */
MEMORY_PADDING;
memory_t rx_shmem_frame; /* 16 */
MEMORY_PADDING;
} PACKED netif_fe_interface_connect_t; /* 24 bytes */
/*
* CMSG_NETIF_FE_INTERFACE_DISCONNECT:
@@ -384,8 +389,8 @@ typedef struct {
* STATUS_DISCONNECTED message.
*/
typedef struct {
unsigned int handle;
} netif_fe_interface_disconnect_t;
u32 handle; /* 0 */
} PACKED netif_fe_interface_disconnect_t; /* 4 bytes */
/******************************************************************************
@@ -434,12 +439,13 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int netif_handle; /* Domain-specific interface handle. */
u8 mac[6];
domid_t domid; /* 0: Domain attached to new interface. */
u32 netif_handle; /* 4: Domain-specific interface handle. */
u8 mac[6]; /* 8 */
u16 __pad; /* 14 */
/* OUT */
unsigned int status;
} netif_be_create_t;
u32 status; /* 16 */
} PACKED netif_be_create_t; /* 20 bytes */
/*
* CMSG_NETIF_BE_DESTROY:
@@ -449,11 +455,11 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Identify interface to be destroyed. */
unsigned int netif_handle; /* ...ditto... */
domid_t domid; /* 0: Identify interface to be destroyed. */
u32 netif_handle; /* 4: ...ditto... */
/* OUT */
unsigned int status;
} netif_be_destroy_t;
u32 status; /* 8 */
} PACKED netif_be_destroy_t; /* 12 bytes */
/*
* CMSG_NETIF_BE_CONNECT:
@@ -463,14 +469,17 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int netif_handle; /* Domain-specific interface handle. */
unsigned int evtchn; /* Event channel for notifications. */
unsigned long tx_shmem_frame; /* Page cont. tx shared comms window. */
unsigned long rx_shmem_frame; /* Page cont. rx shared comms window. */
domid_t domid; /* 0: Domain attached to new interface. */
u32 netif_handle; /* 4: Domain-specific interface handle. */
memory_t tx_shmem_frame; /* 8: Page cont. tx shared comms window. */
MEMORY_PADDING;
memory_t rx_shmem_frame; /* 16: Page cont. rx shared comms window. */
MEMORY_PADDING;
u16 evtchn; /* 24: Event channel for notifications. */
u16 __pad; /* 26 */
/* OUT */
unsigned int status;
} netif_be_connect_t;
u32 status; /* 28 */
} PACKED netif_be_connect_t; /* 32 bytes */
/*
* CMSG_NETIF_BE_DISCONNECT:
@@ -480,11 +489,11 @@ typedef struct {
*/
typedef struct {
/* IN */
domid_t domid; /* Domain attached to new interface. */
unsigned int netif_handle; /* Domain-specific interface handle. */
domid_t domid; /* 0: Domain attached to new interface. */
u32 netif_handle; /* 4: Domain-specific interface handle. */
/* OUT */
unsigned int status;
} netif_be_disconnect_t;
u32 status; /* 8 */
} PACKED netif_be_disconnect_t; /* 12 bytes */
/*
* CMSG_NETIF_BE_DRIVER_STATUS_CHANGED:
@@ -493,14 +502,7 @@ typedef struct {
* will automatically send DOWN notifications.
*/
typedef struct {
/* IN */
unsigned int status; /* NETIF_DRIVER_STATUS_??? */
/* OUT */
/*
* Tells driver how many interfaces it should expect to immediately
* receive notifications about.
*/
unsigned int nr_interfaces;
} netif_be_driver_status_changed_t;
u32 status; /* 0: NETIF_DRIVER_STATUS_??? */
} PACKED netif_be_driver_status_changed_t; /* 4 bytes */
#endif /* __DOMAIN_CONTROLLER_H__ */
+2
View File
@@ -75,6 +75,8 @@ def daemon_loop():
notifier.bind(dom0_port.local_port)
port_list[dom0_port.local_port] = dom0_port
xend.netif.be_port = dom0_port
##
## MAIN LOOP
##
+2 -1
View File
@@ -158,6 +158,7 @@ def new_network_interface(dom, handle=-1):
## for the network will only be accepted from this domain.
##
def set_network_backend(dom):
if xend.netif.be_port: xend.netif.recovery = True
if xend.netif.be_port.remote_dom != 0:
xend.netif.recovery = True
xend.netif.be_port = xend.main.port_from_dom(dom)
return { 'success' : True }
+46 -45
View File
@@ -25,12 +25,10 @@ NETIF_DRIVER_STATUS_UP = 1
pendmsg = None
pendaddr = None
recovery = False # Is a recovery in progress? (if so, we'll need to notify guests)
recovery = False # Is a recovery in progress?
be_port = None # Port object for backend domain
def backend_tx_req(msg):
if not xend.netif.be_port:
print "BUG: attempt to transmit request to non-existant netif driver"
if xend.netif.be_port.space_to_write_request():
xend.netif.be_port.write_request(msg)
xend.netif.be_port.notify()
@@ -42,7 +40,8 @@ def backend_rx_req(port, msg):
subtype = (msg.get_header())['subtype']
print "Received netif-be request, subtype %d" % subtype
if subtype == CMSG_NETIF_BE_DRIVER_STATUS_CHANGED:
(status, dummy) = struct.unpack("II", msg.get_payload())
pl = msg.get_payload()
status = pl['status']
if status == NETIF_DRIVER_STATUS_UP:
if xend.netif.recovery:
print "New netif backend now UP, notifying guests:"
@@ -50,17 +49,13 @@ def backend_rx_req(port, msg):
netif = interface.list[netif_key]
netif.create()
print " Notifying %d" % netif.dom
msg = xend.utils.message(CMSG_NETIF_FE, \
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
msg.append_payload(struct.pack("IIIBBBBBBBB", \
0,1,0,0,0,0,0,0,0,0,0))
netif.ctrlif_tx_req(xend.main.port_from_dom(netif.dom), msg)
msg = xend.utils.message(
CMSG_NETIF_FE,
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
{ 'handle' : 0, 'status' : 1 })
netif.ctrlif_tx_req(xend.main.port_from_dom(netif.dom),msg)
print "Done notifying guests"
recovery = False
else: # No recovery in progress.
if xend.netif.be_port: # This should never be true! (remove later)
print "BUG: unexpected netif backend UP message from %d" \
% port.remote_dom
else:
print "Unexpected net backend driver status: %d" % status
@@ -71,17 +66,21 @@ def backend_rx_rsp(port, msg):
rsp = { 'success': True }
xend.main.send_management_response(rsp, xend.netif.pendaddr)
elif subtype == CMSG_NETIF_BE_CONNECT:
(dom,hnd,evtchn,tx_frame,rx_frame,st) = \
struct.unpack("IIILLI", msg.get_payload())
pl = msg.get_payload()
(dom, hnd, evtchn, tx_frame, rx_frame, st) = (
pl['domid'], pl['netif_handle'], pl['evtchn'],
pl['tx_shmem_frame'], pl['rx_shmem_frame'], pl['status'])
netif = interface.list[xend.main.port_from_dom(dom).local_port]
msg = xend.utils.message(CMSG_NETIF_FE, \
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
msg.append_payload(struct.pack("IIIBBBBBBBB",0,2, \
netif.evtchn['port2'], \
netif.mac[0],netif.mac[1], \
netif.mac[2],netif.mac[3], \
netif.mac[4],netif.mac[5], \
0,0))
msg = xend.utils.message(CMSG_NETIF_FE,
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
{ 'handle' : 0, 'status' : 2,
'evtchn' : netif.evtchn['port2'],
'mac[0]' : netif.mac[0],
'mac[1]' : netif.mac[1],
'mac[2]' : netif.mac[2],
'mac[3]' : netif.mac[3],
'mac[4]' : netif.mac[4],
'mac[5]' : netif.mac[5] })
netif.ctrlif_tx_req(xend.main.port_list[netif.key], msg)
def backend_do_work(port):
@@ -125,12 +124,14 @@ class interface:
def create(self):
"""Notify the current network back end to create the virtual interface
represented by this object."""
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE, 0)
msg.append_payload(struct.pack("IIBBBBBBBBI",self.dom,0, \
self.mac[0],self.mac[1], \
self.mac[2],self.mac[3], \
self.mac[4],self.mac[5], \
0,0,0))
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE, 0,
{ 'domid' : self.dom, 'netif_handle' : 0,
'mac[0]' : self.mac[0],
'mac[1]' : self.mac[1],
'mac[2]' : self.mac[2],
'mac[3]' : self.mac[3],
'mac[4]' : self.mac[4],
'mac[5]' : self.mac[5] })
xend.netif.pendaddr = xend.main.mgmt_req_addr
backend_tx_req(msg)
@@ -138,8 +139,8 @@ class interface:
# Completely destroy this interface.
def destroy(self):
del interface.list[self.key]
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY, 0)
msg.append_payload(struct.pack("III",self.dom,0,0))
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY, 0,
{ 'domid' : self.dom, 'netif_handle' : 0 })
backend_tx_req(msg)
@@ -164,23 +165,23 @@ class interface:
subtype = (msg.get_header())['subtype']
if subtype == CMSG_NETIF_FE_DRIVER_STATUS_CHANGED:
print "netif driver up message from %d" % port.remote_dom
msg = xend.utils.message(CMSG_NETIF_FE, \
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
msg.append_payload(struct.pack("IIIBBBBBBBB",0,1,0,self.mac[0], \
self.mac[1],self.mac[2], \
self.mac[3],self.mac[4], \
self.mac[5],0,0))
msg = xend.utils.message(CMSG_NETIF_FE,
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
{ 'handle' : 0, 'status' : 1 })
self.ctrlif_tx_req(port, msg)
elif subtype == CMSG_NETIF_FE_INTERFACE_CONNECT:
print "netif connect request from %d" % port.remote_dom
(hnd,tx_frame,rx_frame) = struct.unpack("ILL", msg.get_payload())
pl = msg.get_payload()
(hnd, tx_frame, rx_frame) = (pl['handle'], pl['tx_shmem_frame'],
pl['rx_shmem_frame'])
xc = Xc.new()
self.evtchn = xc.evtchn_bind_interdomain( \
dom1=xend.netif.be_port.remote_dom, \
self.evtchn = xc.evtchn_bind_interdomain(
dom1=xend.netif.be_port.remote_dom,
dom2=self.dom)
msg = xend.utils.message(CMSG_NETIF_BE, \
CMSG_NETIF_BE_CONNECT, 0)
msg.append_payload(struct.pack("IIILLI",self.dom,0, \
self.evtchn['port1'],tx_frame, \
rx_frame,0))
msg = xend.utils.message(CMSG_NETIF_BE,
CMSG_NETIF_BE_CONNECT, 0,
{ 'domid' : self.dom, 'netif_handle' : 0,
'tx_shmem_frame' : tx_frame,
'rx_shmem_frame' : rx_frame,
'evtchn' : self.evtchn['port1'] })
backend_tx_req(msg)
+271 -1
View File
@@ -235,6 +235,23 @@ static PyTypeObject xu_notifier_type = {
* *********************** MESSAGE ***********************
*/
#define TYPE(_x,_y) (((_x)<<8)|(_y))
#define P2C(_struct, _field, _pytype, _ctype1, _ctype2) \
do { \
PyObject *obj; \
if ( ((obj = PyDict_GetItemString(payload, #_field)) != NULL) && \
Py ## _pytype ## _Check(obj) ) \
((_struct *)&xum->msg.msg[0])->_field = \
(_ctype2)Py ## _pytype ## _As ## _ctype1(obj); \
xum->msg.length = sizeof(_struct); \
} while ( 0 )
#define C2P(_struct, _field, _pytype, _ctype1, _ctype2) \
do { \
PyObject *obj = Py ## _pytype ## _From ## _ctype1 \
(((_struct *)&xum->msg.msg[0])->_field); \
PyDict_SetItemString(dict, #_field, obj); \
} while ( 0 )
typedef struct {
PyObject_HEAD;
control_msg_t msg;
@@ -262,13 +279,157 @@ static PyObject *xu_message_append_payload(PyObject *self, PyObject *args)
return Py_None;
}
static PyObject *xu_message_set_response_fields(PyObject *self, PyObject *args)
{
xu_message_object *xum = (xu_message_object *)self;
PyObject *payload;
if ( !PyArg_ParseTuple(args, "O", &payload) )
return NULL;
switch ( TYPE(xum->msg.type, xum->msg.subtype) )
{
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED):
P2C(blkif_fe_driver_status_changed_t, nr_interfaces, Int, Long, u32);
break;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
P2C(netif_fe_driver_status_changed_t, nr_interfaces, Int, Long, u32);
break;
}
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
{
xu_message_object *xum = (xu_message_object *)self;
PyObject *dict;
if ( !PyArg_ParseTuple(args, "") )
return NULL;
dict = PyDict_New();
switch ( TYPE(xum->msg.type, xum->msg.subtype) )
{
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED):
C2P(blkif_fe_interface_status_changed_t, handle, Int, Long, u32);
C2P(blkif_fe_interface_status_changed_t, status, Int, Long, u32);
C2P(blkif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
return dict;
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED):
C2P(blkif_fe_driver_status_changed_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_CONNECT):
C2P(blkif_fe_interface_connect_t, handle, Int, Long, u32);
C2P(blkif_fe_interface_connect_t, shmem_frame, Int, Long, memory_t);
return dict;
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_DISCONNECT):
C2P(blkif_fe_interface_disconnect_t, handle, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
C2P(blkif_be_create_t, domid, Int, Long, u32);
C2P(blkif_be_create_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_create_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
C2P(blkif_be_destroy_t, domid, Int, Long, u32);
C2P(blkif_be_destroy_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_destroy_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
C2P(blkif_be_connect_t, domid, Int, Long, u32);
C2P(blkif_be_connect_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_connect_t, shmem_frame, Int, Long, memory_t);
C2P(blkif_be_connect_t, evtchn, Int, Long, u16);
C2P(blkif_be_connect_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
C2P(blkif_be_disconnect_t, domid, Int, Long, u32);
C2P(blkif_be_disconnect_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_disconnect_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
C2P(blkif_be_vbd_create_t, domid, Int, Long, u32);
C2P(blkif_be_vbd_create_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_vbd_create_t, vdevice, Int, Long, blkif_vdev_t);
C2P(blkif_be_vbd_create_t, readonly, Int, Long, u16);
C2P(blkif_be_vbd_create_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
C2P(blkif_be_vbd_destroy_t, domid, Int, Long, u32);
C2P(blkif_be_vbd_destroy_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_vbd_destroy_t, vdevice, Int, Long, blkif_vdev_t);
C2P(blkif_be_vbd_destroy_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW):
C2P(blkif_be_vbd_grow_t, domid, Int, Long, u32);
C2P(blkif_be_vbd_grow_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_vbd_grow_t, vdevice, Int, Long, blkif_vdev_t);
C2P(blkif_be_vbd_grow_t, extent.sector_start,
Long, UnsignedLongLong, blkif_sector_t);
C2P(blkif_be_vbd_grow_t, extent.sector_length,
Long, UnsignedLongLong, blkif_sector_t);
C2P(blkif_be_vbd_grow_t, extent.device,
Int, Long, blkif_pdev_t);
C2P(blkif_be_vbd_grow_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_SHRINK):
C2P(blkif_be_vbd_shrink_t, domid, Int, Long, u32);
C2P(blkif_be_vbd_shrink_t, blkif_handle, Int, Long, u32);
C2P(blkif_be_vbd_shrink_t, vdevice, Int, Long, blkif_vdev_t);
C2P(blkif_be_vbd_shrink_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED):
C2P(blkif_be_driver_status_changed_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED):
C2P(netif_fe_interface_status_changed_t, handle, Int, Long, u32);
C2P(netif_fe_interface_status_changed_t, status, Int, Long, u32);
C2P(netif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
return dict;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
C2P(netif_fe_driver_status_changed_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_CONNECT):
C2P(netif_fe_interface_connect_t, handle, Int, Long, u32);
C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long, memory_t);
C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long, memory_t);
return dict;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT):
C2P(netif_fe_interface_disconnect_t, handle, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
C2P(netif_be_create_t, domid, Int, Long, u32);
C2P(netif_be_create_t, netif_handle, Int, Long, u32);
C2P(netif_be_create_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
C2P(netif_be_destroy_t, domid, Int, Long, u32);
C2P(netif_be_destroy_t, netif_handle, Int, Long, u32);
C2P(netif_be_destroy_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
C2P(netif_be_connect_t, domid, Int, Long, u32);
C2P(netif_be_connect_t, netif_handle, Int, Long, u32);
C2P(netif_be_connect_t, tx_shmem_frame, Int, Long, memory_t);
C2P(netif_be_connect_t, rx_shmem_frame, Int, Long, memory_t);
C2P(netif_be_connect_t, evtchn, Int, Long, u16);
C2P(netif_be_connect_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
C2P(netif_be_disconnect_t, domid, Int, Long, u32);
C2P(netif_be_disconnect_t, netif_handle, Int, Long, u32);
C2P(netif_be_disconnect_t, status, Int, Long, u32);
return dict;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS_CHANGED):
C2P(netif_be_driver_status_changed_t, status, Int, Long, u32);
return dict;
}
PyObject_Del(dict); /* didn't use it after all */
return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
}
@@ -315,6 +476,11 @@ static PyMethodDef xu_message_methods[] = {
METH_VARARGS,
"Append @str to the message payload.\n" },
{ "set_response_fields",
(PyCFunction)xu_message_set_response_fields,
METH_VARARGS,
"Fill in the response fields in a message that was passed to us.\n" },
{ "get_payload",
(PyCFunction)xu_message_get_payload,
METH_VARARGS,
@@ -339,8 +505,9 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
{
xu_message_object *xum;
int type, subtype, id;
PyObject *payload = NULL;
if ( !PyArg_ParseTuple(args, "iii", &type, &subtype, &id) )
if ( !PyArg_ParseTuple(args, "iii|O", &type, &subtype, &id, &payload) )
return NULL;
xum = PyObject_New(xu_message_object, &xu_message_type);
@@ -350,7 +517,110 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
xum->msg.id = id;
xum->msg.length = 0;
if ( payload == NULL )
return (PyObject *)xum;
if ( !PyDict_Check(payload) )
{
PyErr_SetString(PyExc_TypeError, "payload is not a dictionary");
goto fail;
}
switch ( TYPE(type, subtype) )
{
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED):
P2C(blkif_fe_interface_status_changed_t, handle, Int, Long, u32);
P2C(blkif_fe_interface_status_changed_t, status, Int, Long, u32);
P2C(blkif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
P2C(blkif_be_create_t, domid, Int, Long, u32);
P2C(blkif_be_create_t, blkif_handle, Int, Long, u32);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
P2C(blkif_be_destroy_t, domid, Int, Long, u32);
P2C(blkif_be_destroy_t, blkif_handle, Int, Long, u32);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
P2C(blkif_be_connect_t, domid, Int, Long, u32);
P2C(blkif_be_connect_t, blkif_handle, Int, Long, u32);
P2C(blkif_be_connect_t, shmem_frame, Int, Long, memory_t);
P2C(blkif_be_connect_t, evtchn, Int, Long, u16);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
P2C(blkif_be_disconnect_t, domid, Int, Long, u32);
P2C(blkif_be_disconnect_t, blkif_handle, Int, Long, u32);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
P2C(blkif_be_vbd_create_t, domid, Int, Long, u32);
P2C(blkif_be_vbd_create_t, blkif_handle, Int, Long, u32);
P2C(blkif_be_vbd_create_t, vdevice, Int, Long, blkif_vdev_t);
P2C(blkif_be_vbd_create_t, readonly, Int, Long, u16);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
P2C(blkif_be_vbd_destroy_t, domid, Int, Long, u32);
P2C(blkif_be_vbd_destroy_t, blkif_handle, Int, Long, u32);
P2C(blkif_be_vbd_destroy_t, vdevice, Int, Long, blkif_vdev_t);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW):
P2C(blkif_be_vbd_grow_t, domid, Int, Long, u32);
P2C(blkif_be_vbd_grow_t, blkif_handle, Int, Long, u32);
P2C(blkif_be_vbd_grow_t, vdevice, Int, Long, blkif_vdev_t);
P2C(blkif_be_vbd_grow_t, extent.sector_start,
Long, UnsignedLongLong, blkif_sector_t);
P2C(blkif_be_vbd_grow_t, extent.sector_length,
Long, UnsignedLongLong, blkif_sector_t);
P2C(blkif_be_vbd_grow_t, extent.device,
Int, Long, blkif_pdev_t);
break;
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_SHRINK):
P2C(blkif_be_vbd_shrink_t, domid, Int, Long, u32);
P2C(blkif_be_vbd_shrink_t, blkif_handle, Int, Long, u32);
P2C(blkif_be_vbd_shrink_t, vdevice, Int, Long, blkif_vdev_t);
break;
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED):
P2C(netif_fe_interface_status_changed_t, handle, Int, Long, u32);
P2C(netif_fe_interface_status_changed_t, status, Int, Long, u32);
P2C(netif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
P2C(netif_fe_interface_status_changed_t, mac[0], Int, Long, u8);
P2C(netif_fe_interface_status_changed_t, mac[1], Int, Long, u8);
P2C(netif_fe_interface_status_changed_t, mac[2], Int, Long, u8);
P2C(netif_fe_interface_status_changed_t, mac[3], Int, Long, u8);
P2C(netif_fe_interface_status_changed_t, mac[4], Int, Long, u8);
P2C(netif_fe_interface_status_changed_t, mac[5], Int, Long, u8);
break;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
P2C(netif_be_create_t, domid, Int, Long, u32);
P2C(netif_be_create_t, netif_handle, Int, Long, u32);
P2C(netif_be_create_t, mac[0], Int, Long, u8);
P2C(netif_be_create_t, mac[1], Int, Long, u8);
P2C(netif_be_create_t, mac[2], Int, Long, u8);
P2C(netif_be_create_t, mac[3], Int, Long, u8);
P2C(netif_be_create_t, mac[4], Int, Long, u8);
P2C(netif_be_create_t, mac[5], Int, Long, u8);
break;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
P2C(netif_be_destroy_t, domid, Int, Long, u32);
P2C(netif_be_destroy_t, netif_handle, Int, Long, u32);
break;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
P2C(netif_be_connect_t, domid, Int, Long, u32);
P2C(netif_be_connect_t, netif_handle, Int, Long, u32);
P2C(netif_be_connect_t, tx_shmem_frame, Int, Long, memory_t);
P2C(netif_be_connect_t, rx_shmem_frame, Int, Long, memory_t);
P2C(netif_be_connect_t, evtchn, Int, Long, u16);
break;
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
P2C(netif_be_disconnect_t, domid, Int, Long, u32);
P2C(netif_be_disconnect_t, netif_handle, Int, Long, u32);
break;
}
return (PyObject *)xum;
fail:
PyObject_Del((PyObject *)xum);
return NULL;
}
static PyObject *xu_message_getattr(PyObject *obj, char *name)
+20 -14
View File
@@ -381,26 +381,32 @@ typedef struct shared_info_st
#define MAX_CMDLINE 256
#define BASIC_START_INFO \
/* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */ \
unsigned long nr_pages; /* total pages allocated to this domain. */ \
unsigned long shared_info; /* MACHINE address of shared info struct.*/ \
unsigned long flags; /* SIF_xxx flags. */ \
memory_t nr_pages; /* 0: Total pages allocated to this domain. */ \
_MEMORY_PADDING(A); \
memory_t shared_info; /* 8: MACHINE address of shared info struct.*/ \
_MEMORY_PADDING(B); \
u32 flags; /* 16: SIF_xxx flags. */ \
u32 __pad; \
/* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ \
unsigned long pt_base; /* VIRTUAL address of page directory. */ \
unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */ \
unsigned long mfn_list; /* VIRTUAL address of page-frame list. */ \
unsigned long mod_start; /* VIRTUAL address of pre-loaded module. */ \
unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ \
unsigned char cmd_line[MAX_CMDLINE]
memory_t pt_base; /* 24: VIRTUAL address of page directory. */ \
_MEMORY_PADDING(C); \
memory_t nr_pt_frames; /* 32: Number of bootstrap p.t. frames. */ \
_MEMORY_PADDING(D); \
memory_t mfn_list; /* 40: VIRTUAL address of page-frame list. */ \
_MEMORY_PADDING(E); \
memory_t mod_start; /* 48: VIRTUAL address of pre-loaded module. */ \
_MEMORY_PADDING(F); \
memory_t mod_len; /* 56: Size (bytes) of pre-loaded module. */ \
_MEMORY_PADDING(G); \
u8 cmd_line[MAX_CMDLINE] /* 64 */
typedef struct {
BASIC_START_INFO;
} start_info_t;
} PACKED start_info_t; /* 320 bytes */
/* These flags are passed in the 'flags' field of start_info_t. */
#define SIF_PRIVILEGED 1 /* Is the domain privileged? */
#define SIF_INITDOMAIN 2 /* Is this the initial control domain? */
#define SIF_BLK_BE_DOMAIN 4 /* Is this a block backend domain? */
#define SIF_NET_BE_DOMAIN 8 /* Is this a net backend domain? */
#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */
#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */
/* For use in guest OSes. */
extern shared_info_t *HYPERVISOR_shared_info;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.