forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 435
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64/BUG: Use BRK instruction for generic BUG traps
Currently, the minimal default BUG() implementation from asm- generic is used for arm64. This patch uses the BRK software breakpoint instruction to generate a trap instead, similarly to most other arches, with the generic BUG code generating the dmesg boilerplate. This allows bug metadata to be moved to a separate table and reduces the amount of inline code at BUG and WARN sites. This also avoids clobbering any registers before they can be dumped. To mitigate the size of the bug table further, this patch makes use of the existing infrastructure for encoding addresses within the bug table as 32-bit offsets instead of absolute pointers. (Note that this limits the kernel size to 2GB.) Traps are registered at arch_initcall time for aarch64, but BUG has minimal real dependencies and it is desirable to be able to generate bug splats as early as possible. This patch redirects all debug exceptions caused by BRK directly to bug_handler() until the full debug exception support has been initialised. Signed-off-by: Dave Martin <[email protected]> Reviewed-by: Catalin Marinas <[email protected]> Signed-off-by: Will Deacon <[email protected]>
- Loading branch information
Showing
5 changed files
with
142 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Copyright (C) 2015 ARM Limited | ||
* Author: Dave Martin <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#ifndef _ARCH_ARM64_ASM_BUG_H | ||
#define _ARCH_ARM64_ASM_BUG_H | ||
|
||
#include <asm/debug-monitors.h> | ||
|
||
#ifdef CONFIG_GENERIC_BUG | ||
#define HAVE_ARCH_BUG | ||
|
||
#ifdef CONFIG_DEBUG_BUGVERBOSE | ||
#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line) | ||
#define __BUGVERBOSE_LOCATION(file, line) \ | ||
".pushsection .rodata.str,\"aMS\",@progbits,1\n" \ | ||
"2: .string \"" file "\"\n\t" \ | ||
".popsection\n\t" \ | ||
\ | ||
".long 2b - 0b\n\t" \ | ||
".short " #line "\n\t" | ||
#else | ||
#define _BUGVERBOSE_LOCATION(file, line) | ||
#endif | ||
|
||
#define _BUG_FLAGS(flags) __BUG_FLAGS(flags) | ||
|
||
#define __BUG_FLAGS(flags) asm volatile ( \ | ||
".pushsection __bug_table,\"a\"\n\t" \ | ||
".align 2\n\t" \ | ||
"0: .long 1f - 0b\n\t" \ | ||
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \ | ||
".short " #flags "\n\t" \ | ||
".popsection\n" \ | ||
\ | ||
"1: brk %[imm]" \ | ||
:: [imm] "i" (BUG_BRK_IMM) \ | ||
) | ||
|
||
#define BUG() do { \ | ||
_BUG_FLAGS(0); \ | ||
unreachable(); \ | ||
} while (0) | ||
|
||
#define __WARN_TAINT(taint) _BUG_FLAGS(BUGFLAG_TAINT(taint)) | ||
|
||
#endif /* ! CONFIG_GENERIC_BUG */ | ||
|
||
#include <asm-generic/bug.h> | ||
|
||
#endif /* ! _ARCH_ARM64_ASM_BUG_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters