cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/um/bugs_32.c

Directory: arch/x86/um
/*
 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
 * Licensed under the GPL
 */

#include <signal.h>
#include <kern_util.h>
#include <longjmp.h>
#include <sysdep/ptrace.h>
#include <generated/asm-offsets.h>

/* Set during early boot */

static int host_has_cmov = 1;

static jmp_buf cmov_test_return;


static void cmov_sigill_test_handler(int sig) { host_has_cmov = 0; longjmp(cmov_test_return, 1); }

Contributors

PersonTokensPropCommitsCommitProp
Karol Swietlicki20100.00%1100.00%
Total20100.00%1100.00%


void arch_check_bugs(void) { struct sigaction old, new; printk(UM_KERN_INFO "Checking for host processor cmov support..."); new.sa_handler = cmov_sigill_test_handler; /* Make sure that SIGILL is enabled after the handler longjmps back */ new.sa_flags = SA_NODEFER; sigemptyset(&new.sa_mask); sigaction(SIGILL, &new, &old); if (setjmp(cmov_test_return) == 0) { unsigned long foo = 0; __asm__ __volatile__("cmovz %0, %1" : "=r" (foo) : "0" (foo)); printk(UM_KERN_CONT "Yes\n"); } else printk(UM_KERN_CONT "No\n"); sigaction(SIGILL, &old, &new); }

Contributors

PersonTokensPropCommitsCommitProp
Karol Swietlicki9498.95%150.00%
Jeff Dike11.05%150.00%
Total95100.00%2100.00%


void arch_examine_signal(int sig, struct uml_pt_regs *regs) { unsigned char tmp[2]; /* * This is testing for a cmov (0x0f 0x4x) instruction causing a * SIGILL in init. */ if ((sig != SIGILL) || (get_current_pid() != 1)) return; if (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2)) { printk(UM_KERN_ERR "SIGILL in init, could not read " "instructions!\n"); return; } if ((tmp[0] != 0x0f) || ((tmp[1] & 0xf0) != 0x40)) return; if (host_has_cmov == 0) printk(UM_KERN_ERR "SIGILL caused by cmov, which this " "processor doesn't implement. Boot a filesystem " "compiled for older processors"); else if (host_has_cmov == 1) printk(UM_KERN_ERR "SIGILL caused by cmov, which this " "processor claims to implement"); else printk(UM_KERN_ERR "Bad value for host_has_cmov (%d)", host_has_cmov); }

Contributors

PersonTokensPropCommitsCommitProp
Jeff Dike12296.06%571.43%
Paolo 'Blaisorblade' Giarrusso43.15%114.29%
Al Viro10.79%114.29%
Total127100.00%7100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Jeff Dike13851.30%753.85%
Karol Swietlicki11843.87%17.69%
Paolo 'Blaisorblade' Giarrusso72.60%17.69%
Al Viro51.86%323.08%
Américo Wang10.37%17.69%
Total269100.00%13100.00%
Directory: arch/x86/um
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.