virtio: use instance value to initialise C instance parameter

This simplifies the open word by avoiding having to locate and read the value
of the _vdev property.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
Mark Cave-Ayland 2019-08-18 21:16:50 +01:00
parent 5a2ec0dcd0
commit 412fc43324
1 changed files with 11 additions and 35 deletions

View File

@ -337,9 +337,14 @@ ob_virtio_configure_device(VDev *vdev)
static void
ob_virtio_disk_open(VDev **_vdev)
{
VDev *vdev = *_vdev;
VDev *vdev;
phandle_t ph;
PUSH(find_ih_method("vdev", my_self()));
fword("execute");
*_vdev = cell2pointer(POP());
vdev = *_vdev;
vdev->pos = 0;
if (!vdev->configured) {
@ -409,24 +414,9 @@ static void set_virtio_alias(const char *path, int idx)
set_property(aliases, name, path, strlen(path) + 1);
}
static void
ob_virtio_disk_initialize(VDev **_vdev)
{
phandle_t ph = get_cur_dev();
VDev *vdev;
int len;
vdev = cell2pointer(get_int_property(ph, "_vdev", &len));
push_str("_vdev");
feval("delete-property");
*_vdev = vdev;
}
DECLARE_UNNAMED_NODE(ob_virtio_disk, 0, sizeof(VDev *));
NODE_METHODS(ob_virtio_disk) = {
{ NULL, ob_virtio_disk_initialize },
{ "open", ob_virtio_disk_open },
{ "close", ob_virtio_disk_close },
{ "seek", ob_virtio_disk_seek },
@ -445,12 +435,6 @@ ob_virtio_close(VDev **_vdev)
return;
}
static void
ob_virtio_vdev(VDev **_vdev)
{
PUSH(pointer2cell(_vdev));
}
static void
ob_virtio_dma_alloc(__attribute__((unused)) VDev **_vdev)
{
@ -486,7 +470,6 @@ DECLARE_UNNAMED_NODE(ob_virtio, 0, sizeof(VDev *));
NODE_METHODS(ob_virtio) = {
{ "open", ob_virtio_open },
{ "close", ob_virtio_close },
{ "vdev", ob_virtio_vdev },
{ "dma-alloc", ob_virtio_dma_alloc },
{ "dma-free", ob_virtio_dma_free },
{ "dma-map-in", ob_virtio_dma_map_in },
@ -499,18 +482,12 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg,
int idx)
{
char buf[256];
phandle_t ph;
ucell addr;
VDev *vdev, **_vdev;
VDev *vdev;
/* Open ob_virtio */
BIND_NODE_METHODS(get_cur_dev(), ob_virtio);
ph = find_ih_method("vdev", my_self());
PUSH(ph);
fword("execute");
_vdev = cell2pointer(POP());
vdev = malloc(sizeof(VDev));
vdev->common_cfg = common_cfg;
vdev->device_cfg = device_cfg;
@ -518,6 +495,9 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg,
vdev->notify_mult = notify_mult;
vdev->configured = 0;
PUSH(pointer2cell(vdev));
feval("value vdev");
PUSH(sizeof(VRing) * VIRTIO_MAX_VQS);
feval("dma-alloc");
addr = POP();
@ -528,8 +508,6 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg,
addr = POP();
vdev->ring_area = cell2pointer(addr);
*_vdev = vdev;
fword("new-device");
push_str("disk");
fword("device-name");
@ -537,9 +515,7 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg,
fword("device-type");
PUSH(pointer2cell(vdev));
fword("encode-int");
push_str("_vdev");
fword("property");
feval("value vdev");
BIND_NODE_METHODS(get_cur_dev(), ob_virtio_disk);
fword("finish-device");