Rev 3770 | Rev 3862 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3770 | Rev 3835 | ||
---|---|---|---|
Line 38... | Line 38... | ||
38 | #ifndef KERN_sparc64_sun4v_MMU_TRAP_H_ |
38 | #ifndef KERN_sparc64_sun4v_MMU_TRAP_H_ |
39 | #define KERN_sparc64_sun4v_MMU_TRAP_H_ |
39 | #define KERN_sparc64_sun4v_MMU_TRAP_H_ |
40 | 40 | ||
41 | #include <arch/stack.h> |
41 | #include <arch/stack.h> |
42 | #include <arch/sun4v/regdef.h> |
42 | #include <arch/sun4v/regdef.h> |
- | 43 | #include <arch/sun4v/arch.h> |
|
- | 44 | #include <arch/sun4v/hypercall.h> |
|
43 | #include <arch/mm/sun4v/tlb.h> |
45 | #include <arch/mm/sun4v/tlb.h> |
44 | #include <arch/mm/sun4v/mmu.h> |
46 | #include <arch/mm/sun4v/mmu.h> |
45 | #include <arch/mm/sun4v/tte.h> |
47 | #include <arch/mm/sun4v/tte.h> |
46 | #include <arch/trap/regwin.h> |
48 | #include <arch/trap/regwin.h> |
47 | 49 | ||
Line 55... | Line 57... | ||
55 | 57 | ||
56 | #define FAST_MMU_HANDLER_SIZE 128 |
58 | #define FAST_MMU_HANDLER_SIZE 128 |
57 | 59 | ||
58 | #ifdef __ASM__ |
60 | #ifdef __ASM__ |
59 | 61 | ||
- | 62 | /* MMU fault status area data fault offset */ |
|
- | 63 | #define FSA_DFA_OFFSET 0x48 |
|
- | 64 | ||
- | 65 | /* MMU fault status area data context */ |
|
- | 66 | #define FSA_DFC_OFFSET 0x50 |
|
- | 67 | ||
- | 68 | /* offset of the target address within the TTE Data entry */ |
|
- | 69 | #define TTE_DATA_TADDR_OFFSET 13 |
|
- | 70 | ||
60 | .macro FAST_INSTRUCTION_ACCESS_MMU_MISS_HANDLER |
71 | .macro FAST_INSTRUCTION_ACCESS_MMU_MISS_HANDLER |
61 | .endm |
72 | .endm |
62 | 73 | ||
63 | /* |
74 | /* |
64 | * So far it is here only to process the trap which occurs when the kernel |
75 | * Handler of the Fast Data Access MMU Miss trap. If the trap occurred in the kernel |
65 | * needs to access the bootinfo structure, which is placed in the bootloader |
76 | * (context 0), an identity mapping (with displacement) is installed. Otherwise |
66 | * memory (i.e. before address 0x400000). |
77 | * a higher level service routine is called. |
- | 78 | * |
|
- | 79 | * TODO implement calling the higher level service routine |
|
67 | */ |
80 | */ |
68 | .macro FAST_DATA_ACCESS_MMU_MISS_HANDLER tl |
81 | .macro FAST_DATA_ACCESS_MMU_MISS_HANDLER tl |
- | 82 | ||
69 | save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
83 | mov SCRATCHPAD_MMU_FSA, %g1 |
- | 84 | ldxa [%g1] ASI_SCRATCHPAD, %g1 ! g1 <= RA of MMU fault status area |
|
- | 85 | ||
- | 86 | /* service by higher-level routine when context != 0 */ |
|
- | 87 | add %g1, FSA_DFC_OFFSET, %g2 ! g2 <= RA of data fault context |
|
- | 88 | ldxa [%g2] ASI_REAL, %g3 ! read the fault context |
|
70 | set 0x8000, %o0 |
89 | brnz %g3, 0f |
71 | set 0x0, %o1 |
90 | nop |
- | 91 | ||
- | 92 | /* read the faulting address */ |
|
- | 93 | add %g1, FSA_DFA_OFFSET, %g2 ! g2 <= RA of data fault address |
|
- | 94 | ldxa [%g2] ASI_REAL, %g1 ! read the fault address |
|
- | 95 | srlx %g1, TTE_DATA_TADDR_OFFSET, %g1 ! truncate it to page boundary |
|
72 | setx 0x80000000804087c3, %g1, %o2 |
96 | sllx %g1, TTE_DATA_TADDR_OFFSET, %g1 |
- | 97 | ||
- | 98 | /* exclude page number 0 from installing the identity mapping */ |
|
73 | set 0x3, %o3 |
99 | brz %g1, 0f |
74 | ta 0x83 |
100 | nop |
- | 101 | ||
- | 102 | /* installing the identity does not fit into 32 instructions, call a separate routine */ |
|
75 | restore %g0, 0, %g0 |
103 | ba install_identity_mapping |
76 | retry |
104 | nop |
- | 105 | ||
- | 106 | 0: ! TODO - call higher level service routine |
|
- | 107 | ||
77 | .endm |
108 | .endm |
78 | 109 | ||
79 | .macro FAST_DATA_ACCESS_PROTECTION_HANDLER tl |
110 | .macro FAST_DATA_ACCESS_PROTECTION_HANDLER tl |
80 | .endm |
111 | .endm |
81 | 112 |