Commit 9226b838 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

uml: further bugs.c tidying

bugs.c, for both i386 and x86_64, can undergo further cleaning -
	The i386 arch_check_bugs only does one thing, so we might as
well inline the cmov checking.
	The i386 includes can be trimmed down a bit.
	arch_init_thread wasn't used, so it is deleted.
	The panics in arch_handle_signal are turned into printks
because the process is about to get segfaulted anyway, so something is
dying no matter what happens here.  Also, the return value was always
the same, so it contained no information, so it can be void instead.
The name is changed to arch_examine_signal because it doesn't handle
anything.
	The caller of arch_handle_signal, relay_signal, does things in
a different order.  The kernel-mode signal check is now first, which
puts everything else together, making things a bit clearer conceptually.

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: default avatarJeff Dike <jdike@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 06d9bd3a
...@@ -10,6 +10,6 @@ ...@@ -10,6 +10,6 @@
extern void arch_check_bugs(void); extern void arch_check_bugs(void);
extern int arch_fixup(unsigned long address, struct uml_pt_regs *regs); extern int arch_fixup(unsigned long address, struct uml_pt_regs *regs);
extern int arch_handle_signal(int sig, struct uml_pt_regs *regs); extern void arch_examine_signal(int sig, struct uml_pt_regs *regs);
#endif #endif
...@@ -216,9 +216,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, ...@@ -216,9 +216,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
void relay_signal(int sig, struct uml_pt_regs *regs) void relay_signal(int sig, struct uml_pt_regs *regs)
{ {
if (arch_handle_signal(sig, regs))
return;
if (!UPT_IS_USER(regs)) { if (!UPT_IS_USER(regs)) {
if (sig == SIGBUS) if (sig == SIGBUS)
printk(KERN_ERR "Bus error - the host /dev/shm or /tmp " printk(KERN_ERR "Bus error - the host /dev/shm or /tmp "
...@@ -226,6 +223,8 @@ void relay_signal(int sig, struct uml_pt_regs *regs) ...@@ -226,6 +223,8 @@ void relay_signal(int sig, struct uml_pt_regs *regs)
panic("Kernel mode signal %d", sig); panic("Kernel mode signal %d", sig);
} }
arch_examine_signal(sig, regs);
current->thread.arch.faultinfo = *UPT_FAULTINFO(regs); current->thread.arch.faultinfo = *UPT_FAULTINFO(regs);
force_sig(sig, current); force_sig(sig, current);
} }
......
...@@ -3,14 +3,12 @@ ...@@ -3,14 +3,12 @@
* Licensed under the GPL * Licensed under the GPL
*/ */
#include <errno.h>
#include <signal.h> #include <signal.h>
#include <string.h>
#include "kern_constants.h" #include "kern_constants.h"
#include "os.h" #include "longjmp.h"
#include "task.h" #include "task.h"
#include "user.h" #include "user.h"
#include "sysdep/archsetjmp.h" #include "sysdep/ptrace.h"
/* Set during early boot */ /* Set during early boot */
int host_has_cmov = 1; int host_has_cmov = 1;
...@@ -22,7 +20,7 @@ static void cmov_sigill_test_handler(int sig) ...@@ -22,7 +20,7 @@ static void cmov_sigill_test_handler(int sig)
longjmp(cmov_test_return, 1); longjmp(cmov_test_return, 1);
} }
static void test_for_host_cmov(void) void arch_check_bugs(void)
{ {
struct sigaction old, new; struct sigaction old, new;
...@@ -44,16 +42,7 @@ static void test_for_host_cmov(void) ...@@ -44,16 +42,7 @@ static void test_for_host_cmov(void)
sigaction(SIGILL, &old, &new); sigaction(SIGILL, &old, &new);
} }
void arch_init_thread(void) void arch_examine_signal(int sig, struct uml_pt_regs *regs)
{
}
void arch_check_bugs(void)
{
test_for_host_cmov();
}
int arch_handle_signal(int sig, struct uml_pt_regs *regs)
{ {
unsigned char tmp[2]; unsigned char tmp[2];
...@@ -62,20 +51,25 @@ int arch_handle_signal(int sig, struct uml_pt_regs *regs) ...@@ -62,20 +51,25 @@ int arch_handle_signal(int sig, struct uml_pt_regs *regs)
* SIGILL in init. * SIGILL in init.
*/ */
if ((sig != SIGILL) || (TASK_PID(get_current()) != 1)) if ((sig != SIGILL) || (TASK_PID(get_current()) != 1))
return 0; 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 (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2))
panic("SIGILL in init, could not read instructions!\n");
if ((tmp[0] != 0x0f) || ((tmp[1] & 0xf0) != 0x40)) if ((tmp[0] != 0x0f) || ((tmp[1] & 0xf0) != 0x40))
return 0; return;
if (host_has_cmov == 0) if (host_has_cmov == 0)
panic("SIGILL caused by cmov, which this processor doesn't " printk(UM_KERN_ERR "SIGILL caused by cmov, which this "
"implement, boot a filesystem compiled for older " "processor doesn't implement. Boot a filesystem "
"processors"); "compiled for older processors");
else if (host_has_cmov == 1) else if (host_has_cmov == 1)
panic("SIGILL caused by cmov, which this processor claims to " printk(UM_KERN_ERR "SIGILL caused by cmov, which this "
"implement"); "processor claims to implement");
else panic("Bad value for host_has_cmov (%d)", host_has_cmov); else
return 0; printk(UM_KERN_ERR "Bad value for host_has_cmov (%d)",
host_has_cmov);
} }
...@@ -6,15 +6,10 @@ ...@@ -6,15 +6,10 @@
#include "sysdep/ptrace.h" #include "sysdep/ptrace.h"
void arch_init_thread(void)
{
}
void arch_check_bugs(void) void arch_check_bugs(void)
{ {
} }
int arch_handle_signal(int sig, struct uml_pt_regs *regs) void arch_examine_signal(int sig, struct uml_pt_regs *regs)
{ {
return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment