Commit c80f84e3c037ebaebcec48f59c65be02a6d76a89
1 parent
d7e4b87e
Implement Process Priority Register as defined in the PowerPC 2.04 spec.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3282 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
39 additions
and
0 deletions
target-ppc/op.c
... | ... | @@ -295,6 +295,14 @@ void OPPROTO op_store_xer (void) |
295 | 295 | RETURN(); |
296 | 296 | } |
297 | 297 | |
298 | +#if defined(TARGET_PPC64) | |
299 | +void OPPROTO op_store_pri (void) | |
300 | +{ | |
301 | + do_store_pri(PARAM1); | |
302 | + RETURN(); | |
303 | +} | |
304 | +#endif | |
305 | + | |
298 | 306 | #if !defined(CONFIG_USER_ONLY) |
299 | 307 | /* Segment registers load and store */ |
300 | 308 | void OPPROTO op_load_sr (void) | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -112,6 +112,14 @@ void do_store_xer (void) |
112 | 112 | xer_bc = (T0 >> XER_BC) & 0x7F; |
113 | 113 | } |
114 | 114 | |
115 | +#if defined(TARGET_PPC64) | |
116 | +void do_store_pri (int prio) | |
117 | +{ | |
118 | + env->spr[SPR_PPR] &= ~0x001C000000000000ULL; | |
119 | + env->spr[SPR_PPR] |= ((uint64_t)prio & 0x7) << 50; | |
120 | +} | |
121 | +#endif | |
122 | + | |
115 | 123 | void do_load_fpscr (void) |
116 | 124 | { |
117 | 125 | /* The 32 MSB of the target fpr are undefined. | ... | ... |
target-ppc/op_helper.h
... | ... | @@ -57,6 +57,9 @@ void do_load_cr (void); |
57 | 57 | void do_store_cr (uint32_t mask); |
58 | 58 | void do_load_xer (void); |
59 | 59 | void do_store_xer (void); |
60 | +#if defined(TARGET_PPC64) | |
61 | +void do_store_pri (int prio); | |
62 | +#endif | |
60 | 63 | void do_load_fpscr (void); |
61 | 64 | void do_store_fpscr (uint32_t mask); |
62 | 65 | target_ulong ppc_load_dump_spr (int sprn); | ... | ... |
target-ppc/translate.c
... | ... | @@ -1124,6 +1124,26 @@ GEN_HANDLER(or, 0x1F, 0x1C, 0x0D, 0x00000000, PPC_INTEGER) |
1124 | 1124 | } else if (unlikely(Rc(ctx->opcode) != 0)) { |
1125 | 1125 | gen_op_load_gpr_T0(rs); |
1126 | 1126 | gen_set_Rc0(ctx); |
1127 | +#if defined(TARGET_PPC64) | |
1128 | + } else { | |
1129 | + switch (rs) { | |
1130 | + case 1: | |
1131 | + /* Set process priority to low */ | |
1132 | + gen_op_store_pri(2); | |
1133 | + break; | |
1134 | + case 6: | |
1135 | + /* Set process priority to medium-low */ | |
1136 | + gen_op_store_pri(3); | |
1137 | + break; | |
1138 | + case 2: | |
1139 | + /* Set process priority to normal */ | |
1140 | + gen_op_store_pri(4); | |
1141 | + break; | |
1142 | + default: | |
1143 | + /* nop */ | |
1144 | + break; | |
1145 | + } | |
1146 | +#endif | |
1127 | 1147 | } |
1128 | 1148 | } |
1129 | 1149 | ... | ... |