Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc
[linux-2.6] / arch / arm / kernel / arthur.c
1 /*
2  *  linux/arch/arm/kernel/arthur.c
3  *
4  *  Copyright (C) 1998, 1999, 2000, 2001 Philip Blundell
5  *
6  * Arthur personality
7  */
8
9 /*
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version
13  * 2 of the License, or (at your option) any later version.
14  */
15
16 #include <linux/module.h>
17 #include <linux/personality.h>
18 #include <linux/stddef.h>
19 #include <linux/signal.h>
20 #include <linux/init.h>
21 #include <linux/sched.h>
22
23 #include <asm/ptrace.h>
24
25 /* Arthur doesn't have many signals, and a lot of those that it does
26    have don't map easily to any Linux equivalent.  Never mind.  */
27
28 #define ARTHUR_SIGABRT          1
29 #define ARTHUR_SIGFPE           2
30 #define ARTHUR_SIGILL           3
31 #define ARTHUR_SIGINT           4
32 #define ARTHUR_SIGSEGV          5
33 #define ARTHUR_SIGTERM          6
34 #define ARTHUR_SIGSTAK          7
35 #define ARTHUR_SIGUSR1          8
36 #define ARTHUR_SIGUSR2          9
37 #define ARTHUR_SIGOSERROR       10
38
39 static unsigned long arthur_to_linux_signals[32] = {
40         0,      1,      2,      3,      4,      5,      6,      7,
41         8,      9,      10,     11,     12,     13,     14,     15,
42         16,     17,     18,     19,     20,     21,     22,     23,
43         24,     25,     26,     27,     28,     29,     30,     31
44 };
45
46 static unsigned long linux_to_arthur_signals[32] = {
47         0,              -1,             ARTHUR_SIGINT,  -1,
48         ARTHUR_SIGILL,  5,              ARTHUR_SIGABRT, 7,
49         ARTHUR_SIGFPE,  9,              ARTHUR_SIGUSR1, ARTHUR_SIGSEGV, 
50         ARTHUR_SIGUSR2, 13,             14,             ARTHUR_SIGTERM,
51         16,             17,             18,             19,
52         20,             21,             22,             23,
53         24,             25,             26,             27,
54         28,             29,             30,             31
55 };
56
57 static void arthur_lcall7(int nr, struct pt_regs *regs)
58 {
59         struct siginfo info;
60         info.si_signo = SIGSWI;
61         info.si_errno = nr;
62         /* Bounce it to the emulator */
63         send_sig_info(SIGSWI, &info, current);
64 }
65
66 static struct exec_domain arthur_exec_domain = {
67         .name           = "Arthur",
68         .handler        = arthur_lcall7,
69         .pers_low       = PER_RISCOS,
70         .pers_high      = PER_RISCOS,
71         .signal_map     = arthur_to_linux_signals,
72         .signal_invmap  = linux_to_arthur_signals,
73         .module         = THIS_MODULE,
74 };
75
76 /*
77  * We could do with some locking to stop Arthur being removed while
78  * processes are using it.
79  */
80
81 static int __init arthur_init(void)
82 {
83         return register_exec_domain(&arthur_exec_domain);
84 }
85
86 static void __exit arthur_exit(void)
87 {
88         unregister_exec_domain(&arthur_exec_domain);
89 }
90
91 module_init(arthur_init);
92 module_exit(arthur_exit);
93
94 MODULE_LICENSE("GPL");