summaryrefslogtreecommitdiffstats
path: root/src/llvm/hqemu-helper.c
blob: 632571627496649f1e28aaeac57ac11d9ea4866a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "cpu.h"
#include "tcg.h"
#include "exec/helper-proto.h"
#include "hqemu.h"
#include "fpu/softfloat-native.h"

CPUArchState basereg;
target_ulong pcid;

#if defined(TARGET_I386)
XMMReg xmm_reg;
#endif

extern TranslationBlock *tbs;

void *ibtc_lookup(CPUArchState *env);
void *cpbl_lookup(CPUArchState *env);
int cpbl_validate(CPUArchState *env, target_ulong pc, int id);

/* This helper is a hack to export symbols of helper functions in the LLVM
 * bitcode file. If a target is alerted with lacks of symbols of function/variable,
 * add such symbols in this helper by accessing it. */
void helper_export_hqemu(CPUArchState *env)
{
    helper_lookup_ibtc(env);
    helper_lookup_cpbl(env);
    helper_validate_cpbl(env, 0, 0);

#if defined(CONFIG_SOFTMMU) && defined(CONFIG_LLVM)
    target_ulong ptr = 0;
    llvm_ret_ldub_mmu(env, ptr, 0);
    llvm_le_lduw_mmu(env, ptr, 0);
    llvm_le_ldul_mmu(env, ptr, 0);
    llvm_le_ldq_mmu(env, ptr, 0);
    llvm_be_lduw_mmu(env, ptr, 0);
    llvm_be_ldul_mmu(env, ptr, 0);
    llvm_be_ldq_mmu(env, ptr, 0);
    llvm_ret_ldsb_mmu(env, ptr, 0);
    llvm_le_ldsw_mmu(env, ptr, 0);
    llvm_le_ldsl_mmu(env, ptr, 0);
    llvm_be_ldsw_mmu(env, ptr, 0);
    llvm_be_ldsl_mmu(env, ptr, 0);
    llvm_ret_stb_mmu(env, ptr, 0, 0);
    llvm_le_stw_mmu(env, ptr, 0, 0);
    llvm_le_stl_mmu(env, ptr, 0, 0);
    llvm_le_stq_mmu(env, ptr, 0, 0);
    llvm_be_stw_mmu(env, ptr, 0, 0);
    llvm_be_stl_mmu(env, ptr, 0, 0);
    llvm_be_stq_mmu(env, ptr, 0, 0);
#endif
}

void helper_verify_tb(CPUArchState *env, int id)
{
    static TranslationBlock *last_tb;
    TranslationBlock *tb = &tbs[id];
    if (tb->mode == BLOCK_INVALID) {
        fprintf(stderr, "%s: tb=%p pc=" TARGET_FMT_lx " last_pc="
                TARGET_FMT_lx "\n", __func__, tb, tb->pc,
                (last_tb) ? last_tb->pc : -1U);
    }
    last_tb = tb;
}

/*
 * helper_profile_exec is used to profile LLVM translated code.
 */
void helper_profile_exec(CPUArchState *env, void *counter_p, int idx)
{
    CPUState *cpu = ENV_GET_CPU(env);
    uint64_t **counter = (uint64_t **)counter_p;
    counter[cpu->cpu_index][idx]++;
}

/*
 * vim: ts=8 sts=4 sw=4 expandtab
 */
OpenPOWER on IntegriCloud