xref: /qemu/target/ppc/mmu-radix64.h (revision 51806b545834e0902dd2d17d1f66c7a2d83422f3)
1d5fee0bbSSuraj Jitindar Singh #ifndef MMU_RADIX64_H
2d5fee0bbSSuraj Jitindar Singh #define MMU_RADIX64_H
3d5fee0bbSSuraj Jitindar Singh 
4d5fee0bbSSuraj Jitindar Singh #ifndef CONFIG_USER_ONLY
5d5fee0bbSSuraj Jitindar Singh 
6d5fee0bbSSuraj Jitindar Singh /* Radix Quadrants */
7d5fee0bbSSuraj Jitindar Singh #define R_EADDR_MASK            0x3FFFFFFFFFFFFFFF
8d5fee0bbSSuraj Jitindar Singh #define R_EADDR_QUADRANT        0xC000000000000000
9d5fee0bbSSuraj Jitindar Singh #define R_EADDR_QUADRANT0       0x0000000000000000
10d5fee0bbSSuraj Jitindar Singh #define R_EADDR_QUADRANT1       0x4000000000000000
11d5fee0bbSSuraj Jitindar Singh #define R_EADDR_QUADRANT2       0x8000000000000000
12d5fee0bbSSuraj Jitindar Singh #define R_EADDR_QUADRANT3       0xC000000000000000
13d5fee0bbSSuraj Jitindar Singh 
14d5fee0bbSSuraj Jitindar Singh /* Radix Partition Table Entry Fields */
1579825f4dSBenjamin Herrenschmidt #define PATE1_R_PRTB           0x0FFFFFFFFFFFF000
1679825f4dSBenjamin Herrenschmidt #define PATE1_R_PRTS           0x000000000000001F
17d5fee0bbSSuraj Jitindar Singh 
18d5fee0bbSSuraj Jitindar Singh /* Radix Process Table Entry Fields */
19d5fee0bbSSuraj Jitindar Singh #define PRTBE_R_GET_RTS(rts) \
20d5fee0bbSSuraj Jitindar Singh     ((((rts >> 58) & 0x18) | ((rts >> 5) & 0x7)) + 31)
21d5fee0bbSSuraj Jitindar Singh #define PRTBE_R_RPDB            0x0FFFFFFFFFFFFF00
22d5fee0bbSSuraj Jitindar Singh #define PRTBE_R_RPDS            0x000000000000001F
23d5fee0bbSSuraj Jitindar Singh 
24d5fee0bbSSuraj Jitindar Singh /* Radix Page Directory/Table Entry Fields */
25d5fee0bbSSuraj Jitindar Singh #define R_PTE_VALID             0x8000000000000000
26d5fee0bbSSuraj Jitindar Singh #define R_PTE_LEAF              0x4000000000000000
27d5fee0bbSSuraj Jitindar Singh #define R_PTE_SW0               0x2000000000000000
28d5fee0bbSSuraj Jitindar Singh #define R_PTE_RPN               0x01FFFFFFFFFFF000
29d5fee0bbSSuraj Jitindar Singh #define R_PTE_SW1               0x0000000000000E00
30d5fee0bbSSuraj Jitindar Singh #define R_GET_SW(sw)            (((sw >> 58) & 0x8) | ((sw >> 9) & 0x7))
31d5fee0bbSSuraj Jitindar Singh #define R_PTE_R                 0x0000000000000100
32d5fee0bbSSuraj Jitindar Singh #define R_PTE_C                 0x0000000000000080
33d5fee0bbSSuraj Jitindar Singh #define R_PTE_ATT               0x0000000000000030
34d5fee0bbSSuraj Jitindar Singh #define R_PTE_ATT_NORMAL        0x0000000000000000
35d5fee0bbSSuraj Jitindar Singh #define R_PTE_ATT_SAO           0x0000000000000010
36d5fee0bbSSuraj Jitindar Singh #define R_PTE_ATT_NI_IO         0x0000000000000020
37d5fee0bbSSuraj Jitindar Singh #define R_PTE_ATT_TOLERANT_IO   0x0000000000000030
38d5fee0bbSSuraj Jitindar Singh #define R_PTE_EAA_PRIV          0x0000000000000008
39d5fee0bbSSuraj Jitindar Singh #define R_PTE_EAA_R             0x0000000000000004
40d5fee0bbSSuraj Jitindar Singh #define R_PTE_EAA_RW            0x0000000000000002
41d5fee0bbSSuraj Jitindar Singh #define R_PTE_EAA_X             0x0000000000000001
42d5fee0bbSSuraj Jitindar Singh #define R_PDE_NLB               PRTBE_R_RPDB
43d5fee0bbSSuraj Jitindar Singh #define R_PDE_NLS               PRTBE_R_RPDS
44d5fee0bbSSuraj Jitindar Singh 
45d5fee0bbSSuraj Jitindar Singh #ifdef TARGET_PPC64
46d5fee0bbSSuraj Jitindar Singh 
47*51806b54SRichard Henderson bool ppc_radix64_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
48*51806b54SRichard Henderson                        hwaddr *raddr, int *psizep, int *protp,
49*51806b54SRichard Henderson                        bool guest_visible);
50d5fee0bbSSuraj Jitindar Singh 
51d5fee0bbSSuraj Jitindar Singh static inline int ppc_radix64_get_prot_eaa(uint64_t pte)
52d5fee0bbSSuraj Jitindar Singh {
53d5fee0bbSSuraj Jitindar Singh     return (pte & R_PTE_EAA_R ? PAGE_READ : 0) |
54d5fee0bbSSuraj Jitindar Singh            (pte & R_PTE_EAA_RW ? PAGE_READ | PAGE_WRITE : 0) |
55d5fee0bbSSuraj Jitindar Singh            (pte & R_PTE_EAA_X ? PAGE_EXEC : 0);
56d5fee0bbSSuraj Jitindar Singh }
57d5fee0bbSSuraj Jitindar Singh 
586fc00960SGreg Kurz static inline int ppc_radix64_get_prot_amr(const PowerPCCPU *cpu)
59d5fee0bbSSuraj Jitindar Singh {
606fc00960SGreg Kurz     const CPUPPCState *env = &cpu->env;
61d5fee0bbSSuraj Jitindar Singh     int amr = env->spr[SPR_AMR] >> 62; /* We only care about key0 AMR63:62 */
62d5fee0bbSSuraj Jitindar Singh     int iamr = env->spr[SPR_IAMR] >> 62; /* We only care about key0 IAMR63:62 */
63d5fee0bbSSuraj Jitindar Singh 
64d5fee0bbSSuraj Jitindar Singh     return (amr & 0x2 ? 0 : PAGE_WRITE) | /* Access denied if bit is set */
65d5fee0bbSSuraj Jitindar Singh            (amr & 0x1 ? 0 : PAGE_READ) |
66d5fee0bbSSuraj Jitindar Singh            (iamr & 0x1 ? 0 : PAGE_EXEC);
67d5fee0bbSSuraj Jitindar Singh }
68d5fee0bbSSuraj Jitindar Singh 
69d5fee0bbSSuraj Jitindar Singh #endif /* TARGET_PPC64 */
70d5fee0bbSSuraj Jitindar Singh 
71d5fee0bbSSuraj Jitindar Singh #endif /* CONFIG_USER_ONLY */
72d5fee0bbSSuraj Jitindar Singh 
73d5fee0bbSSuraj Jitindar Singh #endif /* MMU_RADIX64_H */
74