Commit ac9eb0731ad123f8789005978500ac67026188c2

Authored by bellard
1 parent 9a64fbe4

suppressed explicit access type and use the exception routine to infer it from the micro operation


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@529 c046a42c-6fe2-441c-8c8c-71466251a162
target-ppc/cpu.h
@@ -153,6 +153,8 @@ typedef struct CPUPPCState { @@ -153,6 +153,8 @@ typedef struct CPUPPCState {
153 jmp_buf jmp_env; 153 jmp_buf jmp_env;
154 int exception_index; 154 int exception_index;
155 int error_code; 155 int error_code;
  156 + int access_type; /* when a memory exception occurs, the access
  157 + type is stored here */
156 uint32_t exceptions; /* exception queue */ 158 uint32_t exceptions; /* exception queue */
157 uint32_t errors[16]; 159 uint32_t errors[16];
158 int user_mode_only; /* user mode only simulation */ 160 int user_mode_only; /* user mode only simulation */
target-ppc/helper.c
@@ -512,7 +512,7 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, @@ -512,7 +512,7 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw,
512 512
513 // printf("%s 0\n", __func__); 513 // printf("%s 0\n", __func__);
514 is_user = flags & 0x01; 514 is_user = flags & 0x01;
515 - access_type = flags & ~0x01; 515 + access_type = env->access_type;
516 if (env->user_mode_only) { 516 if (env->user_mode_only) {
517 /* user mode only emulation */ 517 /* user mode only emulation */
518 ret = -1; 518 ret = -1;
target-ppc/op_helper_mem.h
@@ -8,14 +8,14 @@ void glue(do_lsw, MEMSUFFIX) (int dst) @@ -8,14 +8,14 @@ void glue(do_lsw, MEMSUFFIX) (int dst)
8 __func__, T0, T1, dst); 8 __func__, T0, T1, dst);
9 } 9 }
10 for (; T1 > 3; T1 -= 4, T0 += 4) { 10 for (; T1 > 3; T1 -= 4, T0 += 4) {
11 - ugpr(dst++) = glue(_ldl, MEMSUFFIX)((void *)T0, ACCESS_INT); 11 + ugpr(dst++) = glue(ldl, MEMSUFFIX)((void *)T0);
12 if (dst == 32) 12 if (dst == 32)
13 dst = 0; 13 dst = 0;
14 } 14 }
15 if (T1 > 0) { 15 if (T1 > 0) {
16 tmp = 0; 16 tmp = 0;
17 for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) { 17 for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) {
18 - tmp |= glue(_ldub, MEMSUFFIX)((void *)T0, ACCESS_INT) << sh; 18 + tmp |= glue(ldub, MEMSUFFIX)((void *)T0) << sh;
19 } 19 }
20 ugpr(dst) = tmp; 20 ugpr(dst) = tmp;
21 } 21 }
@@ -30,14 +30,13 @@ void glue(do_stsw, MEMSUFFIX) (int src) @@ -30,14 +30,13 @@ void glue(do_stsw, MEMSUFFIX) (int src)
30 __func__, T0, T1, src); 30 __func__, T0, T1, src);
31 } 31 }
32 for (; T1 > 3; T1 -= 4, T0 += 4) { 32 for (; T1 > 3; T1 -= 4, T0 += 4) {
33 - glue(_stl, MEMSUFFIX)((void *)T0, ugpr(src++), ACCESS_INT); 33 + glue(stl, MEMSUFFIX)((void *)T0, ugpr(src++));
34 if (src == 32) 34 if (src == 32)
35 src = 0; 35 src = 0;
36 } 36 }
37 if (T1 > 0) { 37 if (T1 > 0) {
38 for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) 38 for (sh = 24; T1 > 0; T1--, T0++, sh -= 8)
39 - glue(_stb, MEMSUFFIX)((void *)T0, (ugpr(src) >> sh) & 0xFF,  
40 - ACCESS_INT); 39 + glue(stb, MEMSUFFIX)((void *)T0, (ugpr(src) >> sh) & 0xFF);
41 } 40 }
42 } 41 }
43 42
target-ppc/op_mem.h
@@ -2,68 +2,62 @@ @@ -2,68 +2,62 @@
2 void glue(do_lsw, MEMSUFFIX) (int dst); 2 void glue(do_lsw, MEMSUFFIX) (int dst);
3 void glue(do_stsw, MEMSUFFIX) (int src); 3 void glue(do_stsw, MEMSUFFIX) (int src);
4 4
5 -/* Internal helpers for sign extension and byte-reverse */  
6 -static inline uint32_t glue(_ld16x, MEMSUFFIX) (void *EA, int type) 5 +static inline uint16_t glue(ld16r, MEMSUFFIX) (void *EA)
7 { 6 {
8 - return s_ext16(glue(_lduw, MEMSUFFIX)(EA, type));  
9 -}  
10 -  
11 -static inline uint16_t glue(_ld16r, MEMSUFFIX) (void *EA, int type)  
12 -{  
13 - uint16_t tmp = glue(_lduw, MEMSUFFIX)(EA, type); 7 + uint16_t tmp = glue(lduw, MEMSUFFIX)(EA);
14 return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8); 8 return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8);
15 } 9 }
16 10
17 -static inline uint32_t glue(_ld32r, MEMSUFFIX) (void *EA, int type) 11 +static inline uint32_t glue(ld32r, MEMSUFFIX) (void *EA)
18 { 12 {
19 - uint32_t tmp = glue(_ldl, MEMSUFFIX)(EA, type); 13 + uint32_t tmp = glue(ldl, MEMSUFFIX)(EA);
20 return ((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) | 14 return ((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) |
21 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24); 15 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24);
22 } 16 }
23 17
24 -static inline void glue(_st16r, MEMSUFFIX) (void *EA, uint16_t data, int type) 18 +static inline void glue(st16r, MEMSUFFIX) (void *EA, uint16_t data)
25 { 19 {
26 uint16_t tmp = ((data & 0xFF00) >> 8) | ((data & 0x00FF) << 8); 20 uint16_t tmp = ((data & 0xFF00) >> 8) | ((data & 0x00FF) << 8);
27 - glue(_stw, MEMSUFFIX)(EA, tmp, type); 21 + glue(stw, MEMSUFFIX)(EA, tmp);
28 } 22 }
29 23
30 -static inline void glue(_st32r, MEMSUFFIX) (void *EA, uint32_t data, int type) 24 +static inline void glue(st32r, MEMSUFFIX) (void *EA, uint32_t data)
31 { 25 {
32 uint32_t tmp = ((data & 0xFF000000) >> 24) | ((data & 0x00FF0000) >> 8) | 26 uint32_t tmp = ((data & 0xFF000000) >> 24) | ((data & 0x00FF0000) >> 8) |
33 ((data & 0x0000FF00) << 8) | ((data & 0x000000FF) << 24); 27 ((data & 0x0000FF00) << 8) | ((data & 0x000000FF) << 24);
34 - glue(_stl, MEMSUFFIX)(EA, tmp, type); 28 + glue(stl, MEMSUFFIX)(EA, tmp);
35 } 29 }
36 30
37 /*** Integer load ***/ 31 /*** Integer load ***/
38 #define PPC_LD_OP(name, op) \ 32 #define PPC_LD_OP(name, op) \
39 PPC_OP(glue(glue(l, name), MEMSUFFIX)) \ 33 PPC_OP(glue(glue(l, name), MEMSUFFIX)) \
40 { \ 34 { \
41 - T1 = glue(op, MEMSUFFIX)((void *)T0, ACCESS_INT); \ 35 + T1 = glue(op, MEMSUFFIX)((void *)T0); \
42 RETURN(); \ 36 RETURN(); \
43 } 37 }
44 38
45 #define PPC_ST_OP(name, op) \ 39 #define PPC_ST_OP(name, op) \
46 PPC_OP(glue(glue(st, name), MEMSUFFIX)) \ 40 PPC_OP(glue(glue(st, name), MEMSUFFIX)) \
47 { \ 41 { \
48 - glue(op, MEMSUFFIX)((void *)T0, T1, ACCESS_INT); \ 42 + glue(op, MEMSUFFIX)((void *)T0, T1); \
49 RETURN(); \ 43 RETURN(); \
50 } 44 }
51 45
52 -PPC_LD_OP(bz, _ldub);  
53 -PPC_LD_OP(ha, _ld16x);  
54 -PPC_LD_OP(hz, _lduw);  
55 -PPC_LD_OP(wz, _ldl); 46 +PPC_LD_OP(bz, ldub);
  47 +PPC_LD_OP(ha, ldsw);
  48 +PPC_LD_OP(hz, lduw);
  49 +PPC_LD_OP(wz, ldl);
