qemu/include/exec/cpu_ldst_useronly_template.h
<<
>>
Prefs
   1/*
   2 *  User-only accessor function support
   3 *
   4 * Generate inline load/store functions for one data size.
   5 *
   6 * Generate a store function as well as signed and unsigned loads.
   7 *
   8 * Not used directly but included from cpu_ldst.h.
   9 *
  10 *  Copyright (c) 2015 Linaro Limited
  11 *
  12 * This library is free software; you can redistribute it and/or
  13 * modify it under the terms of the GNU Lesser General Public
  14 * License as published by the Free Software Foundation; either
  15 * version 2 of the License, or (at your option) any later version.
  16 *
  17 * This library is distributed in the hope that it will be useful,
  18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20 * Lesser General Public License for more details.
  21 *
  22 * You should have received a copy of the GNU Lesser General Public
  23 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  24 */
  25
  26#if !defined(CODE_ACCESS)
  27#include "trace-root.h"
  28#endif
  29
  30#include "trace/mem.h"
  31
  32#if DATA_SIZE == 8
  33#define SUFFIX q
  34#define USUFFIX q
  35#define DATA_TYPE uint64_t
  36#elif DATA_SIZE == 4
  37#define SUFFIX l
  38#define USUFFIX l
  39#define DATA_TYPE uint32_t
  40#elif DATA_SIZE == 2
  41#define SUFFIX w
  42#define USUFFIX uw
  43#define DATA_TYPE uint16_t
  44#define DATA_STYPE int16_t
  45#elif DATA_SIZE == 1
  46#define SUFFIX b
  47#define USUFFIX ub
  48#define DATA_TYPE uint8_t
  49#define DATA_STYPE int8_t
  50#else
  51#error unsupported data size
  52#endif
  53
  54#if DATA_SIZE == 8
  55#define RES_TYPE uint64_t
  56#else
  57#define RES_TYPE uint32_t
  58#endif
  59
  60static inline RES_TYPE
  61glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
  62{
  63#if !defined(CODE_ACCESS)
  64    trace_guest_mem_before_exec(
  65        ENV_GET_CPU(env), ptr,
  66        trace_mem_build_info(DATA_SIZE, false, MO_TE, false));
  67#endif
  68    return glue(glue(ld, USUFFIX), _p)(g2h(ptr));
  69}
  70
  71static inline RES_TYPE
  72glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
  73                                                  target_ulong ptr,
  74                                                  uintptr_t retaddr)
  75{
  76    return glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(env, ptr);
  77}
  78
  79#if DATA_SIZE <= 2
  80static inline int
  81glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
  82{
  83#if !defined(CODE_ACCESS)
  84    trace_guest_mem_before_exec(
  85        ENV_GET_CPU(env), ptr,
  86        trace_mem_build_info(DATA_SIZE, true, MO_TE, false));
  87#endif
  88    return glue(glue(lds, SUFFIX), _p)(g2h(ptr));
  89}
  90
  91static inline int
  92glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
  93                                                  target_ulong ptr,
  94                                                  uintptr_t retaddr)
  95{
  96    return glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(env, ptr);
  97}
  98#endif
  99
 100#ifndef CODE_ACCESS
 101static inline void
 102glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr,
 103                                      RES_TYPE v)
 104{
 105#if !defined(CODE_ACCESS)
 106    trace_guest_mem_before_exec(
 107        ENV_GET_CPU(env), ptr,
 108        trace_mem_build_info(DATA_SIZE, false, MO_TE, true));
 109#endif
 110    glue(glue(st, SUFFIX), _p)(g2h(ptr), v);
 111}
 112
 113static inline void
 114glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
 115                                                  target_ulong ptr,
 116                                                  RES_TYPE v,
 117                                                  uintptr_t retaddr)
 118{
 119    glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(env, ptr, v);
 120}
 121#endif
 122
 123#undef RES_TYPE
 124#undef DATA_TYPE
 125#undef DATA_STYPE
 126#undef SUFFIX
 127#undef USUFFIX
 128#undef DATA_SIZE
 129