linux/arch/arm/kernel/arthur.c
<<
>>
Prefs
   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
  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        .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
  81static int __init arthur_init(void)
  82{
  83        return register_exec_domain(&arthur_exec_domain);
  84}
  85
  86static void __exit arthur_exit(void)
  87{
  88        unregister_exec_domain(&arthur_exec_domain);
  89}
  90
  91module_init(arthur_init);
  92module_exit(arthur_exit);
  93
  94MODULE_LICENSE("GPL");
  95