mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 06:24:53 +08:00
74a0496748
ADI is a new feature supported on SPARC M7 and newer processors to allow hardware to catch rogue accesses to memory. ADI is supported for data fetches only and not instruction fetches. An app can enable ADI on its data pages, set version tags on them and use versioned addresses to access the data pages. Upper bits of the address contain the version tag. On M7 processors, upper four bits (bits 63-60) contain the version tag. If a rogue app attempts to access ADI enabled data pages, its access is blocked and processor generates an exception. Please see Documentation/sparc/adi.txt for further details. This patch extends mprotect to enable ADI (TSTATE.mcde), enable/disable MCD (Memory Corruption Detection) on selected memory ranges, enable TTE.mcd in PTEs, return ADI parameters to userspace and save/restore ADI version tags on page swap out/in or migration. ADI is not enabled by default for any task. A task must explicitly enable ADI on a memory range and set version tag for ADI to be effective for the task. Signed-off-by: Khalid Aziz <khalid.aziz@oracle.com> Cc: Khalid Aziz <khalid@gonehiking.org> Reviewed-by: Anthony Yznaga <anthony.yznaga@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
192 lines
3.5 KiB
ArmAsm
192 lines
3.5 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* ld script for sparc32/sparc64 kernel */
|
|
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/thread_info.h>
|
|
|
|
#ifdef CONFIG_SPARC32
|
|
#define INITIAL_ADDRESS 0x10000 + SIZEOF_HEADERS
|
|
#define TEXTSTART 0xf0004000
|
|
|
|
#define SMP_CACHE_BYTES_SHIFT 5
|
|
|
|
#else
|
|
#define SMP_CACHE_BYTES_SHIFT 6
|
|
#define INITIAL_ADDRESS 0x4000
|
|
#define TEXTSTART 0x0000000000404000
|
|
|
|
#endif
|
|
|
|
#define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT)
|
|
|
|
#ifdef CONFIG_SPARC32
|
|
OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc")
|
|
OUTPUT_ARCH(sparc)
|
|
ENTRY(_start)
|
|
jiffies = jiffies_64 + 4;
|
|
#else
|
|
/* sparc64 */
|
|
OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
|
|
OUTPUT_ARCH(sparc:v9a)
|
|
ENTRY(_start)
|
|
jiffies = jiffies_64;
|
|
#endif
|
|
|
|
#ifdef CONFIG_SPARC64
|
|
ASSERT((swapper_tsb == 0x0000000000408000), "Error: sparc64 early assembler too large")
|
|
#endif
|
|
|
|
SECTIONS
|
|
{
|
|
#ifdef CONFIG_SPARC64
|
|
swapper_pg_dir = 0x0000000000402000;
|
|
#endif
|
|
. = INITIAL_ADDRESS;
|
|
.text TEXTSTART :
|
|
{
|
|
_text = .;
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
SCHED_TEXT
|
|
CPUIDLE_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
IRQENTRY_TEXT
|
|
SOFTIRQENTRY_TEXT
|
|
*(.gnu.warning)
|
|
} = 0
|
|
_etext = .;
|
|
|
|
RO_DATA(PAGE_SIZE)
|
|
|
|
/* Start of data section */
|
|
_sdata = .;
|
|
|
|
.data1 : {
|
|
*(.data1)
|
|
}
|
|
RW_DATA_SECTION(SMP_CACHE_BYTES, 0, THREAD_SIZE)
|
|
|
|
/* End of data section */
|
|
_edata = .;
|
|
|
|
.fixup : {
|
|
__start___fixup = .;
|
|
*(.fixup)
|
|
__stop___fixup = .;
|
|
}
|
|
EXCEPTION_TABLE(16)
|
|
NOTES
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
__init_begin = ALIGN(PAGE_SIZE);
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
__init_text_end = .;
|
|
INIT_DATA_SECTION(16)
|
|
|
|
. = ALIGN(4);
|
|
.tsb_ldquad_phys_patch : {
|
|
__tsb_ldquad_phys_patch = .;
|
|
*(.tsb_ldquad_phys_patch)
|
|
__tsb_ldquad_phys_patch_end = .;
|
|
}
|
|
|
|
.tsb_phys_patch : {
|
|
__tsb_phys_patch = .;
|
|
*(.tsb_phys_patch)
|
|
__tsb_phys_patch_end = .;
|
|
}
|
|
|
|
.cpuid_patch : {
|
|
__cpuid_patch = .;
|
|
*(.cpuid_patch)
|
|
__cpuid_patch_end = .;
|
|
}
|
|
|
|
.sun4v_1insn_patch : {
|
|
__sun4v_1insn_patch = .;
|
|
*(.sun4v_1insn_patch)
|
|
__sun4v_1insn_patch_end = .;
|
|
}
|
|
.sun4v_2insn_patch : {
|
|
__sun4v_2insn_patch = .;
|
|
*(.sun4v_2insn_patch)
|
|
__sun4v_2insn_patch_end = .;
|
|
}
|
|
.leon_1insn_patch : {
|
|
__leon_1insn_patch = .;
|
|
*(.leon_1insn_patch)
|
|
__leon_1insn_patch_end = .;
|
|
}
|
|
.swapper_tsb_phys_patch : {
|
|
__swapper_tsb_phys_patch = .;
|
|
*(.swapper_tsb_phys_patch)
|
|
__swapper_tsb_phys_patch_end = .;
|
|
}
|
|
.swapper_4m_tsb_phys_patch : {
|
|
__swapper_4m_tsb_phys_patch = .;
|
|
*(.swapper_4m_tsb_phys_patch)
|
|
__swapper_4m_tsb_phys_patch_end = .;
|
|
}
|
|
.popc_3insn_patch : {
|
|
__popc_3insn_patch = .;
|
|
*(.popc_3insn_patch)
|
|
__popc_3insn_patch_end = .;
|
|
}
|
|
.popc_6insn_patch : {
|
|
__popc_6insn_patch = .;
|
|
*(.popc_6insn_patch)
|
|
__popc_6insn_patch_end = .;
|
|
}
|
|
.pause_3insn_patch : {
|
|
__pause_3insn_patch = .;
|
|
*(.pause_3insn_patch)
|
|
__pause_3insn_patch_end = .;
|
|
}
|
|
.sun_m7_1insn_patch : {
|
|
__sun_m7_1insn_patch = .;
|
|
*(.sun_m7_1insn_patch)
|
|
__sun_m7_1insn_patch_end = .;
|
|
}
|
|
.sun_m7_2insn_patch : {
|
|
__sun_m7_2insn_patch = .;
|
|
*(.sun_m7_2insn_patch)
|
|
__sun_m7_2insn_patch_end = .;
|
|
}
|
|
.get_tick_patch : {
|
|
__get_tick_patch = .;
|
|
*(.get_tick_patch)
|
|
__get_tick_patch_end = .;
|
|
}
|
|
.pud_huge_patch : {
|
|
__pud_huge_patch = .;
|
|
*(.pud_huge_patch)
|
|
__pud_huge_patch_end = .;
|
|
}
|
|
.fast_win_ctrl_1insn_patch : {
|
|
__fast_win_ctrl_1insn_patch = .;
|
|
*(.fast_win_ctrl_1insn_patch)
|
|
__fast_win_ctrl_1insn_patch_end = .;
|
|
}
|
|
PERCPU_SECTION(SMP_CACHE_BYTES)
|
|
|
|
#ifdef CONFIG_JUMP_LABEL
|
|
. = ALIGN(PAGE_SIZE);
|
|
.exit.text : {
|
|
EXIT_TEXT
|
|
}
|
|
#endif
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
__init_end = .;
|
|
BSS_SECTION(0, 0, 0)
|
|
_end = . ;
|
|
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
|
|
DISCARDS
|
|
}
|