From: Greg Kroah-Hartman Date: Mon, 19 Apr 2021 12:24:30 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v5.4.114~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5a861ff91446e9a1c8cfeb7d7aae4593b1f41384;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: arm-9071-1-uprobes-don-t-hook-on-thumb-instructions.patch net-phy-marvell-fix-detection-of-phy-on-topaz-switches.patch --- diff --git a/queue-5.4/arm-9071-1-uprobes-don-t-hook-on-thumb-instructions.patch b/queue-5.4/arm-9071-1-uprobes-don-t-hook-on-thumb-instructions.patch new file mode 100644 index 00000000000..afd5f7cbfc9 --- /dev/null +++ b/queue-5.4/arm-9071-1-uprobes-don-t-hook-on-thumb-instructions.patch @@ -0,0 +1,48 @@ +From d2f7eca60b29006285d57c7035539e33300e89e5 Mon Sep 17 00:00:00 2001 +From: Fredrik Strupe +Date: Mon, 5 Apr 2021 21:52:05 +0100 +Subject: ARM: 9071/1: uprobes: Don't hook on thumb instructions + +From: Fredrik Strupe + +commit d2f7eca60b29006285d57c7035539e33300e89e5 upstream. + +Since uprobes is not supported for thumb, check that the thumb bit is +not set when matching the uprobes instruction hooks. + +The Arm UDF instructions used for uprobes triggering +(UPROBE_SWBP_ARM_INSN and UPROBE_SS_ARM_INSN) coincidentally share the +same encoding as a pair of unallocated 32-bit thumb instructions (not +UDF) when the condition code is 0b1111 (0xf). This in effect makes it +possible to trigger the uprobes functionality from thumb, and at that +using two unallocated instructions which are not permanently undefined. + +Signed-off-by: Fredrik Strupe +Cc: stable@vger.kernel.org +Fixes: c7edc9e326d5 ("ARM: add uprobes support") +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/probes/uprobes/core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/arch/arm/probes/uprobes/core.c ++++ b/arch/arm/probes/uprobes/core.c +@@ -204,7 +204,7 @@ unsigned long uprobe_get_swbp_addr(struc + static struct undef_hook uprobes_arm_break_hook = { + .instr_mask = 0x0fffffff, + .instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff), +- .cpsr_mask = MODE_MASK, ++ .cpsr_mask = (PSR_T_BIT | MODE_MASK), + .cpsr_val = USR_MODE, + .fn = uprobe_trap_handler, + }; +@@ -212,7 +212,7 @@ static struct undef_hook uprobes_arm_bre + static struct undef_hook uprobes_arm_ss_hook = { + .instr_mask = 0x0fffffff, + .instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff), +- .cpsr_mask = MODE_MASK, ++ .cpsr_mask = (PSR_T_BIT | MODE_MASK), + .cpsr_val = USR_MODE, + .fn = uprobe_trap_handler, + }; diff --git a/queue-5.4/net-phy-marvell-fix-detection-of-phy-on-topaz-switches.patch b/queue-5.4/net-phy-marvell-fix-detection-of-phy-on-topaz-switches.patch new file mode 100644 index 00000000000..6534a46108a --- /dev/null +++ b/queue-5.4/net-phy-marvell-fix-detection-of-phy-on-topaz-switches.patch @@ -0,0 +1,164 @@ +From 1fe976d308acb6374c899a4ee8025a0a016e453e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Mon, 12 Apr 2021 18:57:39 +0200 +Subject: net: phy: marvell: fix detection of PHY on Topaz switches +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Pali Rohár + +commit 1fe976d308acb6374c899a4ee8025a0a016e453e upstream. + +Since commit fee2d546414d ("net: phy: marvell: mv88e6390 temperature +sensor reading"), Linux reports the temperature of Topaz hwmon as +constant -75°C. + +This is because switches from the Topaz family (88E6141 / 88E6341) have +the address of the temperature sensor register different from Peridot. + +This address is instead compatible with 88E1510 PHYs, as was used for +Topaz before the above mentioned commit. + +Create a new mapping table between switch family and PHY ID for families +which don't have a model number. And define PHY IDs for Topaz and Peridot +families. + +Create a new PHY ID and a new PHY driver for Topaz's internal PHY. +The only difference from Peridot's PHY driver is the HWMON probing +method. + +Prior this change Topaz's internal PHY is detected by kernel as: + + PHY [...] driver [Marvell 88E6390] (irq=63) + +And afterwards as: + + PHY [...] driver [Marvell 88E6341 Family] (irq=63) + +Signed-off-by: Pali Rohár +BugLink: https://github.com/globalscaletechnologies/linux/issues/1 +Fixes: fee2d546414d ("net: phy: marvell: mv88e6390 temperature sensor reading") +Reviewed-by: Marek Behún +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/dsa/mv88e6xxx/chip.c | 30 +++++++++++++----------------- + drivers/net/phy/marvell.c | 29 ++++++++++++++++++++++++++--- + include/linux/marvell_phy.h | 5 +++-- + 3 files changed, 42 insertions(+), 22 deletions(-) + +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -2766,10 +2766,17 @@ unlock: + return err; + } + ++/* prod_id for switch families which do not have a PHY model number */ ++static const u16 family_prod_id_table[] = { ++ [MV88E6XXX_FAMILY_6341] = MV88E6XXX_PORT_SWITCH_ID_PROD_6341, ++ [MV88E6XXX_FAMILY_6390] = MV88E6XXX_PORT_SWITCH_ID_PROD_6390, ++}; ++ + static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg) + { + struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; + struct mv88e6xxx_chip *chip = mdio_bus->chip; ++ u16 prod_id; + u16 val; + int err; + +@@ -2780,23 +2787,12 @@ static int mv88e6xxx_mdio_read(struct mi + err = chip->info->ops->phy_read(chip, bus, phy, reg, &val); + mv88e6xxx_reg_unlock(chip); + +- if (reg == MII_PHYSID2) { +- /* Some internal PHYs don't have a model number. */ +- if (chip->info->family != MV88E6XXX_FAMILY_6165) +- /* Then there is the 6165 family. It gets is +- * PHYs correct. But it can also have two +- * SERDES interfaces in the PHY address +- * space. And these don't have a model +- * number. But they are not PHYs, so we don't +- * want to give them something a PHY driver +- * will recognise. +- * +- * Use the mv88e6390 family model number +- * instead, for anything which really could be +- * a PHY, +- */ +- if (!(val & 0x3f0)) +- val |= MV88E6XXX_PORT_SWITCH_ID_PROD_6390 >> 4; ++ /* Some internal PHYs don't have a model number. */ ++ if (reg == MII_PHYSID2 && !(val & 0x3f0) && ++ chip->info->family < ARRAY_SIZE(family_prod_id_table)) { ++ prod_id = family_prod_id_table[chip->info->family]; ++ if (prod_id) ++ val |= prod_id >> 4; + } + + return err ? err : val; +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -2401,9 +2401,31 @@ static struct phy_driver marvell_drivers + .get_stats = marvell_get_stats, + }, + { +- .phy_id = MARVELL_PHY_ID_88E6390, ++ .phy_id = MARVELL_PHY_ID_88E6341_FAMILY, + .phy_id_mask = MARVELL_PHY_ID_MASK, +- .name = "Marvell 88E6390", ++ .name = "Marvell 88E6341 Family", ++ /* PHY_GBIT_FEATURES */ ++ .probe = m88e1510_probe, ++ .config_init = &marvell_config_init, ++ .config_aneg = &m88e6390_config_aneg, ++ .read_status = &marvell_read_status, ++ .ack_interrupt = &marvell_ack_interrupt, ++ .config_intr = &marvell_config_intr, ++ .did_interrupt = &m88e1121_did_interrupt, ++ .resume = &genphy_resume, ++ .suspend = &genphy_suspend, ++ .read_page = marvell_read_page, ++ .write_page = marvell_write_page, ++ .get_sset_count = marvell_get_sset_count, ++ .get_strings = marvell_get_strings, ++ .get_stats = marvell_get_stats, ++ .get_tunable = m88e1540_get_tunable, ++ .set_tunable = m88e1540_set_tunable, ++ }, ++ { ++ .phy_id = MARVELL_PHY_ID_88E6390_FAMILY, ++ .phy_id_mask = MARVELL_PHY_ID_MASK, ++ .name = "Marvell 88E6390 Family", + /* PHY_GBIT_FEATURES */ + .probe = m88e6390_probe, + .config_init = &marvell_config_init, +@@ -2441,7 +2463,8 @@ static struct mdio_device_id __maybe_unu + { MARVELL_PHY_ID_88E1540, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E1545, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E3016, MARVELL_PHY_ID_MASK }, +- { MARVELL_PHY_ID_88E6390, MARVELL_PHY_ID_MASK }, ++ { MARVELL_PHY_ID_88E6341_FAMILY, MARVELL_PHY_ID_MASK }, ++ { MARVELL_PHY_ID_88E6390_FAMILY, MARVELL_PHY_ID_MASK }, + { } + }; + +--- a/include/linux/marvell_phy.h ++++ b/include/linux/marvell_phy.h +@@ -23,11 +23,12 @@ + #define MARVELL_PHY_ID_88X3310 0x002b09a0 + #define MARVELL_PHY_ID_88E2110 0x002b09b0 + +-/* The MV88e6390 Ethernet switch contains embedded PHYs. These PHYs do ++/* These Ethernet switch families contain embedded PHYs, but they do + * not have a model ID. So the switch driver traps reads to the ID2 + * register and returns the switch family ID + */ +-#define MARVELL_PHY_ID_88E6390 0x01410f90 ++#define MARVELL_PHY_ID_88E6341_FAMILY 0x01410f41 ++#define MARVELL_PHY_ID_88E6390_FAMILY 0x01410f90 + + #define MARVELL_PHY_FAMILY_ID(id) ((id) >> 4) + diff --git a/queue-5.4/series b/queue-5.4/series index 8d879b7acdd..0aca272568c 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -69,3 +69,5 @@ r8169-fix-performance-regression-related-to-pcie-max.patch r8169-improve-rtl_jumbo_config.patch r8169-tweak-max-read-request-size-for-newer-chips-al.patch r8169-don-t-advertise-pause-in-jumbo-mode.patch +arm-9071-1-uprobes-don-t-hook-on-thumb-instructions.patch +net-phy-marvell-fix-detection-of-phy-on-topaz-switches.patch