#include "config.h"
-#define IN_OP_I386
+#define NO_CPU_IO_DEFS
#include "cpu.h"
#include "exec-all.h"
#include "disas.h"
uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
#endif
+int code_copy_enabled = 1;
+
#ifdef DEBUG_DISAS
static const char *op_str[] = {
#define DEF(s, n, copy_size) #s,
uint8_t *gen_code_buf;
int gen_code_size;
- if (gen_intermediate_code(env, tb) < 0)
- return -1;
+#ifdef USE_CODE_COPY
+ if (code_copy_enabled &&
+ cpu_gen_code_copy(env, tb, max_code_size, &gen_code_size) == 0) {
+ /* nothing more to do */
+ } else
+#endif
+ {
+ if (gen_intermediate_code(env, tb) < 0)
+ return -1;
- /* generate machine code */
- tb->tb_next_offset[0] = 0xffff;
- tb->tb_next_offset[1] = 0xffff;
- gen_code_buf = tb->tc_ptr;
+ /* generate machine code */
+ tb->tb_next_offset[0] = 0xffff;
+ tb->tb_next_offset[1] = 0xffff;
+ gen_code_buf = tb->tc_ptr;
#ifdef USE_DIRECT_JUMP
- /* the following two entries are optional (only used for string ops) */
- tb->tb_jmp_offset[2] = 0xffff;
- tb->tb_jmp_offset[3] = 0xffff;
+ /* the following two entries are optional (only used for string ops) */
+ tb->tb_jmp_offset[2] = 0xffff;
+ tb->tb_jmp_offset[3] = 0xffff;
#endif
- gen_code_size = dyngen_code(gen_code_buf, tb->tb_next_offset,
+ gen_code_size = dyngen_code(gen_code_buf, tb->tb_next_offset,
#ifdef USE_DIRECT_JUMP
- tb->tb_jmp_offset,
+ tb->tb_jmp_offset,
#else
- NULL,
+ NULL,
#endif
- gen_opc_buf, gen_opparam_buf);
+ gen_opc_buf, gen_opparam_buf);
+ }
*gen_code_size_ptr = gen_code_size;
#ifdef DEBUG_DISAS
- if (loglevel) {
+ if (loglevel & CPU_LOG_TB_OUT_ASM) {
fprintf(logfile, "OUT: [size=%d]\n", *gen_code_size_ptr);
- disas(logfile, gen_code_buf, *gen_code_size_ptr, 1, 0);
+ disas(logfile, tb->tc_ptr, *gen_code_size_ptr, 1, 0);
fprintf(logfile, "\n");
fflush(logfile);
}
/* The cpu state corresponding to 'searched_pc' is restored.
*/
int cpu_restore_state(TranslationBlock *tb,
- CPUState *env, unsigned long searched_pc)
+ CPUState *env, unsigned long searched_pc,
+ void *puc)
{
int j, c;
unsigned long tc_ptr;
uint16_t *opc_ptr;
+#ifdef USE_CODE_COPY
+ if (tb->cflags & CF_CODE_COPY) {
+ return cpu_restore_state_copy(tb, env, searched_pc, puc);
+ }
+#endif
if (gen_intermediate_code_pc(env, tb) < 0)
return -1;
{
int cc_op;
#ifdef DEBUG_DISAS
- if (loglevel) {
+ if (loglevel & CPU_LOG_TB_OP) {
int i;
fprintf(logfile, "RESTORE:\n");
for(i=0;i<=j; i++) {
#elif defined(TARGET_ARM)
env->regs[15] = gen_opc_pc[j];
#elif defined(TARGET_SPARC)
+ /* XXX: restore npc too */
env->pc = gen_opc_pc[j];
#elif defined(TARGET_PPC)
- env->nip = gen_opc_pc[j];
+ {
+ int type;
+ /* for PPC, we need to look at the micro operation to get the
+ access type */
+ env->nip = gen_opc_pc[j];
+ switch(c) {
+#if defined(CONFIG_USER_ONLY)
+#define CASE3(op)\
+ case INDEX_op_ ## op ## _raw
+#else
+#define CASE3(op)\
+ case INDEX_op_ ## op ## _user:\
+ case INDEX_op_ ## op ## _kernel
+#endif
+
+ CASE3(stfd):
+ CASE3(stfs):
+ CASE3(lfd):
+ CASE3(lfs):
+ type = ACCESS_FLOAT;
+ break;
+ CASE3(stwcx):
+ type = ACCESS_RES;
+ break;
+ CASE3(eciwx):
+ CASE3(ecowx):
+ type = ACCESS_EXT;
+ break;
+ default:
+ type = ACCESS_INT;
+ break;
+ }
+ env->access_type = type;
+ }
#endif
return 0;
}