Skip to content

Commit 7997ddd

Browse files
Hao Lankuba-moo
authored andcommitted
net: hns3: fixed hclge_fetch_pf_reg accesses bar space out of bounds issue
The TQP BAR space is divided into two segments. TQPs 0-1023 and TQPs 1024-1279 are in different BAR space addresses. However, hclge_fetch_pf_reg does not distinguish the tqp space information when reading the tqp space information. When the number of TQPs is greater than 1024, access bar space overwriting occurs. The problem of different segments has been considered during the initialization of tqp.io_base. Therefore, tqp.io_base is directly used when the queue is read in hclge_fetch_pf_reg. The error message: Unable to handle kernel paging request at virtual address ffff800037200000 pc : hclge_fetch_pf_reg+0x138/0x250 [hclge] lr : hclge_get_regs+0x84/0x1d0 [hclge] Call trace: hclge_fetch_pf_reg+0x138/0x250 [hclge] hclge_get_regs+0x84/0x1d0 [hclge] hns3_get_regs+0x2c/0x50 [hns3] ethtool_get_regs+0xf4/0x270 dev_ethtool+0x674/0x8a0 dev_ioctl+0x270/0x36c sock_do_ioctl+0x110/0x2a0 sock_ioctl+0x2ac/0x530 __arm64_sys_ioctl+0xa8/0x100 invoke_syscall+0x4c/0x124 el0_svc_common.constprop.0+0x140/0x15c do_el0_svc+0x30/0xd0 el0_svc+0x1c/0x2c el0_sync_handler+0xb0/0xb4 el0_sync+0x168/0x180 Fixes: 939ccd1 ("net: hns3: move dump regs function to a separate file") Signed-off-by: Hao Lan <[email protected]> Signed-off-by: Jijie Shao <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 247fd1e commit 7997ddd

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,9 @@ static int hclge_get_dfx_reg(struct hclge_dev *hdev, void *data)
510510
static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,
511511
struct hnae3_knic_private_info *kinfo)
512512
{
513-
#define HCLGE_RING_REG_OFFSET 0x200
514513
#define HCLGE_RING_INT_REG_OFFSET 0x4
515514

515+
struct hnae3_queue *tqp;
516516
int i, j, reg_num;
517517
int data_num_sum;
518518
u32 *reg = data;
@@ -533,10 +533,11 @@ static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,
533533
reg_num = ARRAY_SIZE(ring_reg_addr_list);
534534
for (j = 0; j < kinfo->num_tqps; j++) {
535535
reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RING, reg_num, reg);
536+
tqp = kinfo->tqp[j];
536537
for (i = 0; i < reg_num; i++)
537-
*reg++ = hclge_read_dev(&hdev->hw,
538-
ring_reg_addr_list[i] +
539-
HCLGE_RING_REG_OFFSET * j);
538+
*reg++ = readl_relaxed(tqp->io_base -
539+
HCLGE_TQP_REG_OFFSET +
540+
ring_reg_addr_list[i]);
540541
}
541542
data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * kinfo->num_tqps;
542543

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ int hclgevf_get_regs_len(struct hnae3_handle *handle)
123123
void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,
124124
void *data)
125125
{
126-
#define HCLGEVF_RING_REG_OFFSET 0x200
127126
#define HCLGEVF_RING_INT_REG_OFFSET 0x4
128127

129128
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
129+
struct hnae3_queue *tqp;
130130
int i, j, reg_um;
131131
u32 *reg = data;
132132

@@ -147,10 +147,11 @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,
147147
reg_um = ARRAY_SIZE(ring_reg_addr_list);
148148
for (j = 0; j < hdev->num_tqps; j++) {
149149
reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg);
150+
tqp = &hdev->htqp[j].q;
150151
for (i = 0; i < reg_um; i++)
151-
*reg++ = hclgevf_read_dev(&hdev->hw,
152-
ring_reg_addr_list[i] +
153-
HCLGEVF_RING_REG_OFFSET * j);
152+
*reg++ = readl_relaxed(tqp->io_base -
153+
HCLGEVF_TQP_REG_OFFSET +
154+
ring_reg_addr_list[i]);
154155
}
155156

156157
reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list);

0 commit comments

Comments
 (0)