From bd32c19beaac4007207b682e2d9e55ddeea5a5f6 Mon Sep 17 00:00:00 2001 From: John Levon Date: Tue, 25 May 2021 17:03:27 +0100 Subject: cleanup some python tests (#482) As suggested by Thanos, replace hard-coded struct.pack() with ctypes.Structure objects so it's much clearer what the data being constructed is. Replace some hard-coded unpacking with code based on ctypes::from_buffer_copy(), but in a form that allows us to "pop" a structure from a longer buffer. Signed-off-by: John Levon Reviewed-by: Thanos Makatos --- test/py/libvfio_user.py | 88 ++++++++++++++----- test/py/test_device_get_info.py | 5 +- test/py/test_device_get_region_info.py | 65 ++++++++------ test/py/test_device_set_irqs.py | 153 +++++++++++++++++---------------- 4 files changed, 183 insertions(+), 128 deletions(-) (limited to 'test/py') diff --git a/test/py/libvfio_user.py b/test/py/libvfio_user.py index 9faaf83..a73c228 100644 --- a/test/py/libvfio_user.py +++ b/test/py/libvfio_user.py @@ -178,6 +178,18 @@ libc = c.CDLL("libc.so.6", use_errno=True) # # Structures # + +class Structure(c.Structure): + def __len__(self): + """Handy method to return length in bytes.""" + return len(bytes(self)) + + @classmethod + def pop_from_buffer(cls, buf): + """"Pop a new object from the given bytes buffer.""" + obj = cls.from_buffer_copy(buf) + return obj, buf[c.sizeof(obj):] + class vfu_bar_t(c.Union): _pack_ = 1 _fields_ = [ @@ -185,14 +197,14 @@ class vfu_bar_t(c.Union): ("io", c.c_int) ] -class vfu_pci_hdr_intr_t(c.Structure): +class vfu_pci_hdr_intr_t(Structure): _pack_ = 1 _fields_ = [ ("iline", c.c_byte), ("ipin", c.c_byte) ] -class vfu_pci_hdr_t(c.Structure): +class vfu_pci_hdr_t(Structure): _pack_ = 1 _fields_ = [ ("id", c.c_int), @@ -217,12 +229,63 @@ class vfu_pci_hdr_t(c.Structure): ("mlat", c.c_byte) ] -class iovec_t(c.Structure): +class iovec_t(Structure): _fields_ = [ ("iov_base", c.c_void_p), ("iov_len", c.c_int) ] +class vfio_irq_set(Structure): + _fields_ = [ + ("argsz", c.c_uint), + ("flags", c.c_uint), + ("index", c.c_uint), + ("start", c.c_uint), + ("count", c.c_uint), + ] + +class vfio_user_device_info(Structure): + _fields_ = [ + ("argsz", c.c_uint), + ("flags", c.c_uint), + ("num_regions", c.c_uint), + ("num_irqs", c.c_uint), + ] + +class vfio_region_info(Structure): + _fields_ = [ + ("argsz", c.c_uint), + ("flags", c.c_uint), + ("index", c.c_uint), + ("cap_offset", c.c_uint), + ("size", c.c_ulong), + ("offset", c.c_ulong), + ] + +class vfio_region_info_cap_type(Structure): + _fields_ = [ + ("id", c.c_ushort), + ("version", c.c_ushort), + ("next", c.c_uint), + ("type", c.c_uint), + ("subtype", c.c_uint), + ] + +class vfio_region_info_cap_sparse_mmap(Structure): + _fields_ = [ + ("id", c.c_ushort), + ("version", c.c_ushort), + ("next", c.c_uint), + ("nr_areas", c.c_uint), + ("reserved", c.c_uint), + ] + +class vfio_region_sparse_mmap_area(Structure): + _fields_ = [ + ("offset", c.c_ulong), + ("size", c.c_ulong), + ] + # # Util functions # @@ -264,13 +327,6 @@ def skip(fmt, buf): """Return the data remaining after skipping the given elements.""" return buf[struct.calcsize(fmt):] -def unpack_prefix(fmt, fields, buf): - """Return a namedtuple unpacked from the start of buf, along with the - remaining buf if any.""" - t = namedtuple('_', fields) - size = struct.calcsize(fmt) - return t._make(struct.unpack_from(fmt, buf)), skip(fmt, buf) - def parse_json(json_str): """Parse JSON into an object with attributes (instead of using a dict).""" return json.loads(json_str, object_hook=lambda d: SimpleNamespace(**d)) @@ -372,18 +428,6 @@ def ext_cap_hdr(buf, offset): cap_next >>= 4 return cap_id, cap_next -def vfio_region_info(buf): - return unpack_prefix("IIIIQQ", "argsz flags index cap_off size offset", buf) - -def vfio_region_info_cap_type(buf): - return unpack_prefix("HHIII", "id version next type subtype", buf) - -def vfio_region_info_cap_sparse_mmap(buf): - return unpack_prefix("HHIII", "id version next nr_areas reserved", buf) - -def vfio_region_sparse_mmap_area(buf): - return unpack_prefix("QQ", "offset size", buf) - # # Library wrappers # diff --git a/test/py/test_device_get_info.py b/test/py/test_device_get_info.py index fe44fee..a778604 100644 --- a/test/py/test_device_get_info.py +++ b/test/py/test_device_get_info.py @@ -59,8 +59,7 @@ def test_device_get_info(): # bad argsz - # struct vfio_device_info - payload = struct.pack("IIII", 8, 0, 0, 0) + payload = vfio_user_device_info(argsz=8, flags=0, num_regions=0, num_irqs=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_INFO, size=len(payload)) sock.send(hdr + payload) @@ -69,7 +68,7 @@ def test_device_get_info(): # valid with larger argsz - payload = struct.pack("IIII", 32, 0, 0, 0) + payload = vfio_user_device_info(argsz=32, flags=0, num_regions=0, num_irqs=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_INFO, size=len(payload)) sock.send(hdr + payload) diff --git a/test/py/test_device_get_region_info.py b/test/py/test_device_get_region_info.py index c81d97b..4209cfb 100644 --- a/test/py/test_device_get_region_info.py +++ b/test/py/test_device_get_region_info.py @@ -35,6 +35,8 @@ import os ctx = None sock = None +argsz = len(vfio_region_info()) + def test_device_get_region_info_setup(): global ctx, sock @@ -81,8 +83,9 @@ def test_device_get_region_info_short_write(): def test_device_get_region_info_bad_argsz(): - # struct vfio_region_info - payload = struct.pack("IIIIQQ", 8, 0, VFU_PCI_DEV_BAR1_REGION_IDX, 0, 0, 0) + payload = vfio_region_info(argsz=8, flags=0, + index=VFU_PCI_DEV_BAR1_REGION_IDX, cap_offset=0, + size=0, offset=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) @@ -91,7 +94,9 @@ def test_device_get_region_info_bad_argsz(): def test_device_get_region_info_bad_index(): - payload = struct.pack("IIIIQQ", 32, 0, VFU_PCI_DEV_NUM_REGIONS, 0, 0, 0) + payload = vfio_region_info(argsz=argsz, flags=0, + index=VFU_PCI_DEV_NUM_REGIONS, cap_offset=0, + size=0, offset=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) @@ -100,37 +105,40 @@ def test_device_get_region_info_bad_index(): def test_device_get_region_info_larger_argsz(): - payload = struct.pack("IIIIQQ", 32 + 8, 0, VFU_PCI_DEV_BAR1_REGION_IDX, - 0, 0, 0) + payload = vfio_region_info(argsz=argsz + 8, flags=0, + index=VFU_PCI_DEV_BAR1_REGION_IDX, cap_offset=0, + size=0, offset=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) vfu_run_ctx(ctx) result = get_reply(sock) - assert(len(result) == 32) + assert(len(result) == argsz) - info, _ = vfio_region_info(result) + info, _ = vfio_region_info.pop_from_buffer(result) - assert info.argsz == 32 + assert info.argsz == argsz assert info.flags == (VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE) assert info.index == VFU_PCI_DEV_BAR1_REGION_IDX - assert info.cap_off == 0 + assert info.cap_offset == 0 assert info.size == 4096 assert info.offset == 0 def test_device_get_region_info_small_argsz_caps(): global sock - payload = struct.pack("IIIIQQ", 32, 0, VFU_PCI_DEV_BAR2_REGION_IDX, 0, 0, 0) + payload = vfio_region_info(argsz=argsz, flags=0, + index=VFU_PCI_DEV_BAR2_REGION_IDX, cap_offset=0, + size=0, offset=0) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) vfu_run_ctx(ctx) result = get_reply(sock) - info, _ = vfio_region_info(result) + info, _ = vfio_region_info.pop_from_buffer(result) assert info.argsz == 80 assert info.flags == (VFIO_REGION_INFO_FLAG_READ | @@ -138,7 +146,7 @@ def test_device_get_region_info_small_argsz_caps(): VFIO_REGION_INFO_FLAG_MMAP | VFIO_REGION_INFO_FLAG_CAPS) assert info.index == VFU_PCI_DEV_BAR2_REGION_IDX - assert info.cap_off == 0 + assert info.cap_offset == 0 assert info.size == 0x8000 assert info.offset == 0x8000 @@ -150,21 +158,23 @@ def test_device_get_region_info_caps(): sock = connect_client(ctx) - payload = struct.pack("IIIIQQ", 80, 0, VFU_PCI_DEV_BAR2_REGION_IDX, 0, 0, 0) - payload += b'\0' * (80 - 32) + payload = vfio_region_info(argsz=80, flags=0, + index=VFU_PCI_DEV_BAR2_REGION_IDX, cap_offset=0, + size=0, offset=0) + payload = bytes(payload) + b'\0' * (80 - 32) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) vfu_run_ctx(ctx) result = get_reply(sock) - info, result = vfio_region_info(result) - cap, result = vfio_region_info_cap_sparse_mmap(result) - area1, result = vfio_region_sparse_mmap_area(result) - area2, result = vfio_region_sparse_mmap_area(result) + info, result = vfio_region_info.pop_from_buffer(result) + cap, result = vfio_region_info_cap_sparse_mmap.pop_from_buffer(result) + area1, result = vfio_region_sparse_mmap_area.pop_from_buffer(result) + area2, result = vfio_region_sparse_mmap_area.pop_from_buffer(result) assert info.argsz == 80 - assert info.cap_off == 32 + assert info.cap_offset == 32 assert info.size == 0x8000 assert info.offset == 0x8000 @@ -186,22 +196,23 @@ def test_device_get_region_info_migr(): sock = connect_client(ctx) - payload = struct.pack("IIIIQQ", 80, 0, VFU_PCI_DEV_MIGR_REGION_IDX, - 0, 0, 0) - payload += b'\0' * (80 - 32) + payload = vfio_region_info(argsz=80, flags=0, + index=VFU_PCI_DEV_MIGR_REGION_IDX, cap_offset=0, + size=0, offset=0) + payload = bytes(payload) + b'\0' * (80 - 32) hdr = vfio_user_header(VFIO_USER_DEVICE_GET_REGION_INFO, size=len(payload)) sock.send(hdr + payload) vfu_run_ctx(ctx) result = get_reply(sock) - info, result = vfio_region_info(result) - mcap, result = vfio_region_info_cap_type(result) - cap, result = vfio_region_info_cap_sparse_mmap(result) - area, result = vfio_region_sparse_mmap_area(result) + info, result = vfio_region_info.pop_from_buffer(result) + mcap, result = vfio_region_info_cap_type.pop_from_buffer(result) + cap, result = vfio_region_info_cap_sparse_mmap.pop_from_buffer(result) + area, result = vfio_region_sparse_mmap_area.pop_from_buffer(result) assert info.argsz == 80 - assert info.cap_off == 32 + assert info.cap_offset == 32 assert mcap.id == VFIO_REGION_INFO_CAP_TYPE assert mcap.version == 1 diff --git a/test/py/test_device_set_irqs.py b/test/py/test_device_set_irqs.py index 79c706e..af3a03e 100644 --- a/test/py/test_device_set_irqs.py +++ b/test/py/test_device_set_irqs.py @@ -36,6 +36,8 @@ import sys ctx = None sock = None +argsz = len(vfio_irq_set()) + def test_device_set_irqs_setup(): global ctx, sock @@ -66,9 +68,9 @@ def test_device_set_irqs_short_write(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_argsz(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 3, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_REQ_IRQ, 0, 0) + payload = vfio_irq_set(argsz=3, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_REQ_IRQ, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -76,9 +78,9 @@ def test_device_set_irqs_bad_argsz(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_index(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_NUM_IRQS, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_NUM_IRQS, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -86,9 +88,9 @@ def test_device_set_irqs_bad_index(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_flags_MASK_and_UNMASK(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_ACTION_UNMASK, VFU_DEV_MSIX_IRQ, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_ACTION_UNMASK, index=VFU_DEV_MSIX_IRQ, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -96,10 +98,9 @@ def test_device_set_irqs_bad_flags_MASK_and_UNMASK(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_flags_DATA_NONE_and_DATA_BOOL(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_DATA_BOOL, - VFU_DEV_MSIX_IRQ, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_DATA_BOOL, + index=VFU_DEV_MSIX_IRQ, start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -107,9 +108,9 @@ def test_device_set_irqs_bad_flags_DATA_NONE_and_DATA_BOOL(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_start_count_range(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 2047, 2) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=2047, count=2) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -117,9 +118,9 @@ def test_device_set_irqs_bad_start_count_range(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_start_count_range(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 2049, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=2049, count=1) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -127,9 +128,9 @@ def test_device_set_irqs_bad_start_count_range(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_action_for_err_irq(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_ERR_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_ERR_IRQ, + start=0, count=1) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -137,9 +138,9 @@ def test_device_set_irqs_bad_action_for_err_irq(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_action_for_req_irq(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_REQ_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_REQ_IRQ, + start=0, count=1) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -147,9 +148,9 @@ def test_device_set_irqs_bad_action_for_req_irq(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_start_for_count_0(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 1, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=1, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -157,9 +158,9 @@ def test_device_set_irqs_bad_start_for_count_0(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_action_for_count_0(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_MASK | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_MASK | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -167,9 +168,9 @@ def test_device_set_irqs_bad_action_for_count_0(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_action_and_data_type_for_count_0(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_BOOL, VFU_DEV_MSIX_IRQ, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_BOOL, index=VFU_DEV_MSIX_IRQ, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -177,9 +178,9 @@ def test_device_set_irqs_bad_action_and_data_type_for_count_0(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_bad_fds_for_DATA_BOOL(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_BOOL, VFU_DEV_MSIX_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_BOOL, index=VFU_DEV_MSIX_IRQ, + start=0, count=1) fd = eventfd() @@ -192,9 +193,9 @@ def test_device_set_irqs_bad_fds_for_DATA_BOOL(): os.close(fd) def test_device_set_irqs_bad_fds_for_DATA_NONE(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=0, count=1) fd = eventfd() @@ -207,9 +208,9 @@ def test_device_set_irqs_bad_fds_for_DATA_NONE(): os.close(fd) def test_device_set_irqs_bad_fds_for_count_2(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 0, 2) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) fd = eventfd() @@ -222,18 +223,18 @@ def test_device_set_irqs_bad_fds_for_count_2(): os.close(fd) def test_device_set_irqs_disable(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_REQ_IRQ, 0, 0) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_REQ_IRQ, + start=0, count=0) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) vfu_run_ctx(ctx) get_reply(sock) - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_REQ_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_REQ_IRQ, + start=0, count=1) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -241,9 +242,9 @@ def test_device_set_irqs_disable(): get_reply(sock) def test_device_set_irqs_enable(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_MSIX_IRQ, + start=0, count=1) fd = eventfd() @@ -254,10 +255,10 @@ def test_device_set_irqs_enable(): get_reply(sock) def test_device_set_irqs_trigger_bool_too_small(): - # struct vfio_irq_set - payload = struct.pack("IIIII?", 21, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_BOOL, VFU_DEV_MSIX_IRQ, 0, 2, - False) + payload = vfio_irq_set(argsz=argsz + 1, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_BOOL, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) + payload = bytes(payload) + struct.pack("?", False) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -265,10 +266,10 @@ def test_device_set_irqs_trigger_bool_too_small(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_trigger_bool_too_large(): - # struct vfio_irq_set - payload = struct.pack("IIIII???", 23, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_BOOL, VFU_DEV_MSIX_IRQ, 0, 2, - False, False, False) + payload = vfio_irq_set(argsz=argsz + 3, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_BOOL, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) + payload = bytes(payload) + struct.pack("???", False, False, False) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -276,9 +277,9 @@ def test_device_set_irqs_trigger_bool_too_large(): get_reply(sock, expect=errno.EINVAL) def test_device_set_irqs_enable_update(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 0, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_MSIX_IRQ, + start=0, count=1) fd = eventfd() @@ -289,9 +290,9 @@ def test_device_set_irqs_enable_update(): get_reply(sock) def test_device_set_irqs_enable_trigger_none(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 0, 2) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) fd1 = eventfd(initval=4) fd2 = eventfd(initval=8) @@ -302,9 +303,9 @@ def test_device_set_irqs_enable_trigger_none(): vfu_run_ctx(ctx) get_reply(sock) - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_NONE, VFU_DEV_MSIX_IRQ, 1, 1) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_NONE, index=VFU_DEV_MSIX_IRQ, + start=1, count=1) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) @@ -315,9 +316,9 @@ def test_device_set_irqs_enable_trigger_none(): assert struct.unpack("Q", os.read(fd2, 8))[0] == 9 def test_device_set_irqs_enable_trigger_bool(): - # struct vfio_irq_set - payload = struct.pack("IIIII", 20, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_EVENTFD, VFU_DEV_MSIX_IRQ, 0, 2) + payload = vfio_irq_set(argsz=argsz, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_EVENTFD, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) fd1 = eventfd(initval=4) fd2 = eventfd(initval=8) @@ -328,10 +329,10 @@ def test_device_set_irqs_enable_trigger_bool(): vfu_run_ctx(ctx) get_reply(sock) - # struct vfio_irq_set - payload = struct.pack("IIIII??", 22, VFIO_IRQ_SET_ACTION_TRIGGER | - VFIO_IRQ_SET_DATA_BOOL, VFU_DEV_MSIX_IRQ, 0, 2, - False, True) + payload = vfio_irq_set(argsz=argsz + 2, flags=VFIO_IRQ_SET_ACTION_TRIGGER | + VFIO_IRQ_SET_DATA_BOOL, index=VFU_DEV_MSIX_IRQ, + start=0, count=2) + payload = bytes(payload) + struct.pack("??", False, True) hdr = vfio_user_header(VFIO_USER_DEVICE_SET_IRQS, size=len(payload)) sock.send(hdr + payload) -- cgit v1.1