Skip to content

Commit 53019a9

Browse files
Baoquan Hejoergroedel
authored andcommitted
iommu/amd: Do sanity check for address translation and irq remap of old dev table entry
Firstly split the dev table entry copy into address translation part and irq remapping part. Because these two parts could be enabled independently. Secondly do sanity check for address translation and irq remap of old dev table entry separately. Signed-off-by: Baoquan He <bhe@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent 3ac3e5e commit 53019a9

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

drivers/iommu/amd_iommu.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3776,11 +3776,6 @@ EXPORT_SYMBOL(amd_iommu_device_info);
37763776

37773777
static struct irq_chip amd_ir_chip;
37783778

3779-
#define DTE_IRQ_PHYS_ADDR_MASK (((1ULL << 45)-1) << 6)
3780-
#define DTE_IRQ_REMAP_INTCTL (2ULL << 60)
3781-
#define DTE_IRQ_TABLE_LEN (8ULL << 1)
3782-
#define DTE_IRQ_REMAP_ENABLE 1ULL
3783-
37843779
static void set_dte_irq_entry(u16 devid, struct irq_remap_table *table)
37853780
{
37863781
u64 dte;

drivers/iommu/amd_iommu_init.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -852,12 +852,12 @@ static int get_dev_entry_bit(u16 devid, u8 bit)
852852

853853
static bool copy_device_table(void)
854854
{
855+
u64 int_ctl, int_tab_len, entry, last_entry = 0;
855856
struct dev_table_entry *old_devtb = NULL;
856857
u32 lo, hi, devid, old_devtb_size;
857858
phys_addr_t old_devtb_phys;
858-
u64 entry, last_entry = 0;
859859
struct amd_iommu *iommu;
860-
u16 dom_id, dte_v;
860+
u16 dom_id, dte_v, irq_v;
861861
gfp_t gfp_flag;
862862

863863
if (!amd_iommu_pre_enabled)
@@ -901,8 +901,25 @@ static bool copy_device_table(void)
901901
old_dev_tbl_cpy[devid] = old_devtb[devid];
902902
dom_id = old_devtb[devid].data[1] & DEV_DOMID_MASK;
903903
dte_v = old_devtb[devid].data[0] & DTE_FLAG_V;
904-
if (dte_v && dom_id)
904+
905+
if (dte_v && dom_id) {
906+
old_dev_tbl_cpy[devid].data[0] = old_devtb[devid].data[0];
907+
old_dev_tbl_cpy[devid].data[1] = old_devtb[devid].data[1];
905908
__set_bit(dom_id, amd_iommu_pd_alloc_bitmap);
909+
}
910+
911+
irq_v = old_devtb[devid].data[2] & DTE_IRQ_REMAP_ENABLE;
912+
int_ctl = old_devtb[devid].data[2] & DTE_IRQ_REMAP_INTCTL_MASK;
913+
int_tab_len = old_devtb[devid].data[2] & DTE_IRQ_TABLE_LEN_MASK;
914+
if (irq_v && (int_ctl || int_tab_len)) {
915+
if ((int_ctl != DTE_IRQ_REMAP_INTCTL) ||
916+
(int_tab_len != DTE_IRQ_TABLE_LEN)) {
917+
pr_err("Wrong old irq remapping flag: %#x\n", devid);
918+
return false;
919+
}
920+
921+
old_dev_tbl_cpy[devid].data[2] = old_devtb[devid].data[2];
922+
}
906923
}
907924
memunmap(old_devtb);
908925

drivers/iommu/amd_iommu_types.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@
250250

251251
#define GA_GUEST_NR 0x1
252252

253+
/* Bit value definition for dte irq remapping fields*/
254+
#define DTE_IRQ_PHYS_ADDR_MASK (((1ULL << 45)-1) << 6)
255+
#define DTE_IRQ_REMAP_INTCTL_MASK (0x3ULL << 60)
256+
#define DTE_IRQ_TABLE_LEN_MASK (0xfULL << 1)
257+
#define DTE_IRQ_REMAP_INTCTL (2ULL << 60)
258+
#define DTE_IRQ_TABLE_LEN (8ULL << 1)
259+
#define DTE_IRQ_REMAP_ENABLE 1ULL
260+
253261
#define PAGE_MODE_NONE 0x00
254262
#define PAGE_MODE_1_LEVEL 0x01
255263
#define PAGE_MODE_2_LEVEL 0x02

0 commit comments

Comments
 (0)