From 34aeefe35094442f8832842d704b09226c8a30f8 Mon Sep 17 00:00:00 2001 From: Daniel Jobson Date: Thu, 7 Nov 2024 13:10:10 +0100 Subject: [PATCH] Add API for syscall MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a register to store an address to a syscall function defined in firmware. Set the reset value to an illegal address, to make sure a call to an unset address will halt the CPU. Co-authored-by: Mikael Ă…gren --- hw/application_fpga/core/tk1/rtl/tk1.v | 24 ++++++++++++++++++++++++ hw/application_fpga/fw/tk1_mem.h | 1 + 2 files changed, 25 insertions(+) diff --git a/hw/application_fpga/core/tk1/rtl/tk1.v b/hw/application_fpga/core/tk1/rtl/tk1.v index 4f481b5..80cfc17 100644 --- a/hw/application_fpga/core/tk1/rtl/tk1.v +++ b/hw/application_fpga/core/tk1/rtl/tk1.v @@ -78,6 +78,7 @@ module tk1 ( localparam ADDR_APP_SIZE = 8'h0d; localparam ADDR_BLAKE2S = 8'h10; + localparam ADDR_SYSCALL = 8'h12; localparam ADDR_CDI_FIRST = 8'h20; localparam ADDR_CDI_LAST = 8'h27; @@ -106,6 +107,10 @@ module tk1 ( localparam FW_RAM_LAST = 32'hd00007ff; + // ILLEGAL_ADDR is outside of the physical memory, and will trap in + // the security monitor if accessed. + localparam ILLEGAL_ADDR = 32'h4f000000; + //---------------------------------------------------------------- // Registers including update variables and write enable. //---------------------------------------------------------------- @@ -134,6 +139,9 @@ module tk1 ( reg [31 : 0] blake2s_addr_reg; reg blake2s_addr_we; + reg [31 : 0] syscall_addr_reg; + reg syscall_addr_we; + reg [23 : 0] cpu_trap_ctr_reg; reg [23 : 0] cpu_trap_ctr_new; reg [ 2 : 0] cpu_trap_led_reg; @@ -257,6 +265,7 @@ module tk1 ( app_start_reg <= 32'h0; app_size_reg <= 32'h0; blake2s_addr_reg <= 32'h0; + syscall_addr_reg <= ILLEGAL_ADDR; cdi_mem[0] <= 32'h0; cdi_mem[1] <= 32'h0; cdi_mem[2] <= 32'h0; @@ -315,6 +324,10 @@ module tk1 ( blake2s_addr_reg <= write_data; end + if (syscall_addr_we) begin + syscall_addr_reg <= write_data; + end + if (cdi_mem_we) begin cdi_mem[address[2 : 0]] <= write_data; end @@ -421,6 +434,7 @@ module tk1 ( app_start_we = 1'h0; app_size_we = 1'h0; blake2s_addr_we = 1'h0; + syscall_addr_we = 1'h0; cdi_mem_we = 1'h0; ram_addr_rand_we = 1'h0; ram_data_rand_we = 1'h0; @@ -476,6 +490,12 @@ module tk1 ( end end + if (address == ADDR_SYSCALL) begin + if (!system_mode_reg) begin + syscall_addr_we = 1'h1; + end + end + if ((address >= ADDR_CDI_FIRST) && (address <= ADDR_CDI_LAST)) begin if (!system_mode_reg) begin cdi_mem_we = 1'h1; @@ -560,6 +580,10 @@ module tk1 ( tmp_read_data = blake2s_addr_reg; end + if (address == ADDR_SYSCALL) begin + tmp_read_data = syscall_addr_reg; + end + if ((address >= ADDR_CDI_FIRST) && (address <= ADDR_CDI_LAST)) begin tmp_read_data = cdi_mem[address[2 : 0]]; end diff --git a/hw/application_fpga/fw/tk1_mem.h b/hw/application_fpga/fw/tk1_mem.h index 565d818..f88fae2 100644 --- a/hw/application_fpga/fw/tk1_mem.h +++ b/hw/application_fpga/fw/tk1_mem.h @@ -128,6 +128,7 @@ #define TK1_MMIO_TK1_APP_SIZE 0xff000034 #define TK1_MMIO_TK1_BLAKE2S 0xff000040 +#define TK1_MMIO_TK1_SYSCALL 0xff000048 #define TK1_MMIO_TK1_CDI_FIRST 0xff000080 #define TK1_MMIO_TK1_CDI_LAST 0xff00009c