Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/805771/?format=api
{ "id": 805771, "url": "http://patchwork.ozlabs.org/api/1.2/patches/805771/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/1503639722-19121-11-git-send-email-paulus@ozlabs.org/", "project": { "id": 2, "url": "http://patchwork.ozlabs.org/api/1.2/projects/2/?format=api", "name": "Linux PPC development", "link_name": "linuxppc-dev", "list_id": "linuxppc-dev.lists.ozlabs.org", "list_email": "linuxppc-dev@lists.ozlabs.org", "web_url": "https://github.com/linuxppc/wiki/wiki", "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git", "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/", "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/", "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}" }, "msgid": "<1503639722-19121-11-git-send-email-paulus@ozlabs.org>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/1503639722-19121-11-git-send-email-paulus@ozlabs.org/", "date": "2017-08-25T05:42:02", "name": "[v2,10/10] powerpc/64: Fix update forms of loads and stores to write 64-bit EA", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "0468c7fb0733e2e094f172a5a70b85193f4c9f2b", "submitter": { "id": 67079, "url": "http://patchwork.ozlabs.org/api/1.2/people/67079/?format=api", "name": "Paul Mackerras", "email": "paulus@ozlabs.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/1503639722-19121-11-git-send-email-paulus@ozlabs.org/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/805771/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/805771/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "patchwork-incoming@ozlabs.org", "linuxppc-dev@lists.ozlabs.org" ], "Delivered-To": [ "patchwork-incoming@ozlabs.org", "linuxppc-dev@lists.ozlabs.org", "linuxppc-dev@ozlabs.org" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\t(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xdrdr4xVNz9sRY\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 25 Aug 2017 16:21:20 +1000 (AEST)", "from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 3xdrdr3jbGzDrTT\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 25 Aug 2017 16:21:20 +1000 (AEST)", "from ozlabs.org (bilbo.ozlabs.org [103.22.144.67])\n\t(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 3xdrDW75gKzDrS9\n\tfor <linuxppc-dev@lists.ozlabs.org>;\n\tFri, 25 Aug 2017 16:02:51 +1000 (AEST)", "by ozlabs.org (Postfix)\n\tid 3xdrDW6V1yz9sxR; Fri, 25 Aug 2017 16:02:51 +1000 (AEST)", "from authenticated.ozlabs.org (localhost [127.0.0.1])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPSA id 3xdrDW5Vq5z9sRW\n\tfor <linuxppc-dev@ozlabs.org>; Fri, 25 Aug 2017 16:02:51 +1000 (AEST)" ], "Authentication-Results": [ "ozlabs.org; dkim=pass (2048-bit key;\n\tsecure) header.d=ozlabs.org header.i=@ozlabs.org header.b=\"K//gWG//\";\n\tdkim-atps=neutral", "lists.ozlabs.org; dkim=pass (2048-bit key;\n\tsecure) header.d=ozlabs.org header.i=@ozlabs.org header.b=\"K//gWG//\";\n\tdkim-atps=neutral", "lists.ozlabs.org; dkim=pass (2048-bit key;\n\tsecure) header.d=ozlabs.org header.i=@ozlabs.org header.b=\"K//gWG//\"; \n\tdkim-atps=neutral" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ozlabs.org; s=201707; \n\tt=1503640971; bh=UOKKFXYBOvKGL6pJudpKuAgwcJ4kVl4HmRYVMFasrdA=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=K//gWG//wdNgA24yRI+6P1BsSUGo8IZF3juWeLNu8DRobvPB7Z+hpfgnA4ZcpTXCG\n\tq18mkrW3qLPHI1mJvl9LLD355+aVhGZMehNH+5AXimNJDHV8ZJUfJB6DySdYIROPqN\n\toSiHWd3PHQ3h2/hZcf15gYNhojBIZb6Vd/AinMYrMj5EPxRDflggZjwJEoHV6cWFHd\n\tBDnrxnpP0bGB0nwrpt71EBMQtR6sJ8Qp6RP5tvYzGPFGabzqCy/+8nWBXAqiIDzS5q\n\tNyyySQwY2HVqP7tIAAsUkLgxQj+EmdPEKr6KRhxouhCrsRwdKBRUD9G4jOSS2ihr8a\n\tHGtO9Z2XXqeag==", "From": "Paul Mackerras <paulus@ozlabs.org>", "To": "linuxppc-dev@ozlabs.org", "Subject": "[PATCH v2 10/10] powerpc/64: Fix update forms of loads and stores to\n\twrite 64-bit EA", "Date": "Fri, 25 Aug 2017 15:42:02 +1000", "Message-Id": "<1503639722-19121-11-git-send-email-paulus@ozlabs.org>", "X-Mailer": "git-send-email 2.7.4", "In-Reply-To": "<1503639722-19121-1-git-send-email-paulus@ozlabs.org>", "References": "<1503639722-19121-1-git-send-email-paulus@ozlabs.org>", "X-BeenThere": "linuxppc-dev@lists.ozlabs.org", "X-Mailman-Version": "2.1.23", "Precedence": "list", "List-Id": "Linux on PowerPC Developers Mail List\n\t<linuxppc-dev.lists.ozlabs.org>", "List-Unsubscribe": "<https://lists.ozlabs.org/options/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=unsubscribe>", "List-Archive": "<http://lists.ozlabs.org/pipermail/linuxppc-dev/>", "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>", "List-Help": "<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=help>", "List-Subscribe": "<https://lists.ozlabs.org/listinfo/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=subscribe>", "Errors-To": "linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org", "Sender": "\"Linuxppc-dev\"\n\t<linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org>" }, "content": "When a 64-bit processor is executing in 32-bit mode, the update forms\nof load and store instructions are required by the architecture to\nwrite the full 64-bit effective address into the RA register, though\nonly the bottom 32 bits are used to address memory. Currently,\nthe instruction emulation code writes the truncated address to the\nRA register. This fixes it by keeping the full 64-bit EA in the\ninstruction_op structure, truncating the address in emulate_step()\nwhere it is used to address memory, rather than in the address\ncomputations in analyse_instr().\n\nSigned-off-by: Paul Mackerras <paulus@ozlabs.org>\n---\n arch/powerpc/include/asm/sstep.h | 4 +-\n arch/powerpc/lib/sstep.c | 99 +++++++++++++++++++++-------------------\n 2 files changed, 54 insertions(+), 49 deletions(-)", "diff": "diff --git a/arch/powerpc/include/asm/sstep.h b/arch/powerpc/include/asm/sstep.h\nindex 5a3d3d4..9bf44e2 100644\n--- a/arch/powerpc/include/asm/sstep.h\n+++ b/arch/powerpc/include/asm/sstep.h\n@@ -25,7 +25,7 @@ struct pt_regs;\n \n enum instruction_type {\n \tCOMPUTE,\t\t/* arith/logical/CR op, etc. */\n-\tLOAD,\n+\tLOAD,\t\t\t/* load and store types need to be contiguous */\n \tLOAD_MULTI,\n \tLOAD_FP,\n \tLOAD_VMX,\n@@ -52,6 +52,8 @@ enum instruction_type {\n \n #define INSTR_TYPE_MASK\t0x1f\n \n+#define OP_IS_LOAD_STORE(type)\t(LOAD <= (type) && (type) <= STCX)\n+\n /* Compute flags, ORed in with type */\n #define SETREG\t\t0x20\n #define SETCC\t\t0x40\ndiff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c\nindex 7afb8ef..b8d1d46 100644\n--- a/arch/powerpc/lib/sstep.c\n+++ b/arch/powerpc/lib/sstep.c\n@@ -125,7 +125,7 @@ static nokprobe_inline unsigned long dform_ea(unsigned int instr,\n \tif (ra)\n \t\tea += regs->gpr[ra];\n \n-\treturn truncate_if_32bit(regs->msr, ea);\n+\treturn ea;\n }\n \n #ifdef __powerpc64__\n@@ -143,7 +143,7 @@ static nokprobe_inline unsigned long dsform_ea(unsigned int instr,\n \tif (ra)\n \t\tea += regs->gpr[ra];\n \n-\treturn truncate_if_32bit(regs->msr, ea);\n+\treturn ea;\n }\n \n /*\n@@ -160,7 +160,7 @@ static nokprobe_inline unsigned long dqform_ea(unsigned int instr,\n \tif (ra)\n \t\tea += regs->gpr[ra];\n \n-\treturn truncate_if_32bit(regs->msr, ea);\n+\treturn ea;\n }\n #endif /* __powerpc64 */\n \n@@ -179,7 +179,7 @@ static nokprobe_inline unsigned long xform_ea(unsigned int instr,\n \tif (ra)\n \t\tea += regs->gpr[ra];\n \n-\treturn truncate_if_32bit(regs->msr, ea);\n+\treturn ea;\n }\n \n /*\n@@ -2007,10 +2007,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,\n \t\t\tif (rb == 0)\n \t\t\t\trb = 32;\t/* # bytes to load */\n \t\t\top->type = MKOP(LOAD_MULTI, 0, rb);\n-\t\t\top->ea = 0;\n-\t\t\tif (ra)\n-\t\t\t\top->ea = truncate_if_32bit(regs->msr,\n-\t\t\t\t\t\t\t regs->gpr[ra]);\n+\t\t\top->ea = ra ? regs->gpr[ra] : 0;\n \t\t\tbreak;\n \n #ifdef CONFIG_PPC_FPU\n@@ -2077,10 +2074,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,\n \t\t\tif (rb == 0)\n \t\t\t\trb = 32;\t/* # bytes to store */\n \t\t\top->type = MKOP(STORE_MULTI, 0, rb);\n-\t\t\top->ea = 0;\n-\t\t\tif (ra)\n-\t\t\t\top->ea = truncate_if_32bit(regs->msr,\n-\t\t\t\t\t\t\t regs->gpr[ra]);\n+\t\t\top->ea = ra ? regs->gpr[ra] : 0;\n \t\t\tbreak;\n \n \t\tcase 790:\t/* lhbrx */\n@@ -2787,10 +2781,11 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op)\n int emulate_step(struct pt_regs *regs, unsigned int instr)\n {\n \tstruct instruction_op op;\n-\tint r, err, size;\n+\tint r, err, size, type;\n \tunsigned long val;\n \tunsigned int cr;\n \tint i, rd, nb;\n+\tunsigned long ea;\n \tbool cross_endian;\n \n \tr = analyse_instr(&op, regs, instr);\n@@ -2803,28 +2798,36 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \n \terr = 0;\n \tsize = GETSIZE(op.type);\n+\ttype = op.type & INSTR_TYPE_MASK;\n \tcross_endian = (regs->msr & MSR_LE) != (MSR_KERNEL & MSR_LE);\n-\tswitch (op.type & INSTR_TYPE_MASK) {\n+\n+\tea = op.ea;\n+#ifdef __powerpc64__\n+\tif (OP_IS_LOAD_STORE(type) || type == CACHEOP)\n+\t\tea = truncate_if_32bit(regs->msr, op.ea);\n+#endif\n+\n+\tswitch (type) {\n \tcase CACHEOP:\n-\t\tif (!address_ok(regs, op.ea, 8))\n+\t\tif (!address_ok(regs, ea, 8))\n \t\t\treturn 0;\n \t\tswitch (op.type & CACHEOP_MASK) {\n \t\tcase DCBST:\n-\t\t\t__cacheop_user_asmx(op.ea, err, \"dcbst\");\n+\t\t\t__cacheop_user_asmx(ea, err, \"dcbst\");\n \t\t\tbreak;\n \t\tcase DCBF:\n-\t\t\t__cacheop_user_asmx(op.ea, err, \"dcbf\");\n+\t\t\t__cacheop_user_asmx(ea, err, \"dcbf\");\n \t\t\tbreak;\n \t\tcase DCBTST:\n \t\t\tif (op.reg == 0)\n-\t\t\t\tprefetchw((void *) op.ea);\n+\t\t\t\tprefetchw((void *) ea);\n \t\t\tbreak;\n \t\tcase DCBT:\n \t\t\tif (op.reg == 0)\n-\t\t\t\tprefetch((void *) op.ea);\n+\t\t\t\tprefetch((void *) ea);\n \t\t\tbreak;\n \t\tcase ICBI:\n-\t\t\t__cacheop_user_asmx(op.ea, err, \"icbi\");\n+\t\t\t__cacheop_user_asmx(ea, err, \"icbi\");\n \t\t\tbreak;\n \t\t}\n \t\tif (err)\n@@ -2832,29 +2835,29 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \t\tgoto instr_done;\n \n \tcase LARX:\n-\t\tif (op.ea & (size - 1))\n+\t\tif (ea & (size - 1))\n \t\t\tbreak;\t\t/* can't handle misaligned */\n-\t\tif (!address_ok(regs, op.ea, size))\n+\t\tif (!address_ok(regs, ea, size))\n \t\t\treturn 0;\n \t\terr = 0;\n \t\tswitch (size) {\n #ifdef __powerpc64__\n \t\tcase 1:\n-\t\t\t__get_user_asmx(val, op.ea, err, \"lbarx\");\n+\t\t\t__get_user_asmx(val, ea, err, \"lbarx\");\n \t\t\tbreak;\n \t\tcase 2:\n-\t\t\t__get_user_asmx(val, op.ea, err, \"lharx\");\n+\t\t\t__get_user_asmx(val, ea, err, \"lharx\");\n \t\t\tbreak;\n #endif\n \t\tcase 4:\n-\t\t\t__get_user_asmx(val, op.ea, err, \"lwarx\");\n+\t\t\t__get_user_asmx(val, ea, err, \"lwarx\");\n \t\t\tbreak;\n #ifdef __powerpc64__\n \t\tcase 8:\n-\t\t\t__get_user_asmx(val, op.ea, err, \"ldarx\");\n+\t\t\t__get_user_asmx(val, ea, err, \"ldarx\");\n \t\t\tbreak;\n \t\tcase 16:\n-\t\t\terr = do_lqarx(op.ea, ®s->gpr[op.reg]);\n+\t\t\terr = do_lqarx(ea, ®s->gpr[op.reg]);\n \t\t\tgoto ldst_done;\n #endif\n \t\tdefault:\n@@ -2865,29 +2868,29 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \t\tgoto ldst_done;\n \n \tcase STCX:\n-\t\tif (op.ea & (size - 1))\n+\t\tif (ea & (size - 1))\n \t\t\tbreak;\t\t/* can't handle misaligned */\n-\t\tif (!address_ok(regs, op.ea, size))\n+\t\tif (!address_ok(regs, ea, size))\n \t\t\treturn 0;\n \t\terr = 0;\n \t\tswitch (size) {\n #ifdef __powerpc64__\n \t\tcase 1:\n-\t\t\t__put_user_asmx(op.val, op.ea, err, \"stbcx.\", cr);\n+\t\t\t__put_user_asmx(op.val, ea, err, \"stbcx.\", cr);\n \t\t\tbreak;\n \t\tcase 2:\n-\t\t\t__put_user_asmx(op.val, op.ea, err, \"stbcx.\", cr);\n+\t\t\t__put_user_asmx(op.val, ea, err, \"stbcx.\", cr);\n \t\t\tbreak;\n #endif\n \t\tcase 4:\n-\t\t\t__put_user_asmx(op.val, op.ea, err, \"stwcx.\", cr);\n+\t\t\t__put_user_asmx(op.val, ea, err, \"stwcx.\", cr);\n \t\t\tbreak;\n #ifdef __powerpc64__\n \t\tcase 8:\n-\t\t\t__put_user_asmx(op.val, op.ea, err, \"stdcx.\", cr);\n+\t\t\t__put_user_asmx(op.val, ea, err, \"stdcx.\", cr);\n \t\t\tbreak;\n \t\tcase 16:\n-\t\t\terr = do_stqcx(op.ea, regs->gpr[op.reg],\n+\t\t\terr = do_stqcx(ea, regs->gpr[op.reg],\n \t\t\t\t regs->gpr[op.reg + 1], &cr);\n \t\t\tbreak;\n #endif\n@@ -2903,11 +2906,11 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \tcase LOAD:\n #ifdef __powerpc64__\n \t\tif (size == 16) {\n-\t\t\terr = emulate_lq(regs, op.ea, op.reg, cross_endian);\n+\t\t\terr = emulate_lq(regs, ea, op.reg, cross_endian);\n \t\t\tgoto ldst_done;\n \t\t}\n #endif\n-\t\terr = read_mem(®s->gpr[op.reg], op.ea, size, regs);\n+\t\terr = read_mem(®s->gpr[op.reg], ea, size, regs);\n \t\tif (!err) {\n \t\t\tif (op.type & SIGNEXT)\n \t\t\t\tdo_signext(®s->gpr[op.reg], size);\n@@ -2918,12 +2921,12 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \n #ifdef CONFIG_PPC_FPU\n \tcase LOAD_FP:\n-\t\terr = do_fp_load(op.reg, op.ea, size, regs, cross_endian);\n+\t\terr = do_fp_load(op.reg, ea, size, regs, cross_endian);\n \t\tgoto ldst_done;\n #endif\n #ifdef CONFIG_ALTIVEC\n \tcase LOAD_VMX:\n-\t\terr = do_vec_load(op.reg, op.ea, size, regs, cross_endian);\n+\t\terr = do_vec_load(op.reg, ea, size, regs, cross_endian);\n \t\tgoto ldst_done;\n #endif\n #ifdef CONFIG_VSX\n@@ -2939,13 +2942,13 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \t\t\tnb = size - i;\n \t\t\tif (nb > 4)\n \t\t\t\tnb = 4;\n-\t\t\terr = copy_mem_in((u8 *) &v32, op.ea, nb);\n+\t\t\terr = copy_mem_in((u8 *) &v32, ea, nb);\n \t\t\tif (err)\n \t\t\t\treturn 0;\n \t\t\tif (unlikely(cross_endian))\n \t\t\t\tv32 = byterev_4(v32);\n \t\t\tregs->gpr[rd] = v32;\n-\t\t\top.ea += 4;\n+\t\t\tea += 4;\n \t\t\t++rd;\n \t\t}\n \t\tgoto instr_done;\n@@ -2953,30 +2956,30 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \tcase STORE:\n #ifdef __powerpc64__\n \t\tif (size == 16) {\n-\t\t\terr = emulate_stq(regs, op.ea, op.reg, cross_endian);\n+\t\t\terr = emulate_stq(regs, ea, op.reg, cross_endian);\n \t\t\tgoto ldst_done;\n \t\t}\n #endif\n \t\tif ((op.type & UPDATE) && size == sizeof(long) &&\n \t\t op.reg == 1 && op.update_reg == 1 &&\n \t\t !(regs->msr & MSR_PR) &&\n-\t\t op.ea >= regs->gpr[1] - STACK_INT_FRAME_SIZE) {\n-\t\t\terr = handle_stack_update(op.ea, regs);\n+\t\t ea >= regs->gpr[1] - STACK_INT_FRAME_SIZE) {\n+\t\t\terr = handle_stack_update(ea, regs);\n \t\t\tgoto ldst_done;\n \t\t}\n \t\tif (unlikely(cross_endian))\n \t\t\tdo_byterev(&op.val, size);\n-\t\terr = write_mem(op.val, op.ea, size, regs);\n+\t\terr = write_mem(op.val, ea, size, regs);\n \t\tgoto ldst_done;\n \n #ifdef CONFIG_PPC_FPU\n \tcase STORE_FP:\n-\t\terr = do_fp_store(op.reg, op.ea, size, regs, cross_endian);\n+\t\terr = do_fp_store(op.reg, ea, size, regs, cross_endian);\n \t\tgoto ldst_done;\n #endif\n #ifdef CONFIG_ALTIVEC\n \tcase STORE_VMX:\n-\t\terr = do_vec_store(op.reg, op.ea, size, regs, cross_endian);\n+\t\terr = do_vec_store(op.reg, ea, size, regs, cross_endian);\n \t\tgoto ldst_done;\n #endif\n #ifdef CONFIG_VSX\n@@ -2994,10 +2997,10 @@ int emulate_step(struct pt_regs *regs, unsigned int instr)\n \t\t\t\tnb = 4;\n \t\t\tif (unlikely(cross_endian))\n \t\t\t\tv32 = byterev_4(v32);\n-\t\t\terr = copy_mem_out((u8 *) &v32, op.ea, nb);\n+\t\t\terr = copy_mem_out((u8 *) &v32, ea, nb);\n \t\t\tif (err)\n \t\t\t\treturn 0;\n-\t\t\top.ea += 4;\n+\t\t\tea += 4;\n \t\t\t++rd;\n \t\t}\n \t\tgoto instr_done;\n", "prefixes": [ "v2", "10/10" ] }