From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752561AbcBOIqh (ORCPT ); Mon, 15 Feb 2016 03:46:37 -0500 Received: from mailout1.samsung.com ([203.254.224.24]:43970 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752289AbcBOIqW (ORCPT ); Mon, 15 Feb 2016 03:46:22 -0500 X-AuditID: cbfee690-f79646d000001316-b0-56c1905c8257 Date: Mon, 15 Feb 2016 08:46:20 +0000 (GMT) From: EunTaik Lee Subject: [PATCH] arm64: add alignment fault hanling To: "CatalinMarinas X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprDJsWRmVeSWpSXmKPExsVy+t8zTd2YCQfDDJoey1pc3jWHzYHR4/Mm uQDGqAZGm8Si5IzMslSF1Lzk/JTMvHRbpdAQN10LJYWM/OISW6VoIwNjPSNTEz0jE3M9S4NY KyNTJYW8xNxUW6UKXaheJYWi5AKg2tzKYqABOal6UHG94tS8FIes/FKQS/SKE3OLS/PS9ZLz c5UUyhJzSoFGKOknTGXM6Fwwn6XgjVjF2bUv2RoY54h1MXJyCAmoS5zYvYali5GDQ0LARGLv C2eQsISAmMSFe+vZuhi5gEqWMUqsfdvGBpEwkWha+IkVIjGHUeLjkUPsIAkWAVWJrve3mUBs NgFdif8fu8DiwgLGEvNvP2MGaRARaGeR2NX0kxVis5LE/MMNLCA2r4CgxMmZT1ggNqhKXNlz iBEiribx/eE+doi4hMSs6RdYIWxeiRntT6Hq5SSmfV3DDGFLS5yftYER5oXF3x9Dxfkljt3e wQRhC0hMPXMQqkZL4mzPSyibT2LNwrdQMwUlTl/rZobZdX/LXCaYG7a2PAG7gVlAUWJK90N2 CFtL4suPfWzofuEV8JB4uW0zC8jzEgKdHBJ/Ns1jgoSWgMS3yYdYJjAqzkLSMwvJ3FlI5iKr WcDIsopRNLUguaA4Kb3IBDm+NzFCkuGEHYz3DlgfYhTgYFTi4Y04cyBMiDWxrLgy9xBjMtDq icxSosn5wJSbVxJvaGxmZGFqYmpsZG5phiFsYmphYWKEQ1hJnPe11M9gIYH0xJLU7NTUgtSi +KLSnNTiQ4xMHJxSDYyesfIihfen74pP6VlS7ZuVsCTZ/m+LhGCqI+Ns090P3/YplIg1ChpN v88v63GI4dVP79RqPq3va0LZHbjkWI7zPW0z+mS//fE7/a6Whdte9DEoHVK9LbW+fHX+s81a gne7/TYJzdrB/WXeX/8sFYnUzqeXg2u/9zdO2RVtbMsw8fBnw/vT9iixFGckGmoxFxUnAgAq tWunrwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrHKsWRmVeSWpSXmKPExsVy+t/tPt2YCQfDDHZMl7K4vGsOmwOjx+dN cgGMURk2GamJKalFCql5yfkpmXnptkrewfHO8aZmBoa6hpYW5koKeYm5qbZKLj4Bum6ZOUBD lRTKEnNKgUIBicXFSvp2NkX5pSWpChn5xSW2StFGBsZ6RqYmekbGBnomBrFWhgYGRqZAVQkZ GZ0L5rMUvBGrOLv2JVsD4xyxLkZODiEBdYkTu9ewgNgSAiYSTQs/sULYYhIX7q1n62LkAqqZ wyjx8cghdpAEi4CqRNf720wgNpuArsT/j11gcWEBY4n5t58xgzSICLSzSOxq+skKsUFJYv7h BrANvAKCEidnPoHapipxZc8hRoi4msT3h/vYIeISErOmX4C6gldiRvtTqHo5iWlf1zBD2NIS 52dtYIS5dPH3x1Bxfoljt3cwQdgCElPPHISq0ZI42/MSyuaTWLPwLdRMQYnT17qZYXbd3zKX CeaGrS1PwG5gFlCUmNL9kB3C1pL48mMfG7pfeAU8JF5u28wygVFmFpLULCTts5C0I6tZwMiy ilE0tSC5oDgpvcJIrzgxt7g0L10vOT93EyM47TxbtIPx33nrQ4wCHIxKPLwRZw6ECbEmlhVX 5h5ilOBgVhLhfdZ6MEyINyWxsiq1KD++qDQntfgQoykwqiYyS4km5wNTYl5JvKGxgbGhoaW5 gamhkYWSOG/A33VhQgLpiSWp2ampBalFMH1MHJxSDYzNe7yPdc843CK4tOPUEY6P8tnTq76p PRb6tUvebs5jo+8P7ppznsqJNa+6vWGicum2c7JLspPX+NsZ3QvK+7/q17wjDyU3hDTYzv7F 9i3SSunUM+YZvh0T2xvNzkVJfXFfGRt3TcThzteTMh9OBTp73qpJK7/IKNdyMaXq0cnT905X hRTFPmNVYinOSDTUYi4qTgQApgKlpFEDAAA= DLP-Filter: Pass X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id u1F8kfwN013729 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" }, -- 1.9.1