1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 20a6d1fa0SAndy Lutomirski/* 36a613ac6SAndy Lutomirski * AT_SYSINFO entry point 429c0ce95SAndy Lutomirski*/ 529c0ce95SAndy Lutomirski 6f0702555SAndy Lutomirski#include <linux/linkage.h> 729c0ce95SAndy Lutomirski#include <asm/dwarf2.h> 8cd4d09ecSBorislav Petkov#include <asm/cpufeatures.h> 95e21a3ecSJuergen Gross#include <asm/alternative.h> 1029c0ce95SAndy Lutomirski 110a6d1fa0SAndy Lutomirski .text 120a6d1fa0SAndy Lutomirski .globl __kernel_vsyscall 130a6d1fa0SAndy Lutomirski .type __kernel_vsyscall,@function 140a6d1fa0SAndy Lutomirski ALIGN 150a6d1fa0SAndy Lutomirski__kernel_vsyscall: 1629c0ce95SAndy Lutomirski CFI_STARTPROC 178242c6c8SAndy Lutomirski /* 188242c6c8SAndy Lutomirski * Reshuffle regs so that all of any of the entry instructions 198242c6c8SAndy Lutomirski * will preserve enough state. 2030bfa7b3SAndy Lutomirski * 2130bfa7b3SAndy Lutomirski * A really nice entry sequence would be: 2230bfa7b3SAndy Lutomirski * pushl %edx 2330bfa7b3SAndy Lutomirski * pushl %ecx 2430bfa7b3SAndy Lutomirski * movl %esp, %ecx 2530bfa7b3SAndy Lutomirski * 2630bfa7b3SAndy Lutomirski * Unfortunately, naughty Android versions between July and December 2730bfa7b3SAndy Lutomirski * 2015 actually hardcode the traditional Linux SYSENTER entry 2830bfa7b3SAndy Lutomirski * sequence. That is severely broken for a number of reasons (ask 2930bfa7b3SAndy Lutomirski * anyone with an AMD CPU, for example). Nonetheless, we try to keep 3030bfa7b3SAndy Lutomirski * it working approximately as well as it ever worked. 3130bfa7b3SAndy Lutomirski * 32163b0991SIngo Molnar * This link may elucidate some of the history: 3330bfa7b3SAndy Lutomirski * https://android-review.googlesource.com/#/q/Iac3295376d61ef83e713ac9b528f3b50aa780cd7 3430bfa7b3SAndy Lutomirski * personally, I find it hard to understand what's going on there. 3530bfa7b3SAndy Lutomirski * 3630bfa7b3SAndy Lutomirski * Note to future user developers: DO NOT USE SYSENTER IN YOUR CODE. 3730bfa7b3SAndy Lutomirski * Execute an indirect call to the address in the AT_SYSINFO auxv 3830bfa7b3SAndy Lutomirski * entry. That is the ONLY correct way to make a fast 32-bit system 3930bfa7b3SAndy Lutomirski * call on Linux. (Open-coding int $0x80 is also fine, but it's 4030bfa7b3SAndy Lutomirski * slow.) 418242c6c8SAndy Lutomirski */ 428242c6c8SAndy Lutomirski pushl %ecx 438242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 448242c6c8SAndy Lutomirski CFI_REL_OFFSET ecx, 0 4530bfa7b3SAndy Lutomirski pushl %edx 4630bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 4730bfa7b3SAndy Lutomirski CFI_REL_OFFSET edx, 0 4830bfa7b3SAndy Lutomirski pushl %ebp 4930bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 5030bfa7b3SAndy Lutomirski CFI_REL_OFFSET ebp, 0 5130bfa7b3SAndy Lutomirski 5230bfa7b3SAndy Lutomirski #define SYSENTER_SEQUENCE "movl %esp, %ebp; sysenter" 5330bfa7b3SAndy Lutomirski #define SYSCALL_SEQUENCE "movl %ecx, %ebp; syscall" 548242c6c8SAndy Lutomirski 55a474e67cSAndy Lutomirski#ifdef CONFIG_X86_64 56a474e67cSAndy Lutomirski /* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */ 5730bfa7b3SAndy Lutomirski ALTERNATIVE_2 "", SYSENTER_SEQUENCE, X86_FEATURE_SYSENTER32, \ 5830bfa7b3SAndy Lutomirski SYSCALL_SEQUENCE, X86_FEATURE_SYSCALL32 595f310f73SAndy Lutomirski#else 6030bfa7b3SAndy Lutomirski ALTERNATIVE "", SYSENTER_SEQUENCE, X86_FEATURE_SEP 61a474e67cSAndy Lutomirski#endif 62a474e67cSAndy Lutomirski 638242c6c8SAndy Lutomirski /* Enter using int $0x80 */ 640a6d1fa0SAndy Lutomirski int $0x80 6526ba4e57SJiri SlabySYM_INNER_LABEL(int80_landing_pad, SYM_L_GLOBAL) 668242c6c8SAndy Lutomirski 6730bfa7b3SAndy Lutomirski /* 6830bfa7b3SAndy Lutomirski * Restore EDX and ECX in case they were clobbered. EBP is not 6930bfa7b3SAndy Lutomirski * clobbered (the kernel restores it), but it's cleaner and 7030bfa7b3SAndy Lutomirski * probably faster to pop it than to adjust ESP using addl. 7130bfa7b3SAndy Lutomirski */ 7230bfa7b3SAndy Lutomirski popl %ebp 7330bfa7b3SAndy Lutomirski CFI_RESTORE ebp 748242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 758242c6c8SAndy Lutomirski popl %edx 768242c6c8SAndy Lutomirski CFI_RESTORE edx 778242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 7830bfa7b3SAndy Lutomirski popl %ecx 7930bfa7b3SAndy Lutomirski CFI_RESTORE ecx 8030bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 81*14b476e0SPeter Zijlstra RET 8229c0ce95SAndy Lutomirski CFI_ENDPROC 830a6d1fa0SAndy Lutomirski 8429c0ce95SAndy Lutomirski .size __kernel_vsyscall,.-__kernel_vsyscall 850a6d1fa0SAndy Lutomirski .previous 86