|  | /* | 
|  | * RISC-V Zcmt Extension Helper for QEMU. | 
|  | * | 
|  | * Copyright (c) 2021-2022 PLCT Lab | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms and conditions of the GNU General Public License, | 
|  | * version 2 or later, as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope it will be useful, but WITHOUT | 
|  | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | * more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License along with | 
|  | * this program.  If not, see <http://www.gnu.org/licenses/>. | 
|  | */ | 
|  |  | 
|  | #include "qemu/osdep.h" | 
|  | #include "cpu.h" | 
|  | #include "exec/exec-all.h" | 
|  | #include "exec/helper-proto.h" | 
|  | #include "exec/cpu_ldst.h" | 
|  |  | 
|  | target_ulong HELPER(cm_jalt)(CPURISCVState *env, uint32_t index) | 
|  | { | 
|  |  | 
|  | #if !defined(CONFIG_USER_ONLY) | 
|  | RISCVException ret = smstateen_acc_ok(env, 0, SMSTATEEN0_JVT); | 
|  | if (ret != RISCV_EXCP_NONE) { | 
|  | riscv_raise_exception(env, ret, 0); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | target_ulong target; | 
|  | target_ulong val = env->jvt; | 
|  | int xlen = riscv_cpu_xlen(env); | 
|  | uint8_t mode = get_field(val, JVT_MODE); | 
|  | target_ulong base = val & JVT_BASE; | 
|  | target_ulong t0; | 
|  |  | 
|  | if (mode != 0) { | 
|  | riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, 0); | 
|  | } | 
|  |  | 
|  | if (xlen == 32) { | 
|  | t0 = base + (index << 2); | 
|  | target = cpu_ldl_code(env, t0); | 
|  | } else { | 
|  | t0 = base + (index << 3); | 
|  | target = cpu_ldq_code(env, t0); | 
|  | } | 
|  |  | 
|  | return target & ~0x1; | 
|  | } |