10a6d1fa0SAndy Lutomirski/* 26a613ac6SAndy Lutomirski * AT_SYSINFO entry point 329c0ce95SAndy Lutomirski*/ 429c0ce95SAndy Lutomirski 5f0702555SAndy Lutomirski#include <linux/linkage.h> 629c0ce95SAndy Lutomirski#include <asm/dwarf2.h> 7cd4d09ecSBorislav Petkov#include <asm/cpufeatures.h> 8a474e67cSAndy Lutomirski#include <asm/alternative-asm.h> 929c0ce95SAndy Lutomirski 100a6d1fa0SAndy Lutomirski .text 110a6d1fa0SAndy Lutomirski .globl __kernel_vsyscall 120a6d1fa0SAndy Lutomirski .type __kernel_vsyscall,@function 130a6d1fa0SAndy Lutomirski ALIGN 140a6d1fa0SAndy Lutomirski__kernel_vsyscall: 1529c0ce95SAndy Lutomirski CFI_STARTPROC 168242c6c8SAndy Lutomirski /* 178242c6c8SAndy Lutomirski * Reshuffle regs so that all of any of the entry instructions 188242c6c8SAndy Lutomirski * will preserve enough state. 1930bfa7b3SAndy Lutomirski * 2030bfa7b3SAndy Lutomirski * A really nice entry sequence would be: 2130bfa7b3SAndy Lutomirski * pushl %edx 2230bfa7b3SAndy Lutomirski * pushl %ecx 2330bfa7b3SAndy Lutomirski * movl %esp, %ecx 2430bfa7b3SAndy Lutomirski * 2530bfa7b3SAndy Lutomirski * Unfortunately, naughty Android versions between July and December 2630bfa7b3SAndy Lutomirski * 2015 actually hardcode the traditional Linux SYSENTER entry 2730bfa7b3SAndy Lutomirski * sequence. That is severely broken for a number of reasons (ask 2830bfa7b3SAndy Lutomirski * anyone with an AMD CPU, for example). Nonetheless, we try to keep 2930bfa7b3SAndy Lutomirski * it working approximately as well as it ever worked. 3030bfa7b3SAndy Lutomirski * 3130bfa7b3SAndy Lutomirski * This link may eludicate some of the history: 3230bfa7b3SAndy Lutomirski * https://android-review.googlesource.com/#/q/Iac3295376d61ef83e713ac9b528f3b50aa780cd7 3330bfa7b3SAndy Lutomirski * personally, I find it hard to understand what's going on there. 3430bfa7b3SAndy Lutomirski * 3530bfa7b3SAndy Lutomirski * Note to future user developers: DO NOT USE SYSENTER IN YOUR CODE. 3630bfa7b3SAndy Lutomirski * Execute an indirect call to the address in the AT_SYSINFO auxv 3730bfa7b3SAndy Lutomirski * entry. That is the ONLY correct way to make a fast 32-bit system 3830bfa7b3SAndy Lutomirski * call on Linux. (Open-coding int $0x80 is also fine, but it's 3930bfa7b3SAndy Lutomirski * slow.) 408242c6c8SAndy Lutomirski */ 418242c6c8SAndy Lutomirski pushl %ecx 428242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 438242c6c8SAndy Lutomirski CFI_REL_OFFSET ecx, 0 4430bfa7b3SAndy Lutomirski pushl %edx 4530bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 4630bfa7b3SAndy Lutomirski CFI_REL_OFFSET edx, 0 4730bfa7b3SAndy Lutomirski pushl %ebp 4830bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET 4 4930bfa7b3SAndy Lutomirski CFI_REL_OFFSET ebp, 0 5030bfa7b3SAndy Lutomirski 5130bfa7b3SAndy Lutomirski #define SYSENTER_SEQUENCE "movl %esp, %ebp; sysenter" 5230bfa7b3SAndy Lutomirski #define SYSCALL_SEQUENCE "movl %ecx, %ebp; syscall" 538242c6c8SAndy Lutomirski 54a474e67cSAndy Lutomirski#ifdef CONFIG_X86_64 55a474e67cSAndy Lutomirski /* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */ 5630bfa7b3SAndy Lutomirski ALTERNATIVE_2 "", SYSENTER_SEQUENCE, X86_FEATURE_SYSENTER32, \ 5730bfa7b3SAndy Lutomirski SYSCALL_SEQUENCE, X86_FEATURE_SYSCALL32 585f310f73SAndy Lutomirski#else 5930bfa7b3SAndy Lutomirski ALTERNATIVE "", SYSENTER_SEQUENCE, X86_FEATURE_SEP 60a474e67cSAndy Lutomirski#endif 61a474e67cSAndy Lutomirski 628242c6c8SAndy Lutomirski /* Enter using int $0x80 */ 630a6d1fa0SAndy Lutomirski int $0x80 648242c6c8SAndy LutomirskiGLOBAL(int80_landing_pad) 658242c6c8SAndy Lutomirski 6630bfa7b3SAndy Lutomirski /* 6730bfa7b3SAndy Lutomirski * Restore EDX and ECX in case they were clobbered. EBP is not 6830bfa7b3SAndy Lutomirski * clobbered (the kernel restores it), but it's cleaner and 6930bfa7b3SAndy Lutomirski * probably faster to pop it than to adjust ESP using addl. 7030bfa7b3SAndy Lutomirski */ 7130bfa7b3SAndy Lutomirski popl %ebp 7230bfa7b3SAndy Lutomirski CFI_RESTORE ebp 738242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 748242c6c8SAndy Lutomirski popl %edx 758242c6c8SAndy Lutomirski CFI_RESTORE edx 768242c6c8SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 7730bfa7b3SAndy Lutomirski popl %ecx 7830bfa7b3SAndy Lutomirski CFI_RESTORE ecx 7930bfa7b3SAndy Lutomirski CFI_ADJUST_CFA_OFFSET -4 800a6d1fa0SAndy Lutomirski ret 8129c0ce95SAndy Lutomirski CFI_ENDPROC 820a6d1fa0SAndy Lutomirski 8329c0ce95SAndy Lutomirski .size __kernel_vsyscall,.-__kernel_vsyscall 840a6d1fa0SAndy Lutomirski .previous 85