linux/arch/s390/kernel
Alexander Egorenkov 6bda667037 s390/boot: move dma sections from decompressor to decompressed kernel
This change simplifies the task of making the decompressor relocatable.

The decompressor's image contains special DMA sections between _sdma and
_edma. This DMA segment is loaded at boot as part of the decompressor and
then simply handed over to the decompressed kernel. The decompressor itself
never uses it in any way. The primary reason for this is the need to keep
the aforementioned DMA segment below 2GB which is required by architecture,
and because the decompressor is always loaded at a fixed low physical
address, it is guaranteed that the DMA region will not cross the 2GB
memory limit. If the DMA region had been placed in the decompressed kernel,
then KASLR would make this guarantee impossible to fulfill or it would
be restricted to the first 2GB of memory address space.

This commit moves all DMA sections between _sdma and _edma from
the decompressor's image to the decompressed kernel's image. The complete
DMA region is placed in the init section of the decompressed kernel and
immediately relocated below 2GB at start-up before it is needed by other
parts of the decompressed kernel. The relocation of the DMA region happens
even if the decompressed kernel is already located below 2GB in order
to keep the first implementation simple. The relocation should not have
any noticeable impact on boot time because the DMA segment is only a couple
of pages.

After relocating the DMA sections, the kernel has to fix all references
which point into it. In order to automate this, place all variables
pointing into the DMA sections in a special .dma.refs section. All such
variables must be defined using the new __dma_ref macro. Only variables
containing addresses within the DMA sections must be placed in the new
.dma.refs section.

