From patchwork Mon Feb 15 08:46:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: EunTaik Lee X-Patchwork-Id: 8311781 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id CAE899F372 for ; Mon, 15 Feb 2016 08:56:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EDFE42049D for ; Mon, 15 Feb 2016 08:56:42 +0000 (UTC) Received: from bombadil.infradead.org (unknown [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79824204A2 for ; Mon, 15 Feb 2016 08:56:41 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1aVEoE-0002S1-7V; Mon, 15 Feb 2016 08:47:06 +0000 Received: from mailout3.samsung.com ([203.254.224.33]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aVEnr-0001xB-Ba for linux-arm-kernel@lists.infradead.org; Mon, 15 Feb 2016 08:46:45 +0000 Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0O2K0223AZ186580@mailout3.samsung.com> for linux-arm-kernel@lists.infradead.org; Mon, 15 Feb 2016 17:46:20 +0900 (KST) Received: from epcpsbgx2.samsung.com ( [203.254.230.43]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 57.3C.04949.B5091C65; Mon, 15 Feb 2016 17:46:19 +0900 (KST) X-AuditID: cbfee68d-f79646d000001355-79-56c1905bff5a Received: from epmailer02 ( [203.254.219.142]) by epcpsbgx2.samsung.com (EPCPMTA) with SMTP id 3C.40.05149.B5091C65; Mon, 15 Feb 2016 17:46:19 +0900 (KST) Date: Mon, 15 Feb 2016 08:46:19 +0000 (GMT) From: EunTaik Lee Subject: [PATCH] arm64: add alignment fault hanling To: "CatalinMarinas X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprDJsWRmVeSWpSXmKPExsVy+t8zbd3oCQfDDO712VhsenyN1YHRY/OS +gDGqAZGm8Si5IzMslSF1Lzk/JTMvHRbpdAQN10LJYWM/OISW6VoIwNjPSNTEz0jE3M9S4NY KyNTJYW8xNxUW6UKXaheJYWi5AKg2tzKYqABOal6UHG94tS8FIes/FKQS/SKE3OLS/PS9ZLz c5UUyhJzSoFGKOknTGXM6Fwwn6XgjVjF2bUv2RoY54h1MXJyCAmoS5zYvYYFxJYQMJHYe3ga E4QtJnHh3no2iJpljBJXXuXC1Ey/NQMozgUUn8Mosfz4a3aQBIuAqkT7/gNgzWwCuhL/P3aB xYUFjCXm337GDNIgItDOIrGr6ScrxFQlifmHG8A28woISpyc+QTqClWJK3sOMULE1SS+P9zH DhGXkJg1/QIrhM0rMaP9KVS9nMS0r2uYIWxpifOzNjDCfLD4+2OoOL/Esds7oD4TkJh65iBU jZbE2Z6XUDafxJqFb6FmCkqcvtbNDLPr/pa5TDA3bG15AnYDs4CixJTuh+wQtpbElx/72ND9 wivgIfFy22YWkOclBFo5JLacvccMCS0BiW+TD7FMYFSchaRnFpK5s5DMRVazgJFlFaNoakFy QXFSepEhcnxvYoQkw94djLcPWB9iFOBgVOLhjThzIEyINbGsuDL3EGMy0OqJzFKiyfnAlJtX Em9obGZkYWpiamxkbmmGIWxiamFhYoRDWEmcV1HqZ7CQQHpiSWp2ampBalF8UWlOavEhRiYO TqkGxs72M7mPOwKC6x7O3DGZIU+cOU/oRfU19js5C6cGqCfrdcq1fBdLv2Fgv5Dzwo4UoRWu HpNTReUWCbd2CYR//2bInntJUt91acjVeemmx1QUjuy6GMjLVCL3qaHK5DhfAy/vvH2V2/dO 5O2P4hTymhxnYLD3vMEyuzkfbBZnOW1YNuNLkdFlJZbijERDLeai4kQAx9QV2a8DAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrHKsWRmVeSWpSXmKPExsVy+t/tPt3oCQfDDPastLDY9PgaqwOjx+Yl 9QGMURk2GamJKalFCql5yfkpmXnptkrewfHO8aZmBoa6hpYW5koKeYm5qbZKLj4Bum6ZOUBD lRTKEnNKgUIBicXFSvp2NkX5pSWpChn5xSW2StFGBsZ6RqYmekbGBnomBrFWhgYGRqZAVQkZ GZ0L5rMUvBGrOLv2JVsD4xyxLkZODiEBdYkTu9ewgNgSAiYS02/NYIOwxSQu3FsPZHMB1cxh lFh+/DU7SIJFQFWiff8BJhCbTUBX4v/HLrC4sICxxPzbz5hBGkQE2lkkdjX9ZIXYoCQx/3AD 2AZeAUGJkzOfQG1Tlbiy5xAjRFxN4vvDfewQcQmJWdMvsELYvBIz2p9C1ctJTPu6hhnClpY4 P2sDI8yli78/horzSxy7vYMJwhaQmHrmIFSNlsTZnpdQNp/EmoVvoWYKSpy+1s0Ms+v+lrlM MDdsbXkCdgOzgKLElO6H7BC2lsSXH/vY0P3CK+Ah8XLbZpYJjDKzkKRmIWmfhaQdWc0CRpZV jKKpBckFxUnpFUZ6xYm5xaV56XrJ+bmbGMFp59miHYz/zlsfYhTgYFTi4Y04cyBMiDWxrLgy 9xCjBAezkgjvs9aDYUK8KYmVValF+fFFpTmpxYcYTYFRNZFZSjQ5H5gS80riDY0NjA0NLc0N TA2NLJTEeQP+rgsTEkhPLEnNTk0tSC2C6WPi4JRqYLSoMCtbWsHkalltNWVL88+OFyWHIi87 aDmIuDF8/D7ZuKkv6kfTUqaffrZ7fP2/1l+uPBnZtz/lzaaVZ+6WTZhh/7Oj8LBGQFCs6fm4 rE8fHExefmTJmSb/V7zi17Rzf34s29r9b6uPZpTlWhf+Txwc5SwzXzatfRYa5rzEbIeM2sJa sZJtykosxRmJhlrMRcWJAC3fAt5RAwAA DLP-Filter: Pass X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160215_004643_706441_882E8F05 X-CRM114-Status: GOOD ( 13.40 ) X-Spam-Score: -6.9 (------) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: eun.taik.lee@samsung.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RDNS_NONE,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Userspace memory is mapped as below: F2A7F000--F2A7FFFF Normal Memory F2A80000--F2A80FFF Device nGnRnE And that userspace application makes a system call as below: -009 |do_strncpy_from_user(inline) -009 |strncpy_from_user() -010 |getname_flags() -011 |user_path_at_empty() -012 |user_path_at() -013 |SYSC_faccessat(inline) -013 |sys_faccessat() -014 |__sys_trace(asm) --> |exception The string spans from 0xF2A7FFC1 to 0xF2A7FFFB. When do_strncpy_from_user() reads the last (unsigned long) value, the alignement fault is triggered. The 8 byte from 0xF2A7FFC1 spans to the next page that is mapped as Device nGnRnE, which does not allow an unaligned access, causes the abort. The instruction which caused the alignment fault is registered in the fixup table but the exception handler does not reach there. This patch registers a alignment fault handler and fixes up the pc if appropriate. Signed-off-by: Eun Taik Lee --- arch/arm64/mm/fault.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 19211c4..8257d4f 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -371,6 +371,16 @@ static int __kprobes do_translation_fault(unsigned long addr, return 0; } +static int __kprobes do_alignment_fault(unsigned long addr, + unsigned int esr, + struct pt_regs *regs) +{ + if (addr >= TASK_SIZE && fixup_exception(regs)) + return 0; + + return 1; +} + /* * This abort handler always returns "fault". */ @@ -418,7 +428,7 @@ static struct fault_info { { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, { do_bad, SIGBUS, 0, "unknown 32" }, - { do_bad, SIGBUS, BUS_ADRALN, "alignment fault" }, + { do_alignment_fault, SIGBUS, BUS_ADRALN, "alignment fault" }, { do_bad, SIGBUS, 0, "debug event" }, { do_bad, SIGBUS, 0, "unknown 35" }, { do_bad, SIGBUS, 0, "unknown 36" },