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,6 +295,14 @@ void OPPROTO op_store_xer (void) | ||
| 295 | RETURN(); | 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 | #if !defined(CONFIG_USER_ONLY) | 306 | #if !defined(CONFIG_USER_ONLY) |
| 299 | /* Segment registers load and store */ | 307 | /* Segment registers load and store */ |
| 300 | void OPPROTO op_load_sr (void) | 308 | void OPPROTO op_load_sr (void) |
target-ppc/op_helper.c
| @@ -112,6 +112,14 @@ void do_store_xer (void) | @@ -112,6 +112,14 @@ void do_store_xer (void) | ||
| 112 | xer_bc = (T0 >> XER_BC) & 0x7F; | 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 | void do_load_fpscr (void) | 123 | void do_load_fpscr (void) |
| 116 | { | 124 | { |
| 117 | /* The 32 MSB of the target fpr are undefined. | 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,6 +57,9 @@ void do_load_cr (void); | ||
| 57 | void do_store_cr (uint32_t mask); | 57 | void do_store_cr (uint32_t mask); |
| 58 | void do_load_xer (void); | 58 | void do_load_xer (void); |
| 59 | void do_store_xer (void); | 59 | void do_store_xer (void); |
| 60 | +#if defined(TARGET_PPC64) | ||
| 61 | +void do_store_pri (int prio); | ||
| 62 | +#endif | ||
| 60 | void do_load_fpscr (void); | 63 | void do_load_fpscr (void); |
| 61 | void do_store_fpscr (uint32_t mask); | 64 | void do_store_fpscr (uint32_t mask); |
| 62 | target_ulong ppc_load_dump_spr (int sprn); | 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,6 +1124,26 @@ GEN_HANDLER(or, 0x1F, 0x1C, 0x0D, 0x00000000, PPC_INTEGER) | ||
| 1124 | } else if (unlikely(Rc(ctx->opcode) != 0)) { | 1124 | } else if (unlikely(Rc(ctx->opcode) != 0)) { |
| 1125 | gen_op_load_gpr_T0(rs); | 1125 | gen_op_load_gpr_T0(rs); |
| 1126 | gen_set_Rc0(ctx); | 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 |