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/sched.h> 21#include <linux/init.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 39static 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 46static 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 57static 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 66static struct exec_domain arthur_exec_domain = { 67 "Arthur", /* name */ 68 arthur_lcall7, 69 PER_RISCOS, PER_RISCOS, 70 arthur_to_linux_signals, 71 linux_to_arthur_signals, 72 THIS_MODULE, 73 NULL /* Nothing after this in the list. */ 74}; 75 76/* 77 * We could do with some locking to stop Arthur being removed while 78 * processes are using it. 79 */ 80 81int __init arthur_init(void) 82{ 83 return register_exec_domain(&arthur_exec_domain); 84} 85 86void __exit arthur_exit(void) 87{ 88 unregister_exec_domain(&arthur_exec_domain); 89} 90 91module_init(arthur_init); 92module_exit(arthur_exit); 93