]> git.wh0rd.org Git - patches.git/blob - bfin-request-exception.patch
scummvm random work
[patches.git] / bfin-request-exception.patch
1 Index: include/asm-blackfin/irq_handler.h
2 ===================================================================
3 --- include/asm-blackfin/irq_handler.h  (revision 3496)
4 +++ include/asm-blackfin/irq_handler.h  (working copy)
5 @@ -18,5 +21,13 @@
6  asmlinkage void evt_soft_int1(void);
7  asmlinkage void evt_system_call(void);
8  asmlinkage void init_exception_buff(void);
9 +asmlinkage void trap_c(struct pt_regs *fp);
10 +asmlinkage void ex_replaceable(void);
11  
12 +extern void *ex_table[];
13 +extern void return_from_exception(void);
14 +
15 +extern int bfin_request_exception(unsigned int exception, void (*handler)(void));
16 +extern int bfin_free_exception(unsigned int exception, void (*handler)(void));
17 +
18  #endif
19 Index: arch/blackfin/kernel/traps.c
20 ===================================================================
21 --- arch/blackfin/kernel/traps.c        (revision 3496)
22 +++ arch/blackfin/kernel/traps.c        (working copy)
23 @@ -50,8 +50,6 @@
24         CSYNC();
25  }
26  
27 -asmlinkage void trap_c(struct pt_regs *fp);
28 -
29  int kstack_depth_to_print = 48;
30  
31  #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
32 @@ -673,9 +671,8 @@
33  }
34  
35  #ifdef CONFIG_SYS_BFIN_SPINLOCK_L1
36 -asmlinkage int sys_bfin_spinlock(int *spinlock)__attribute__((l1_text));
37 +__attribute__((l1_text))
38  #endif
39 -
40  asmlinkage int sys_bfin_spinlock(int *spinlock)
41  {
42         int ret = 0;
43 @@ -693,6 +690,42 @@
44         return ret;
45  }
46  
47 +int bfin_request_exception(unsigned int exception, void (*handler)(void))
48 +{
49 +       void (*curr_handler)(void);
50 +
51 +       if (exception > 0x3F)
52 +               return -EINVAL;
53 +
54 +       curr_handler = ex_table[exception];
55 +
56 +       if (curr_handler != ex_replaceable)
57 +               return -EBUSY;
58 +
59 +       ex_table[exception] = handler;
60 +
61 +       return 0;
62 +}
63 +EXPORT_SYMBOL(bfin_request_exception);
64 +
65 +int bfin_free_exception(unsigned int exception, void (*handler)(void))
66 +{
67 +       void (*curr_handler)(void);
68 +
69 +       if (exception > 0x3F)
70 +               return -EINVAL;
71 +
72 +       curr_handler = ex_table[exception];
73 +
74 +       if (curr_handler != handler)
75 +               return -EBUSY;
76 +
77 +       ex_table[exception] = ex_replaceable;
78 +
79 +       return 0;
80 +}
81 +EXPORT_SYMBOL(bfin_free_exception);
82 +
83  void panic_cplb_error(int cplb_panic, struct pt_regs *fp)
84  {
85         switch (cplb_panic) {
86 Index: arch/blackfin/mach-common/entry.S
87 ===================================================================
88 --- arch/blackfin/mach-common/entry.S   (revision 3496)
89 +++ arch/blackfin/mach-common/entry.S   (working copy)
90 @@ -135,7 +135,7 @@
91         cc = r6 == r7;
92         if !cc jump _ex_trap_c;
93  
94 -_return_from_exception:
95 +ENTRY(_return_from_exception)
96         DEBUG_START_HWTRACE(p5, r7)
97  #if ANOMALY_05000257
98         R7=LC0;
99 @@ -163,6 +163,9 @@
100         [--sp] = ASTAT;
101         [--sp] = (R7:6, P5:4);
102  
103 +ENTRY(_ex_replaceable)
104 +       nop;
105 +
106  ENTRY(_ex_trap_c)
107         /* Call C code (trap_c) to handle the exception, which most
108          * likely involves sending a signal to the current process.
109 @@ -290,8 +293,8 @@
110         r6.l = lo(SEQSTAT_EXCAUSE);
111         r6.h = hi(SEQSTAT_EXCAUSE);
112         r7 = r7 & r6;
113 -       p5.h = _extable;
114 -       p5.l = _extable;
115 +       p5.h = _ex_table;
116 +       p5.l = _ex_table;
117         p4 = r7;
118         p5 = p5 + (p4 << 2);
119         p4 = [p5];
120 @@ -810,28 +813,27 @@
121  #else
122  .data
123  #endif
124 -ALIGN
125 -_extable:
126 +ENTRY(_ex_table)
127         /* entry for each EXCAUSE[5:0]
128          * This table must be in sync with the table in ./kernel/traps.c
129          * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined
130          */
131 -       .long _ex_syscall;      /* 0x00 - User Defined - Linux Syscall */
132 +       .long _ex_syscall       /* 0x00 - User Defined - Linux Syscall */
133         .long _ex_soft_bp       /* 0x01 - User Defined - Software breakpoint */
134 -       .long _ex_trap_c        /* 0x02 - User Defined */
135 +       .long _ex_replaceable   /* 0x02 - User Defined */
136         .long _ex_trap_c        /* 0x03 - User Defined - userspace stack overflow */
137 -       .long _ex_trap_c        /* 0x04 - User Defined */
138 -       .long _ex_trap_c        /* 0x05 - User Defined */
139 -       .long _ex_trap_c        /* 0x06 - User Defined */
140 -       .long _ex_trap_c        /* 0x07 - User Defined */
141 -       .long _ex_trap_c        /* 0x08 - User Defined */
142 -       .long _ex_trap_c        /* 0x09 - User Defined */
143 -       .long _ex_trap_c        /* 0x0A - User Defined */
144 -       .long _ex_trap_c        /* 0x0B - User Defined */
145 -       .long _ex_trap_c        /* 0x0C - User Defined */
146 -       .long _ex_trap_c        /* 0x0D - User Defined */
147 -       .long _ex_trap_c        /* 0x0E - User Defined */
148 -       .long _ex_trap_c        /* 0x0F - User Defined */
149 +       .long _ex_replaceable   /* 0x04 - User Defined */
150 +       .long _ex_replaceable   /* 0x05 - User Defined */
151 +       .long _ex_replaceable   /* 0x06 - User Defined */
152 +       .long _ex_replaceable   /* 0x07 - User Defined */
153 +       .long _ex_replaceable   /* 0x08 - User Defined */
154 +       .long _ex_replaceable   /* 0x09 - User Defined */
155 +       .long _ex_replaceable   /* 0x0A - User Defined */
156 +       .long _ex_replaceable   /* 0x0B - User Defined */
157 +       .long _ex_replaceable   /* 0x0C - User Defined */
158 +       .long _ex_replaceable   /* 0x0D - User Defined */
159 +       .long _ex_replaceable   /* 0x0E - User Defined */
160 +       .long _ex_replaceable   /* 0x0F - User Defined */
161         .long _ex_single_step   /* 0x10 - HW Single step */
162  #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
163         .long _ex_trace_buff_full /* 0x11 - Trace Buffer Full */
164 @@ -885,8 +887,8 @@
165         .long _ex_trap_c        /* 0x3D - Reserved */
166         .long _ex_trap_c        /* 0x3E - Reserved */
167         .long _ex_trap_c        /* 0x3F - Reserved */
168 +END(_ex_table)
169  
170 -ALIGN
171  ENTRY(_sys_call_table)
172         .long _sys_ni_syscall   /* 0  -  old "setup()" system call*/
173         .long _sys_exit