56 50
57 /*** Integer store ***/ 51 /*** Integer store ***/
58 -PPC_ST_OP(b, _stb);  
59 -PPC_ST_OP(h, _stw);  
60 -PPC_ST_OP(w, _stl); 52 +PPC_ST_OP(b, stb);
  53 +PPC_ST_OP(h, stw);
  54 +PPC_ST_OP(w, stl);
61 55
62 /*** Integer load and store with byte reverse ***/ 56 /*** Integer load and store with byte reverse ***/
63 -PPC_LD_OP(hbr, _ld16r);  
64 -PPC_LD_OP(wbr, _ld32r);  
65 -PPC_ST_OP(hbr, _st16r);  
66 -PPC_ST_OP(wbr, _st32r); 57 +PPC_LD_OP(hbr, ld16r);
  58 +PPC_LD_OP(wbr, ld32r);
  59 +PPC_ST_OP(hbr, st16r);
  60 +PPC_ST_OP(wbr, st32r);
67 61
68 /*** Integer load and store multiple ***/ 62 /*** Integer load and store multiple ***/
69 PPC_OP(glue(lmw, MEMSUFFIX)) 63 PPC_OP(glue(lmw, MEMSUFFIX))
@@ -71,7 +65,7 @@ PPC_OP(glue(lmw, MEMSUFFIX)) @@ -71,7 +65,7 @@ PPC_OP(glue(lmw, MEMSUFFIX))
71 int dst = PARAM(1); 65 int dst = PARAM(1);
72 66
73 for (; dst < 32; dst++, T0 += 4) { 67 for (; dst < 32; dst++, T0 += 4) {
74 - ugpr(dst) = glue(_ldl, MEMSUFFIX)((void *)T0, ACCESS_INT); 68 + ugpr(dst) = glue(ldl, MEMSUFFIX)((void *)T0);
75 } 69 }
76 RETURN(); 70 RETURN();
77 } 71 }
@@ -81,7 +75,7 @@ PPC_OP(glue(stmw, MEMSUFFIX)) @@ -81,7 +75,7 @@ PPC_OP(glue(stmw, MEMSUFFIX))
81 int src = PARAM(1); 75 int src = PARAM(1);
82 76
83 for (; src < 32; src++, T0 += 4) { 77 for (; src < 32; src++, T0 += 4) {
84 - glue(_stl, MEMSUFFIX)((void *)T0, ugpr(src), ACCESS_INT); 78 + glue(stl, MEMSUFFIX)((void *)T0, ugpr(src));
85 } 79 }
86 RETURN(); 80 RETURN();
87 } 81 }
@@ -150,7 +144,7 @@ PPC_OP(glue(stwcx, MEMSUFFIX)) @@ -150,7 +144,7 @@ PPC_OP(glue(stwcx, MEMSUFFIX))
150 if (regs->reserve != T0) { 144 if (regs->reserve != T0) {
151 env->crf[0] = xer_ov; 145 env->crf[0] = xer_ov;
152 } else { 146 } else {
153 - glue(_stl, MEMSUFFIX)((void *)T0, T1, ACCESS_RES); 147 + glue(stl, MEMSUFFIX)((void *)T0, T1);
154 env->crf[0] = xer_ov | 0x02; 148 env->crf[0] = xer_ov | 0x02;
155 } 149 }
156 } 150 }
@@ -160,27 +154,27 @@ PPC_OP(glue(stwcx, MEMSUFFIX)) @@ -160,27 +154,27 @@ PPC_OP(glue(stwcx, MEMSUFFIX))
160 154
161 PPC_OP(glue(dcbz, MEMSUFFIX)) 155 PPC_OP(glue(dcbz, MEMSUFFIX))
162 { 156 {
163 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x00), 0, ACCESS_INT);  
164 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x04), 0, ACCESS_INT);  
165 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x08), 0, ACCESS_INT);  
166 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x0C), 0, ACCESS_INT);  
167 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x10), 0, ACCESS_INT);  
168 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x14), 0, ACCESS_INT);  
169 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x18), 0, ACCESS_INT);  
170 - glue(_stl, MEMSUFFIX)((void *)(T0 + 0x1C), 0, ACCESS_INT); 157 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x00), 0);
  158 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x04), 0);
  159 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x08), 0);
  160 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x0C), 0);
  161 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x10), 0);
  162 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x14), 0);
  163 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x18), 0);
  164 + glue(stl, MEMSUFFIX)((void *)(T0 + 0x1C), 0);
171 RETURN(); 165 RETURN();
172 } 166 }
173 167
174 /* External access */ 168 /* External access */
175 PPC_OP(glue(eciwx, MEMSUFFIX)) 169 PPC_OP(glue(eciwx, MEMSUFFIX))
176 { 170 {
177 - T1 = glue(_ldl, MEMSUFFIX)((void *)T0, ACCESS_EXT); 171 + T1 = glue(ldl, MEMSUFFIX)((void *)T0);
178 RETURN(); 172 RETURN();
179 } 173 }
180 174
181 PPC_OP(glue(ecowx, MEMSUFFIX)) 175 PPC_OP(glue(ecowx, MEMSUFFIX))
182 { 176 {
183 - glue(_stl, MEMSUFFIX)((void *)T0, T1, ACCESS_EXT); 177 + glue(stl, MEMSUFFIX)((void *)T0, T1);
184 RETURN(); 178 RETURN();
185 } 179 }
186 180