mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 10:31:33 -04:00
s390/vfio_ccw: Calculate idal length based on idaw type
Sashiko pointed out that get_guest_idal() unconditionally calculates
the length of the IDAL presuming everything is a Format-2 IDAW.
The output of vfio-ccw is always Format-2, but the input can be either
Format-1 (31-bit addresses) or Format-2 (64-bit addresses). As a result,
the size of the guest IDAL may be incorrect and should be trimmed down.
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Link: https://lore.kernel.org/r/20260720203400.7328E1F000E9@smtp.kernel.org/
Fixes: 1b676fe3d9 ("vfio/ccw: handle a guest Format-1 IDAL")
Cc: stable@vger.kernel.org
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
This commit is contained in:
committed by
Christian Borntraeger
parent
565bef268d
commit
4f6fdc6e1a
@@ -233,6 +233,7 @@ static void convert_ccw0_to_ccw1(struct ccw1 *source, unsigned long len)
|
||||
}
|
||||
|
||||
#define idal_is_2k(_cp) (!(_cp)->orb.cmd.c64 || (_cp)->orb.cmd.i2k)
|
||||
#define get_idaw_size(_cp) ((_cp)->orb.cmd.c64 ? sizeof(u64) : sizeof(u32))
|
||||
|
||||
/*
|
||||
* Helpers to operate ccwchain.
|
||||
@@ -524,7 +525,7 @@ static dma64_t *get_guest_idal(struct ccw1 *ccw, struct channel_program *cp, int
|
||||
dma64_t *idaws;
|
||||
dma32_t *idaws_f1;
|
||||
u64 first_idaw;
|
||||
int idal_len = idaw_nr * sizeof(*idaws);
|
||||
int idal_len = idaw_nr * get_idaw_size(cp);
|
||||
int idaw_size = idal_is_2k(cp) ? PAGE_SIZE / 2 : PAGE_SIZE;
|
||||
int idaw_mask = ~(idaw_size - 1);
|
||||
int i, ret;
|
||||
@@ -593,7 +594,7 @@ static int ccw_count_idaws(struct ccw1 *ccw,
|
||||
struct vfio_device *vdev =
|
||||
&container_of(cp, struct vfio_ccw_private, cp)->vdev;
|
||||
u64 iova;
|
||||
int size = cp->orb.cmd.c64 ? sizeof(u64) : sizeof(u32);
|
||||
int size = get_idaw_size(cp);
|
||||
int ret;
|
||||
int bytes = 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user