softmmu_outside_jit.h revision 741dc13597ac064e6a48bb2a6ec069cbc1cd0dbb
1/* Copyright (C) 2007-2009 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12 13/* 14 * Contains SOFTMMU macros expansion for ldx_user and stx_user routines used 15 * outside of JIT. The issue is that regular implementation of these routines 16 * assumes that pointer to CPU environment is stored in ebp register, which 17 * is true for calls made inside JIT, but is not necessarily true for calls 18 * made outside of JIT. The way SOFTMMU macros are expanded in this header 19 * enforces ldx/stx routines to use CPU environment stored in cpu_single_env 20 * variable. 21 */ 22#ifndef QEMU_SOFTMMU_OUTSIDE_JIT_H 23#define QEMU_SOFTMMU_OUTSIDE_JIT_H 24 25#ifdef __cplusplus 26extern "C" { 27#endif 28 29//////////////////////////////////////////////////////////////////////////////// 30// Declares routines implemented in softmmu_outside_jit.c, that are used in 31// this macros expansion. Note that MMUSUFFIX _outside_jit is enforced in 32// softmmu_header.h by defining OUTSIDE_JIT macro. 33//////////////////////////////////////////////////////////////////////////////// 34 35uint8_t REGPARM __ldb_outside_jit(target_ulong addr, int mmu_idx); 36void REGPARM __stb_outside_jit(target_ulong addr, uint8_t val, int mmu_idx); 37uint16_t REGPARM __ldw_outside_jit(target_ulong addr, int mmu_idx); 38void REGPARM __stw_outside_jit(target_ulong addr, uint16_t val, int mmu_idx); 39uint32_t REGPARM __ldl_outside_jit(target_ulong addr, int mmu_idx); 40void REGPARM __stl_outside_jit(target_ulong addr, uint32_t val, int mmu_idx); 41uint64_t REGPARM __ldq_outside_jit(target_ulong addr, int mmu_idx); 42void REGPARM __stq_outside_jit(target_ulong addr, uint64_t val, int mmu_idx); 43 44// Enforces MMUSUFFIX to be set to _outside_jit in softmmu_header.h 45#define OUTSIDE_JIT 46// Enforces use of cpu_single_env for CPU environment. 47#define env cpu_single_env 48 49// ============================================================================= 50// Generate ld/stx_user 51// ============================================================================= 52#if defined(TARGET_MIPS) 53#define MEMSUFFIX MMU_MODE2_SUFFIX 54#else 55#define MEMSUFFIX MMU_MODE1_SUFFIX 56#endif 57#define ACCESS_TYPE 1 58 59#define DATA_SIZE 1 60#include "softmmu_header.h" 61 62#define DATA_SIZE 2 63#include "softmmu_header.h" 64 65#define DATA_SIZE 4 66#include "softmmu_header.h" 67 68#define DATA_SIZE 8 69#include "softmmu_header.h" 70 71#undef MEMSUFFIX 72#undef ACCESS_TYPE 73 74// ============================================================================= 75// Generate ld/stx_kernel 76// ============================================================================= 77#define MEMSUFFIX MMU_MODE0_SUFFIX 78#define ACCESS_TYPE 0 79 80#define DATA_SIZE 1 81#include "softmmu_header.h" 82 83#define DATA_SIZE 2 84#include "softmmu_header.h" 85 86#define DATA_SIZE 4 87#include "softmmu_header.h" 88 89#define DATA_SIZE 8 90#include "softmmu_header.h" 91 92#undef MEMSUFFIX 93#undef ACCESS_TYPE 94 95#undef env 96#undef OUTSIDE_JIT 97 98#ifdef __cplusplus 99}; /* end of extern "C" */ 100#endif 101 102#endif // QEMU_SOFTMMU_OUTSIDE_JIT_H 103