cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

timebase_helper.c (5543B)


      1/*
      2 *  PowerPC emulation helpers for QEMU.
      3 *
      4 *  Copyright (c) 2003-2007 Jocelyn Mayer
      5 *
      6 * This library is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * This library is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
     18 */
     19#include "qemu/osdep.h"
     20#include "cpu.h"
     21#include "exec/helper-proto.h"
     22#include "exec/exec-all.h"
     23#include "qemu/log.h"
     24#include "qemu/main-loop.h"
     25
     26/*****************************************************************************/
     27/* SPR accesses */
     28
     29target_ulong helper_load_tbl(CPUPPCState *env)
     30{
     31    return (target_ulong)cpu_ppc_load_tbl(env);
     32}
     33
     34target_ulong helper_load_tbu(CPUPPCState *env)
     35{
     36    return cpu_ppc_load_tbu(env);
     37}
     38
     39target_ulong helper_load_atbl(CPUPPCState *env)
     40{
     41    return (target_ulong)cpu_ppc_load_atbl(env);
     42}
     43
     44target_ulong helper_load_atbu(CPUPPCState *env)
     45{
     46    return cpu_ppc_load_atbu(env);
     47}
     48
     49target_ulong helper_load_vtb(CPUPPCState *env)
     50{
     51    return cpu_ppc_load_vtb(env);
     52}
     53
     54#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
     55target_ulong helper_load_purr(CPUPPCState *env)
     56{
     57    return (target_ulong)cpu_ppc_load_purr(env);
     58}
     59
     60void helper_store_purr(CPUPPCState *env, target_ulong val)
     61{
     62    cpu_ppc_store_purr(env, val);
     63}
     64#endif
     65
     66target_ulong helper_load_601_rtcl(CPUPPCState *env)
     67{
     68    return cpu_ppc601_load_rtcl(env);
     69}
     70
     71target_ulong helper_load_601_rtcu(CPUPPCState *env)
     72{
     73    return cpu_ppc601_load_rtcu(env);
     74}
     75
     76#if !defined(CONFIG_USER_ONLY)
     77void helper_store_tbl(CPUPPCState *env, target_ulong val)
     78{
     79    cpu_ppc_store_tbl(env, val);
     80}
     81
     82void helper_store_tbu(CPUPPCState *env, target_ulong val)
     83{
     84    cpu_ppc_store_tbu(env, val);
     85}
     86
     87void helper_store_atbl(CPUPPCState *env, target_ulong val)
     88{
     89    cpu_ppc_store_atbl(env, val);
     90}
     91
     92void helper_store_atbu(CPUPPCState *env, target_ulong val)
     93{
     94    cpu_ppc_store_atbu(env, val);
     95}
     96
     97void helper_store_601_rtcl(CPUPPCState *env, target_ulong val)
     98{
     99    cpu_ppc601_store_rtcl(env, val);
    100}
    101
    102void helper_store_601_rtcu(CPUPPCState *env, target_ulong val)
    103{
    104    cpu_ppc601_store_rtcu(env, val);
    105}
    106
    107target_ulong helper_load_decr(CPUPPCState *env)
    108{
    109    return cpu_ppc_load_decr(env);
    110}
    111
    112void helper_store_decr(CPUPPCState *env, target_ulong val)
    113{
    114    cpu_ppc_store_decr(env, val);
    115}
    116
    117target_ulong helper_load_hdecr(CPUPPCState *env)
    118{
    119    return cpu_ppc_load_hdecr(env);
    120}
    121
    122void helper_store_hdecr(CPUPPCState *env, target_ulong val)
    123{
    124    cpu_ppc_store_hdecr(env, val);
    125}
    126
    127void helper_store_vtb(CPUPPCState *env, target_ulong val)
    128{
    129    cpu_ppc_store_vtb(env, val);
    130}
    131
    132void helper_store_tbu40(CPUPPCState *env, target_ulong val)
    133{
    134    cpu_ppc_store_tbu40(env, val);
    135}
    136
    137target_ulong helper_load_40x_pit(CPUPPCState *env)
    138{
    139    return load_40x_pit(env);
    140}
    141
    142void helper_store_40x_pit(CPUPPCState *env, target_ulong val)
    143{
    144    store_40x_pit(env, val);
    145}
    146
    147void helper_store_booke_tcr(CPUPPCState *env, target_ulong val)
    148{
    149    store_booke_tcr(env, val);
    150}
    151
    152void helper_store_booke_tsr(CPUPPCState *env, target_ulong val)
    153{
    154    store_booke_tsr(env, val);
    155}
    156#endif
    157
    158/*****************************************************************************/
    159/* Embedded PowerPC specific helpers */
    160
    161/* XXX: to be improved to check access rights when in user-mode */
    162target_ulong helper_load_dcr(CPUPPCState *env, target_ulong dcrn)
    163{
    164    uint32_t val = 0;
    165
    166    if (unlikely(env->dcr_env == NULL)) {
    167        qemu_log_mask(LOG_GUEST_ERROR, "No DCR environment\n");
    168        raise_exception_err_ra(env, POWERPC_EXCP_PROGRAM,
    169                               POWERPC_EXCP_INVAL |
    170                               POWERPC_EXCP_INVAL_INVAL, GETPC());
    171    } else {
    172        int ret;
    173
    174        qemu_mutex_lock_iothread();
    175        ret = ppc_dcr_read(env->dcr_env, (uint32_t)dcrn, &val);
    176        qemu_mutex_unlock_iothread();
    177        if (unlikely(ret != 0)) {
    178            qemu_log_mask(LOG_GUEST_ERROR, "DCR read error %d %03x\n",
    179                          (uint32_t)dcrn, (uint32_t)dcrn);
    180            raise_exception_err_ra(env, POWERPC_EXCP_PROGRAM,
    181                                   POWERPC_EXCP_INVAL |
    182                                   POWERPC_EXCP_PRIV_REG, GETPC());
    183        }
    184    }
    185    return val;
    186}
    187
    188void helper_store_dcr(CPUPPCState *env, target_ulong dcrn, target_ulong val)
    189{
    190    if (unlikely(env->dcr_env == NULL)) {
    191        qemu_log_mask(LOG_GUEST_ERROR, "No DCR environment\n");
    192        raise_exception_err_ra(env, POWERPC_EXCP_PROGRAM,
    193                               POWERPC_EXCP_INVAL |
    194                               POWERPC_EXCP_INVAL_INVAL, GETPC());
    195    } else {
    196        int ret;
    197        qemu_mutex_lock_iothread();
    198        ret = ppc_dcr_write(env->dcr_env, (uint32_t)dcrn, (uint32_t)val);
    199        qemu_mutex_unlock_iothread();
    200        if (unlikely(ret != 0)) {
    201            qemu_log_mask(LOG_GUEST_ERROR, "DCR write error %d %03x\n",
    202                          (uint32_t)dcrn, (uint32_t)dcrn);
    203            raise_exception_err_ra(env, POWERPC_EXCP_PROGRAM,
    204                                   POWERPC_EXCP_INVAL |
    205                                   POWERPC_EXCP_PRIV_REG, GETPC());
    206        }
    207    }
    208}