Skip to content

Commit

Permalink
fetch extension for zicfilp
Browse files Browse the repository at this point in the history
  • Loading branch information
ved-rivos committed Nov 20, 2023
1 parent 832b6fa commit c85f8cb
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 3 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ SAIL_ARCH_SRCS += riscv_types_kext.sail # Shared/common code for the cryptogr

SAIL_STEP_SRCS = riscv_step_common.sail riscv_step_ext.sail riscv_decode_ext.sail riscv_fetch.sail riscv_step.sail
RVFI_STEP_SRCS = riscv_step_common.sail riscv_step_rvfi.sail riscv_decode_ext.sail riscv_fetch_rvfi.sail riscv_step.sail
SAIL_STEP_SRCS += riscv_step_zicfilp.sail
RVFI_STEP_SRCS += riscv_step_zicfilp.sail

# Control inclusion of 64-bit only riscv_analysis
ifeq ($(ARCH),RV32)
Expand Down
5 changes: 4 additions & 1 deletion model/riscv_ext_regs.sail
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,12 @@ This function is called after above when running rvfi and allows the model
to be initialised differently (e.g. CHERI cap regs are initialised
to omnipotent instead of null).
*/
val init_zicfilp_regs : unit -> unit
val ext_rvfi_init : unit -> unit
function ext_rvfi_init () = {
x1 = x1 // to avoid hook being optimized out
x1 = x1; // to avoid hook being optimized out
/* Zicfilp register state */
init_zicfilp_regs();
}


Expand Down
7 changes: 6 additions & 1 deletion model/riscv_step_ext.sail
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,14 @@

/* The default implementation of hooks for the step() and main() functions. */

/* Zicfilp extension to fetch */
val zicfilp_check_if_lpad : (FetchResult) -> FetchResult

function ext_init() -> unit = ()

function ext_fetch_hook(f : FetchResult) -> FetchResult = f
function ext_fetch_hook(f : FetchResult) -> FetchResult = {
zicfilp_check_if_lpad(f)
}

function ext_pre_step_hook() -> unit = ()
function ext_post_step_hook() -> unit = ()
7 changes: 6 additions & 1 deletion model/riscv_step_rvfi.sail
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,14 @@
/* SUCH DAMAGE. */
/*=======================================================================================*/

/* Zicfilp extension to fetch */
val zicfilp_check_if_lpad : (FetchResult) -> FetchResult

/* Step hooks for rvfi. */

function ext_fetch_hook(f : FetchResult) -> FetchResult = f
function ext_fetch_hook(f : FetchResult) -> FetchResult = {
zicfilp_check_if_lpad(f)
}

function ext_pre_step_hook() -> unit = ()

Expand Down
117 changes: 117 additions & 0 deletions model/riscv_step_zicfilp.sail
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*=======================================================================================*/
/* RISCV Sail Model */
/* */
/* This Sail RISC-V architecture model, comprising all files and */
/* directories except for the snapshots of the Lem and Sail libraries */
/* in the prover_snapshots directory (which include copies of their */
/* licences), is subject to the BSD two-clause licence below. */
/* */
/* Copyright (c) 2017-2023 */
/* Ved Shanbhogue */
/* Prashanth Mundkur */
/* Rishiyur S. Nikhil and Bluespec, Inc. */
/* Jon French */
/* Brian Campbell */
/* Robert Norton-Wright */
/* Alasdair Armstrong */
/* Thomas Bauereiss */
/* Shaked Flur */
/* Christopher Pulte */
/* Peter Sewell */
/* Alexander Richardson */
/* Hesham Almatary */
/* Jessica Clarke */
/* Microsoft, for contributions by Robert Norton-Wright and Nathaniel Wesley Filardo */
/* Peter Rugg */
/* Aril Computer Corp., for contributions by Scott Johnson */
/* Philipp Tomsich */
/* VRULL GmbH, for contributions by its employees */
/* */
/* All rights reserved. */
/* */
/* This software was developed by the above within the Rigorous */
/* Engineering of Mainstream Systems (REMS) project, partly funded by */
/* EPSRC grant EP/K008528/1, at the Universities of Cambridge and */
/* Edinburgh. */
/* */
/* This software was developed by SRI International and the University of */
/* Cambridge Computer Laboratory (Department of Computer Science and */
/* Technology) under DARPA/AFRL contract FA8650-18-C-7809 ("CIFV"), and */
/* under DARPA contract HR0011-18-C-0016 ("ECATS") as part of the DARPA */
/* SSITH research programme. */
/* */
/* This project has received funding from the European Research Council */
/* (ERC) under the European Union’s Horizon 2020 research and innovation */
/* programme (grant agreement 789108, ELVER). */
/* */
/* */
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following conditions */
/* are met: */
/* 1. Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* 2. Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the */
/* distribution. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' */
/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR */
/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF */
/* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND */
/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */
/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF */
/* SUCH DAMAGE. */
/*=======================================================================================*/

/* ****************************************************************** */
/* This file specifies the fetch extension in the 'Zicfilp' extension.*/
/* ****************************************************************** */
/* Forward-edge CFI: Landing pads */
val zicfilp_xLPE : (unit) -> bool
function zicfilp_check_if_lpad(f : FetchResult) -> FetchResult = {
if not(zicfilp_xLPE())
then f
else {
/* landing pad is a AUIPC with rd=x0 */
/* When ELP is set to LP_EXPECTED, if the next instruction in
* the instruction stream is not 4-byte aligned, or is not LPAD, or
* if the landing pad label encoded in LPAD is not zero and does not
* match the expected landing pad label in bits 31:12 of the x7
* register, then a software-check exception (cause=18) with xtval
* set to "landing pad fault (code=2)" is raised else the ELP is
* updated to NO_LP_EXPECTED. The label check is performed in
* riscv_insts_zicfilp:zicfilp_lpad
*/
match f {
F_Base(f) => {
let inst : word = zero_extend(f);
let lpad_op : bits(7) = inst[6 .. 0];
let rd_reg : regidx = inst[11.. 7];
if elp != ElpState_to_bits(LP_EXPECTED)
then F_Base(f)
else if PC[1 .. 0] != 0b00
then F_Error(E_SW_Check_Fault(), zero_extend(sw_check_code_to_bits(LANDING_PAD_FAULT)))
else if ((lpad_op != 0b0010111) | (rd_reg != 0b00000))
then F_Error(E_SW_Check_Fault(), zero_extend(sw_check_code_to_bits(LANDING_PAD_FAULT)))
else F_Base(f)
},
F_RVC(f) => {
if (elp != ElpState_to_bits(LP_EXPECTED))
then F_RVC(f)
else F_Error(E_SW_Check_Fault(), zero_extend(sw_check_code_to_bits(LANDING_PAD_FAULT)))
},
F_Ext_Error(e) => {
f
},
F_Error(e, addr) => {
f
}
}
}
}
6 changes: 6 additions & 0 deletions model/riscv_zicfilp_regs.sail
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,9 @@ function ElpState_to_str (e : ElpState) -> string =
overload to_str = {ElpState_to_str}

register elp : elp_state

val init_zicfilp_regs : unit -> unit
function init_zicfilp_regs () = {
elp = ElpState_to_bits(NO_LP_EXPECTED);
}

0 comments on commit c85f8cb

Please sign in to comment.