root / target-ppc / mmu-hash64.h @ 6fc76aa9
History | View | Annotate | Download (4.3 kB)
1 | 10b46525 | David Gibson | #if !defined (__MMU_HASH64_H__)
|
---|---|---|---|
2 | 10b46525 | David Gibson | #define __MMU_HASH64_H__
|
3 | 10b46525 | David Gibson | |
4 | 10b46525 | David Gibson | #ifndef CONFIG_USER_ONLY
|
5 | 10b46525 | David Gibson | |
6 | 10b46525 | David Gibson | #ifdef TARGET_PPC64
|
7 | 10b46525 | David Gibson | void dump_slb(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env);
|
8 | 10b46525 | David Gibson | int ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs);
|
9 | f2ad6be8 | David Gibson | hwaddr ppc_hash64_get_phys_page_debug(CPUPPCState *env, target_ulong addr); |
10 | 25de24ab | David Gibson | int ppc_hash64_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw, |
11 | 25de24ab | David Gibson | int mmu_idx);
|
12 | 10b46525 | David Gibson | #endif
|
13 | 10b46525 | David Gibson | |
14 | d5aea6f3 | David Gibson | /*
|
15 | d5aea6f3 | David Gibson | * SLB definitions
|
16 | d5aea6f3 | David Gibson | */
|
17 | d5aea6f3 | David Gibson | |
18 | d5aea6f3 | David Gibson | /* Bits in the SLB ESID word */
|
19 | d5aea6f3 | David Gibson | #define SLB_ESID_ESID 0xFFFFFFFFF0000000ULL |
20 | d5aea6f3 | David Gibson | #define SLB_ESID_V 0x0000000008000000ULL /* valid */ |
21 | d5aea6f3 | David Gibson | |
22 | d5aea6f3 | David Gibson | /* Bits in the SLB VSID word */
|
23 | d5aea6f3 | David Gibson | #define SLB_VSID_SHIFT 12 |
24 | d5aea6f3 | David Gibson | #define SLB_VSID_SHIFT_1T 24 |
25 | d5aea6f3 | David Gibson | #define SLB_VSID_SSIZE_SHIFT 62 |
26 | d5aea6f3 | David Gibson | #define SLB_VSID_B 0xc000000000000000ULL |
27 | d5aea6f3 | David Gibson | #define SLB_VSID_B_256M 0x0000000000000000ULL |
28 | d5aea6f3 | David Gibson | #define SLB_VSID_B_1T 0x4000000000000000ULL |
29 | d5aea6f3 | David Gibson | #define SLB_VSID_VSID 0x3FFFFFFFFFFFF000ULL |
30 | d5aea6f3 | David Gibson | #define SLB_VSID_PTEM (SLB_VSID_B | SLB_VSID_VSID)
|
31 | d5aea6f3 | David Gibson | #define SLB_VSID_KS 0x0000000000000800ULL |
32 | d5aea6f3 | David Gibson | #define SLB_VSID_KP 0x0000000000000400ULL |
33 | d5aea6f3 | David Gibson | #define SLB_VSID_N 0x0000000000000200ULL /* no-execute */ |
34 | d5aea6f3 | David Gibson | #define SLB_VSID_L 0x0000000000000100ULL |
35 | d5aea6f3 | David Gibson | #define SLB_VSID_C 0x0000000000000080ULL /* class */ |
36 | d5aea6f3 | David Gibson | #define SLB_VSID_LP 0x0000000000000030ULL |
37 | d5aea6f3 | David Gibson | #define SLB_VSID_ATTR 0x0000000000000FFFULL |
38 | d5aea6f3 | David Gibson | |
39 | d5aea6f3 | David Gibson | /*
|
40 | d5aea6f3 | David Gibson | * Hash page table definitions
|
41 | d5aea6f3 | David Gibson | */
|
42 | d5aea6f3 | David Gibson | |
43 | d5aea6f3 | David Gibson | #define HPTES_PER_GROUP 8 |
44 | d5aea6f3 | David Gibson | #define HASH_PTE_SIZE_64 16 |
45 | d5aea6f3 | David Gibson | #define HASH_PTEG_SIZE_64 (HASH_PTE_SIZE_64 * HPTES_PER_GROUP)
|
46 | d5aea6f3 | David Gibson | |
47 | d5aea6f3 | David Gibson | #define HPTE64_V_SSIZE_SHIFT 62 |
48 | d5aea6f3 | David Gibson | #define HPTE64_V_AVPN_SHIFT 7 |
49 | d5aea6f3 | David Gibson | #define HPTE64_V_AVPN 0x3fffffffffffff80ULL |
50 | d5aea6f3 | David Gibson | #define HPTE64_V_AVPN_VAL(x) (((x) & HPTE64_V_AVPN) >> HPTE64_V_AVPN_SHIFT)
|
51 | d5aea6f3 | David Gibson | #define HPTE64_V_COMPARE(x, y) (!(((x) ^ (y)) & 0xffffffffffffff80ULL)) |
52 | d5aea6f3 | David Gibson | #define HPTE64_V_LARGE 0x0000000000000004ULL |
53 | d5aea6f3 | David Gibson | #define HPTE64_V_SECONDARY 0x0000000000000002ULL |
54 | d5aea6f3 | David Gibson | #define HPTE64_V_VALID 0x0000000000000001ULL |
55 | d5aea6f3 | David Gibson | |
56 | d5aea6f3 | David Gibson | #define HPTE64_R_PP0 0x8000000000000000ULL |
57 | d5aea6f3 | David Gibson | #define HPTE64_R_TS 0x4000000000000000ULL |
58 | d5aea6f3 | David Gibson | #define HPTE64_R_KEY_HI 0x3000000000000000ULL |
59 | d5aea6f3 | David Gibson | #define HPTE64_R_RPN_SHIFT 12 |
60 | d5aea6f3 | David Gibson | #define HPTE64_R_RPN 0x0ffffffffffff000ULL |
61 | d5aea6f3 | David Gibson | #define HPTE64_R_FLAGS 0x00000000000003ffULL |
62 | d5aea6f3 | David Gibson | #define HPTE64_R_PP 0x0000000000000003ULL |
63 | d5aea6f3 | David Gibson | #define HPTE64_R_N 0x0000000000000004ULL |
64 | d5aea6f3 | David Gibson | #define HPTE64_R_G 0x0000000000000008ULL |
65 | d5aea6f3 | David Gibson | #define HPTE64_R_M 0x0000000000000010ULL |
66 | d5aea6f3 | David Gibson | #define HPTE64_R_I 0x0000000000000020ULL |
67 | d5aea6f3 | David Gibson | #define HPTE64_R_W 0x0000000000000040ULL |
68 | d5aea6f3 | David Gibson | #define HPTE64_R_WIMG 0x0000000000000078ULL |
69 | d5aea6f3 | David Gibson | #define HPTE64_R_C 0x0000000000000080ULL |
70 | d5aea6f3 | David Gibson | #define HPTE64_R_R 0x0000000000000100ULL |
71 | d5aea6f3 | David Gibson | #define HPTE64_R_KEY_LO 0x0000000000000e00ULL |
72 | d5aea6f3 | David Gibson | |
73 | d5aea6f3 | David Gibson | #define HPTE64_V_1TB_SEG 0x4000000000000000ULL |
74 | d5aea6f3 | David Gibson | #define HPTE64_V_VRMA_MASK 0x4001ffffff000000ULL |
75 | d5aea6f3 | David Gibson | |
76 | dffdaf61 | David Gibson | static inline target_ulong ppc_hash64_load_hpte0(CPUPPCState *env, |
77 | dffdaf61 | David Gibson | hwaddr pte_offset) |
78 | dffdaf61 | David Gibson | { |
79 | dffdaf61 | David Gibson | if (env->external_htab) {
|
80 | dffdaf61 | David Gibson | return ldq_p(env->external_htab + pte_offset);
|
81 | dffdaf61 | David Gibson | } else {
|
82 | dffdaf61 | David Gibson | return ldq_phys(env->htab_base + pte_offset);
|
83 | dffdaf61 | David Gibson | } |
84 | dffdaf61 | David Gibson | } |
85 | dffdaf61 | David Gibson | |
86 | dffdaf61 | David Gibson | static inline target_ulong ppc_hash64_load_hpte1(CPUPPCState *env, |
87 | dffdaf61 | David Gibson | hwaddr pte_offset) |
88 | dffdaf61 | David Gibson | { |
89 | dffdaf61 | David Gibson | if (env->external_htab) {
|
90 | dffdaf61 | David Gibson | return ldq_p(env->external_htab + pte_offset + HASH_PTE_SIZE_64/2); |
91 | dffdaf61 | David Gibson | } else {
|
92 | dffdaf61 | David Gibson | return ldq_phys(env->htab_base + pte_offset + HASH_PTE_SIZE_64/2); |
93 | dffdaf61 | David Gibson | } |
94 | dffdaf61 | David Gibson | } |
95 | dffdaf61 | David Gibson | |
96 | dffdaf61 | David Gibson | static inline void ppc_hash64_store_hpte0(CPUPPCState *env, |
97 | dffdaf61 | David Gibson | hwaddr pte_offset, target_ulong pte0) |
98 | dffdaf61 | David Gibson | { |
99 | dffdaf61 | David Gibson | if (env->external_htab) {
|
100 | dffdaf61 | David Gibson | stq_p(env->external_htab + pte_offset, pte0); |
101 | dffdaf61 | David Gibson | } else {
|
102 | dffdaf61 | David Gibson | stq_phys(env->htab_base + pte_offset, pte0); |
103 | dffdaf61 | David Gibson | } |
104 | dffdaf61 | David Gibson | } |
105 | dffdaf61 | David Gibson | |
106 | dffdaf61 | David Gibson | static inline void ppc_hash64_store_hpte1(CPUPPCState *env, |
107 | dffdaf61 | David Gibson | hwaddr pte_offset, target_ulong pte1) |
108 | dffdaf61 | David Gibson | { |
109 | dffdaf61 | David Gibson | if (env->external_htab) {
|
110 | dffdaf61 | David Gibson | stq_p(env->external_htab + pte_offset + HASH_PTE_SIZE_64/2, pte1);
|
111 | dffdaf61 | David Gibson | } else {
|
112 | dffdaf61 | David Gibson | stq_phys(env->htab_base + pte_offset + HASH_PTE_SIZE_64/2, pte1);
|
113 | dffdaf61 | David Gibson | } |
114 | dffdaf61 | David Gibson | } |
115 | dffdaf61 | David Gibson | |
116 | aea390e4 | David Gibson | typedef struct { |
117 | aea390e4 | David Gibson | uint64_t pte0, pte1; |
118 | aea390e4 | David Gibson | } ppc_hash_pte64_t; |
119 | aea390e4 | David Gibson | |
120 | 10b46525 | David Gibson | #endif /* CONFIG_USER_ONLY */ |
121 | 10b46525 | David Gibson | |
122 | 10b46525 | David Gibson | #endif /* !defined (__MMU_HASH64_H__) */ |