import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / mips / baget / bagetIRQ.S
1 /*
2  * bagetIRQ.S: Interrupt exception dispatch code for Baget/MIPS
3  *
4  * Copyright (C) 1998 Gleb Raiko & Vladimir Roganov
5  */
6 #include <asm/asm.h>
7 #include <asm/mipsregs.h>
8 #include <asm/regdef.h>
9 #include <asm/stackframe.h>
10 #include <asm/addrspace.h>
11
12         .text
13         .set    mips1
14         .set    reorder
15         .set    macro
16         .set    noat
17         .align  5
18
19 NESTED(bagetIRQ, PT_SIZE, sp)
20         SAVE_ALL
21         CLI                             # Important: mark KERNEL mode !
22
23         la      a1, baget_interrupt
24         .set    push
25         .set    noreorder
26         jal     a1
27         .set    pop
28         move    a0, sp
29
30         la      a1, ret_from_irq
31         jr      a1
32 END(bagetIRQ)
33
34 #define DBE_HANDLER       0x1C
35
36 NESTED(try_read, PT_SIZE, sp)
37         mfc0    t3, CP0_STATUS          # save flags and
38         CLI                             #  disable interrupts
39
40         li      t0, KSEG2
41         sltu    t1, t0, a0              # Is it KSEG2 address ?
42         beqz    t1, mapped              # No - already mapped !
43
44         move    t0, a0
45         ori     t0, 0xfff
46         xori    t0, 0xfff               # round address to page
47
48         ori     t1, t0, 0xf00           # prepare EntryLo (N,V,D,G)
49
50         mfc0    t2,   CP0_ENTRYHI       # save ASID value
51         mtc0    zero, CP0_INDEX
52         mtc0    t0,   CP0_ENTRYHI       # Load MMU values ...
53         mtc0    t1,   CP0_ENTRYLO0
54         nop                             # let it understand
55         nop
56         tlbwi                           # ... and write ones
57         nop
58         nop
59         mtc0    t2,  CP0_ENTRYHI
60
61 mapped:
62         la      t0, exception_handlers
63         lw      t1, DBE_HANDLER(t0)     # save real handler
64         la      t2, dbe_handler
65         sw      t2, DBE_HANDLER(t0)     # set temporary local handler
66         li      v0, -1                  # default (failure) value
67
68         li      t2, 1
69         beq     t2, a1, 1f
70         li      t2, 2
71         beq     t2, a1, 2f
72         li      t2, 4
73         beq     t2, a1, 4f
74         b       out
75
76 1:      lbu     v0, (a0)                # byte
77         b       out
78
79 2:      lhu     v0, (a0)                # short
80         b       out
81
82 4:      lw      v0, (a0)                # word
83
84 out:
85         sw      t1, DBE_HANDLER(t0)     # restore real handler
86         mtc0    t3, CP0_STATUS          # restore CPU flags
87         jr      ra
88
89 dbe_handler:
90         li      v0, -1                  # mark our failure
91         .set    push
92         .set    noreorder
93         b       out                     # "no problems !"
94         rfe                             #   return from trap
95         .set    pop
96 END(try_read)