Furthermore, move the initialization of control registers from
the decompressor to the decompressed kernel because some control registers
reference tables that must be placed in the DMA data section to
guarantee that their addresses are below 2G. Because the decompressed
kernel relocates the DMA sections at startup, the content of control
registers CR2, CR5 and CR15 must be updated with new addresses after
the relocation. The decompressed kernel initializes all control registers
early at boot and then updates the content of CR2, CR5 and CR15
as soon as the DMA relocation has occurred. This practically reverts
the commit a80313ff91 ("s390/kernel: introduce .dma sections").

Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
2021-07-27 09:39:17 +02:00
..
syscalls quota: Wire up quotactl_fd syscall 2021-06-07 12:11:24 +02:00
vdso32 s390/vdso32: add vdso32.lds to targets 2021-07-12 14:33:53 +02:00
vdso64 s390/vdso: add minimal compat vdso 2021-07-08 15:37:28 +02:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
alternative.c s390/facilities: move stfl information from lowcore to global data 2021-06-07 17:06:58 +02:00
asm-offsets.c s390/setup: generate asm offsets from struct parmarea 2021-07-27 09:39:16 +02:00
audit.c
audit.h
base.S s390: remove unused s390_base_ext_handler 2020-11-09 11:20:58 +01:00
cache.c
compat_audit.c
compat_linux.c s390: use generic UID16 implementation 2019-01-18 09:33:18 +01:00
compat_linux.h
compat_ptrace.h
compat_signal.c s390/signal: switch to using vdso for sigreturn and syscall restart 2021-07-08 22:09:47 +02:00
cpcmd.c s390/cpcmd: use register pair instead of register asm 2021-06-18 16:41:22 +02:00
crash_dump.c s390/dump: introduce boot data 'oldmem_data' 2021-07-27 09:39:16 +02:00
debug.c s390/debug: Remove pointer obfuscation 2021-06-18 16:41:19 +02:00
diag.c s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
dis.c s390/disassembler: increase ebpf disasm buffer size 2021-04-21 12:32:12 +02:00
dumpstack.c s390/unwind: add machine check handler stack 2021-04-05 11:30:07 +02:00
early_printk.c s390/sclp: remove unused sclp_early_printk_forced 2020-09-21 08:08:44 +02:00
early.c s390/boot: replace magic string check with a bootdata flag 2021-07-05 12:44:23 +02:00
ebcdic.c
entry.h s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
entry.S s390/mcck: move register validation to C code 2021-07-05 12:44:23 +02:00
fpu.c s390: convert to generic entry 2021-01-19 12:29:26 +01:00
ftrace.c s390/ftrace: fix ftrace_update_ftrace_func implementation 2021-07-15 12:54:58 +02:00
guarded_storage.c
head64.S s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
idle.c s390/time,idle: get rid of unsigned long long 2021-03-08 10:46:27 +01:00
ima_arch.c s390/kexec_file: Disable kexec_load when IPLed secure 2019-04-29 10:44:03 +02:00
ipl_vmparm.c s390/cio: remove unused include linux/spinlock.h from cio.h 2021-07-27 09:39:13 +02:00
ipl.c s390 updates for the 5.14 merge window 2021-07-04 12:17:38 -07:00
irq.c s390/irq: use call_on_stack() macro 2021-07-08 22:12:18 +02:00
jump_label.c s390/jump_label: print real address in a case of a jump label bug 2021-07-27 09:39:13 +02:00
kdebugfs.c s390: no need to check return value of debugfs_create functions 2019-01-28 15:58:55 +01:00
kexec_elf.c kexec: Fix file verification on S390 2019-09-10 13:27:51 +01:00
kexec_image.c kexec_file: split KEXEC_VERIFY_SIG into KEXEC_SIG and KEXEC_SIG_FORCE 2019-08-19 21:54:15 -07:00
kprobes_insn_page.S s390/kprobes: move insn_page to text segment 2020-10-09 23:45:30 +02:00
kprobes.c s390/kprobes: use is_kernel() helper 2021-07-05 12:44:23 +02:00
lgr.c s390: convert to msecs_to_jiffies() 2020-06-29 16:31:46 +02:00
machine_kexec_file.c s390/kexec_file: fix initrd location for kdump kernel 2020-05-14 23:21:37 +02:00
machine_kexec_reloc.c s390/kaslr: add support for R_390_JMP_SLOT relocation type 2020-05-20 10:13:27 +02:00
machine_kexec.c s390/kexec: use call_on_stack() macro 2021-07-08 22:12:18 +02:00
Makefile s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
mcount.S s390/ftrace: fix ftrace_update_ftrace_func implementation 2021-07-15 12:54:58 +02:00
module.c s390/module: Use s390_kernel_write() for late relocations 2020-05-08 00:12:43 +02:00
nmi.c s390/mcck: move register validation to C code 2021-07-05 12:44:23 +02:00
nospec-branch.c s390/speculation: Use statically initialized const for instructions 2021-06-28 11:18:28 +02:00
nospec-sysfs.c s390/facilities: move stfl information from lowcore to global data 2021-06-07 17:06:58 +02:00
numa.c s390/numa: move code to arch/s390/kernel 2020-08-11 18:16:55 +02:00
os_info.c s390/dump: introduce boot data 'oldmem_data' 2021-07-27 09:39:16 +02:00
perf_cpum_cf_common.c s390/cpumf: Allow concurrent access for CPU Measurement Counter Facility 2021-07-05 12:44:23 +02:00
perf_cpum_cf_events.c s390/cpum_cf,perf: change DFLT_CCERROR counter name 2020-07-21 13:53:56 +02:00
perf_cpum_cf.c s390/cpumf: fix semicolon.cocci warnings 2021-07-20 17:59:40 +02:00
perf_cpum_sf.c s390/time: convert tod_clock_base to union 2021-02-13 17:17:54 +01:00
perf_event.c s390: Get rid of oprofile leftovers 2021-04-22 13:32:39 +01:00
perf_regs.c perf/arch: Remove perf_sample_data::regs_user_copy 2020-11-09 18:12:34 +01:00
process.c s390/signal: switch to using vdso for sigreturn and syscall restart 2021-07-08 22:09:47 +02:00
processor.c s390/facilities: move stfl information from lowcore to global data 2021-06-07 17:06:58 +02:00
ptrace.c s390/traps: add struct to access transactional diagnostic block 2021-06-07 17:06:58 +02:00
reipl.S s390: add missing ENDPROC statements to assembler functions 2019-05-02 13:54:11 +02:00
relocate_kernel.S s390: add missing ENDPROC statements to assembler functions 2019-05-02 13:54:11 +02:00
runtime_instr.c s390/runtime_instrumentation: fix storage key handling 2020-08-17 13:17:10 +02:00
setup.c s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
signal.c s390/signal: switch to using vdso for sigreturn and syscall restart 2021-07-08 22:09:47 +02:00
smp.c s390/dump: introduce boot data 'oldmem_data' 2021-07-27 09:39:16 +02:00
stacktrace.c stacktrace: Move documentation for arch_stack_walk_reliable() to header 2021-03-10 15:52:31 +01:00
sthyi.c s390/sthyi: use register pair instead of register asm 2021-06-18 16:41:22 +02:00
syscall.c s390: rename PIF_SYSCALL_RESTART to PIF_EXECVE_PGSTE_RESTART 2021-07-08 22:12:17 +02:00
sysinfo.c s390/sysinfo: get rid of register asm 2021-06-18 16:41:23 +02:00
text_dma.S s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
time.c s390/vdso: fix initializing and updating of vdso_data 2021-03-25 21:57:26 +01:00
topology.c s390/topology: clear thread/group maps for offline cpus 2021-06-21 11:19:18 +02:00
trace.c s390/ftrace: fix potential crashes when switching tracers 2020-04-22 16:20:55 +02:00
traps.c s390/signal: remove sigreturn on stack 2021-07-08 22:12:17 +02:00
unwind_bc.c s390/unwind: stop gracefully at user mode pt_regs in irq stack 2019-12-18 23:29:26 +01:00
uprobes.c s390: Fix fall-through warnings for Clang 2021-07-13 14:43:09 -05:00
uv.c s390/uv: de-duplicate checks for Protected Host Virtualization 2021-07-27 09:39:14 +02:00
vdso.c s390/vdso: add minimal compat vdso 2021-07-08 15:37:28 +02:00
vmlinux.lds.S s390/boot: move dma sections from decompressor to decompressed kernel 2021-07-27 09:39:17 +02:00
vtime.c s390/vtime: fix increased steal time accounting 2021-03-15 19:09:25 +01:00