Revision 36f69651
b/target-ppc/op.c | ||
---|---|---|
1884 | 1884 |
} |
1885 | 1885 |
#endif |
1886 | 1886 |
|
1887 |
/* Instruction cache block invalidate */ |
|
1888 |
void OPPROTO op_icbi (void) |
|
1889 |
{ |
|
1890 |
do_icbi(); |
|
1891 |
RETURN(); |
|
1892 |
} |
|
1893 |
|
|
1894 |
#if defined(TARGET_PPC64) |
|
1895 |
void OPPROTO op_icbi_64 (void) |
|
1896 |
{ |
|
1897 |
do_icbi_64(); |
|
1898 |
RETURN(); |
|
1899 |
} |
|
1900 |
#endif |
|
1901 |
|
|
1902 | 1887 |
#if !defined(CONFIG_USER_ONLY) |
1903 | 1888 |
/* tlbia */ |
1904 | 1889 |
PPC_OP(tlbia) |
b/target-ppc/op_helper.c | ||
---|---|---|
808 | 808 |
} |
809 | 809 |
#endif |
810 | 810 |
|
811 |
/* Instruction cache invalidation helper */ |
|
812 |
void do_icbi (void) |
|
813 |
{ |
|
814 |
uint32_t tmp; |
|
815 |
/* Invalidate one cache line : |
|
816 |
* PowerPC specification says this is to be treated like a load |
|
817 |
* (not a fetch) by the MMU. To be sure it will be so, |
|
818 |
* do the load "by hand". |
|
819 |
*/ |
|
820 |
tmp = ldl_kernel((uint32_t)T0); |
|
821 |
T0 &= ~(ICACHE_LINE_SIZE - 1); |
|
822 |
tb_invalidate_page_range((uint32_t)T0, (uint32_t)(T0 + ICACHE_LINE_SIZE)); |
|
823 |
} |
|
824 |
|
|
825 |
#if defined(TARGET_PPC64) |
|
826 |
void do_icbi_64 (void) |
|
827 |
{ |
|
828 |
uint64_t tmp; |
|
829 |
/* Invalidate one cache line : |
|
830 |
* PowerPC specification says this is to be treated like a load |
|
831 |
* (not a fetch) by the MMU. To be sure it will be so, |
|
832 |
* do the load "by hand". |
|
833 |
*/ |
|
834 |
tmp = ldq_kernel((uint64_t)T0); |
|
835 |
T0 &= ~(ICACHE_LINE_SIZE - 1); |
|
836 |
tb_invalidate_page_range((uint64_t)T0, (uint64_t)(T0 + ICACHE_LINE_SIZE)); |
|
837 |
} |
|
838 |
#endif |
|
839 |
|
|
840 | 811 |
/*****************************************************************************/ |
841 | 812 |
/* PowerPC 601 specific instructions (POWER bridge) */ |
842 | 813 |
void do_POWER_abso (void) |
b/target-ppc/op_helper.h | ||
---|---|---|
29 | 29 |
void glue(do_lmw_le, MEMSUFFIX) (int dst); |
30 | 30 |
void glue(do_stmw, MEMSUFFIX) (int src); |
31 | 31 |
void glue(do_stmw_le, MEMSUFFIX) (int src); |
32 |
void glue(do_icbi, MEMSUFFIX) (void); |
|
32 | 33 |
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb); |
33 | 34 |
void glue(do_POWER2_lfq, MEMSUFFIX) (void); |
34 | 35 |
void glue(do_POWER2_lfq_le, MEMSUFFIX) (void); |
... | ... | |
44 | 45 |
void glue(do_lmw_le_64, MEMSUFFIX) (int dst); |
45 | 46 |
void glue(do_stmw_64, MEMSUFFIX) (int src); |
46 | 47 |
void glue(do_stmw_le_64, MEMSUFFIX) (int src); |
48 |
void glue(do_icbi_64, MEMSUFFIX) (void); |
|
47 | 49 |
#endif |
48 | 50 |
|
49 | 51 |
#else |
... | ... | |
102 | 104 |
#if defined(TARGET_PPC64) |
103 | 105 |
void do_td (int flags); |
104 | 106 |
#endif |
105 |
void do_icbi (void); |
|
106 |
#if defined(TARGET_PPC64) |
|
107 |
void do_icbi_64 (void); |
|
108 |
#endif |
|
109 |
|
|
110 | 107 |
#if !defined(CONFIG_USER_ONLY) |
111 | 108 |
void do_rfi (void); |
112 | 109 |
#if defined(TARGET_PPC64) |
b/target-ppc/op_helper_mem.h | ||
---|---|---|
242 | 242 |
} |
243 | 243 |
#endif |
244 | 244 |
|
245 |
/* Instruction cache invalidation helper */ |
|
246 |
void glue(do_icbi, MEMSUFFIX) (void) |
|
247 |
{ |
|
248 |
uint32_t tmp; |
|
249 |
/* Invalidate one cache line : |
|
250 |
* PowerPC specification says this is to be treated like a load |
|
251 |
* (not a fetch) by the MMU. To be sure it will be so, |
|
252 |
* do the load "by hand". |
|
253 |
*/ |
|
254 |
tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
|
255 |
T0 &= ~(ICACHE_LINE_SIZE - 1); |
|
256 |
tb_invalidate_page_range((uint32_t)T0, (uint32_t)(T0 + ICACHE_LINE_SIZE)); |
|
257 |
} |
|
258 |
|
|
259 |
#if defined(TARGET_PPC64) |
|
260 |
void glue(do_icbi_64, MEMSUFFIX) (void) |
|
261 |
{ |
|
262 |
uint64_t tmp; |
|
263 |
/* Invalidate one cache line : |
|
264 |
* PowerPC specification says this is to be treated like a load |
|
265 |
* (not a fetch) by the MMU. To be sure it will be so, |
|
266 |
* do the load "by hand". |
|
267 |
*/ |
|
268 |
tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0); |
|
269 |
T0 &= ~(ICACHE_LINE_SIZE - 1); |
|
270 |
tb_invalidate_page_range((uint64_t)T0, (uint64_t)(T0 + ICACHE_LINE_SIZE)); |
|
271 |
} |
|
272 |
#endif |
|
273 |
|
|
245 | 274 |
/* PPC 601 specific instructions (POWER bridge) */ |
246 | 275 |
// XXX: to be tested |
247 | 276 |
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb) |
b/target-ppc/op_mem.h | ||
---|---|---|
730 | 730 |
} |
731 | 731 |
#endif |
732 | 732 |
|
733 |
/* Instruction cache block invalidate */ |
|
734 |
void OPPROTO glue(op_icbi, MEMSUFFIX) (void) |
|
735 |
{ |
|
736 |
glue(do_icbi, MEMSUFFIX)(); |
|
737 |
RETURN(); |
|
738 |
} |
|
739 |
|
|
740 |
#if defined(TARGET_PPC64) |
|
741 |
void OPPROTO glue(op_icbi_64, MEMSUFFIX) (void) |
|
742 |
{ |
|
743 |
glue(do_icbi_64, MEMSUFFIX)(); |
|
744 |
RETURN(); |
|
745 |
} |
|
746 |
#endif |
|
747 |
|
|
733 | 748 |
/* External access */ |
734 | 749 |
void OPPROTO glue(op_eciwx, MEMSUFFIX) (void) |
735 | 750 |
{ |
b/target-ppc/translate.c | ||
---|---|---|
3069 | 3069 |
} |
3070 | 3070 |
|
3071 | 3071 |
/* icbi */ |
3072 |
#define op_icbi() (*gen_op_icbi[ctx->mem_idx])() |
|
3073 |
#if defined(TARGET_PPC64) |
|
3074 |
#if defined(CONFIG_USER_ONLY) |
|
3075 |
static GenOpFunc *gen_op_icbi[] = { |
|
3076 |
&gen_op_icbi_raw, |
|
3077 |
&gen_op_icbi_raw, |
|
3078 |
&gen_op_icbi_64_raw, |
|
3079 |
&gen_op_icbi_64_raw, |
|
3080 |
}; |
|
3081 |
#else |
|
3082 |
static GenOpFunc *gen_op_icbi[] = { |
|
3083 |
&gen_op_icbi_user, |
|
3084 |
&gen_op_icbi_user, |
|
3085 |
&gen_op_icbi_kernel, |
|
3086 |
&gen_op_icbi_kernel, |
|
3087 |
&gen_op_icbi_64_user, |
|
3088 |
&gen_op_icbi_64_user, |
|
3089 |
&gen_op_icbi_64_kernel, |
|
3090 |
&gen_op_icbi_64_kernel, |
|
3091 |
}; |
|
3092 |
#endif |
|
3093 |
#else |
|
3094 |
#if defined(CONFIG_USER_ONLY) |
|
3095 |
static GenOpFunc *gen_op_icbi[] = { |
|
3096 |
&gen_op_icbi_raw, |
|
3097 |
&gen_op_icbi_raw, |
|
3098 |
}; |
|
3099 |
#else |
|
3100 |
static GenOpFunc *gen_op_icbi[] = { |
|
3101 |
&gen_op_icbi_user, |
|
3102 |
&gen_op_icbi_user, |
|
3103 |
&gen_op_icbi_kernel, |
|
3104 |
&gen_op_icbi_kernel, |
|
3105 |
}; |
|
3106 |
#endif |
|
3107 |
#endif |
|
3072 | 3108 |
GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE) |
3073 | 3109 |
{ |
3074 | 3110 |
/* NIP cannot be restored if the memory exception comes from an helper */ |
3075 | 3111 |
gen_update_nip(ctx, ctx->nip - 4); |
3076 | 3112 |
gen_addr_reg_index(ctx); |
3077 |
#if defined(TARGET_PPC64) |
|
3078 |
if (ctx->sf_mode) |
|
3079 |
gen_op_icbi_64(); |
|
3080 |
else |
|
3081 |
#endif |
|
3082 |
gen_op_icbi(); |
|
3113 |
op_icbi(); |
|
3083 | 3114 |
RET_STOP(ctx); |
3084 | 3115 |
} |
3085 | 3116 |
|
Also available in: Unified diff