Prune stale FLUTE support
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
deleted file mode 100644
index 9cd81d7..0000000
--- a/azure-pipelines.yml
+++ /dev/null
@@ -1,149 +0,0 @@
-trigger:
-- core
-
-resources:
- pipelines:
- - pipeline: LLVM
- project: CHERI-MCU
- source: LLVM
- - pipeline: Flute-TCM
- project: CHERI-MCU
- source: Flute-TCM
- - pipeline: sail-cheri-mcu
- project: CHERI-MCU
- source: sail-cheri-mcu
-
-jobs:
-############################################## Linux Builds
-- job:
- displayName: RTOS tests
- pool:
- vmImage: ubuntu-20.04
- timeoutInMinutes: 300
- strategy:
- matrix:
- HardwareRevokerRelease:
- board: flute
- flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n
- mode: release
- SoftwareRevokerRelease:
- board: flute-software-revoker
- flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n
- mode: release
- SailRelease:
- board: sail
- flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n
- mode: release
- HardwareRevokerDebug:
- board: flute
- flags: --debug-loader=y --debug-scheduler=y --debug-allocator=y
- mode: debug
- SoftwareRevokerDebug:
- board: flute-software-revoker
- flags: --debug-loader=y --debug-scheduler=y --debug-allocator=y
- mode: debug
- SailDebug:
- board: sail
- flags: --debug-loader=y --debug-scheduler=y --debug-allocator=y
- mode: debug
- steps:
- - checkout: self
- submodules: recursive
- - download: LLVM
- - download: Flute-TCM
- - download: sail-cheri-mcu
- - script: |
- set -eo pipefail
- sudo add-apt-repository ppa:xmake-io/xmake
- sudo apt update
- sudo apt install xmake
- displayName: 'Installing dependencies'
- - script: |
- chmod +x $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/bin/* \
- $(Pipeline.Workspace)/$(resources.triggeringAlias)/Flute-TCM/FluteSimulator/* \
- $(Pipeline.Workspace)/$(resources.triggeringAlias)/sail-cheri-mcu/SailSimulator/*
- echo $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM
- echo $(Pipeline.Workspace)
- ls -R $(Pipeline.Workspace)
- displayName: 'See where anything is installed'
- - script: |
- ls $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/bin/
- echo xmake f -P . --board=$(board) --sdk=$(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/ $(flags) -m $(mode)
- xmake f -P . --board=$(board) --sdk=$(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/ $(flags) -m $(mode)
- workingDirectory: 'tests'
- displayName: 'Configure the build'
- - script: |
- xmake -P . -v
- workingDirectory: 'tests'
- displayName: 'Building the test suite'
- - script: |
- $(Pipeline.Workspace)/$(resources.triggeringAlias)/sail-cheri-mcu/SailSimulator/cheriot_sim -p --no-trace build/cheriot/cheriot/$(mode)/test-suite
- condition: startsWith(variables['board'],'sail')
- workingDirectory: 'tests'
- displayName: 'Running the test suite on Sail'
- - script: |
- export PATH=$(Pipeline.Workspace)/$(resources.triggeringAlias)/Flute-TCM/FluteSimulator:$PATH
- for I in `seq 32768` ; do echo 00000000 >> tail.hex ; done
- elf_to_hex build/cheriot/cheriot/$(mode)/test-suite Mem.hex
- hex_to_tcm_hex.sh
- cp tail.hex Mem-TCM-tags-0.hex
- exe_HW_sim +tohost | tee sim.log
- EXIT_CODE=$(expr $(printf '%d' $(grep -E -e 'tohost_value is 0x[0-9a-zA-Z]+' -o sim.log | awk '{print $3}')) / 2)
- echo "Exit code: $EXIT_CODE"
- exit $EXIT_CODE
- condition: startsWith(variables['board'],'flute')
- workingDirectory: 'tests'
- displayName: 'Running the test suite on Flute'
- - script: |
- set -eo pipefail
- for example_dir in $PWD/examples/*/; do
- cd $example_dir
- echo Building $example_dir
- xmake f --board=$(board) --sdk=$(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/ $(flags) -m $(mode)
- xmake
- done
- displayName: 'Building the examples'
- - script: |
- set -eo pipefail
- for example_dir in $PWD/examples/*/; do
- cd $example_dir
- echo Running $example_dir
- example_name=$(basename ${example_dir#*.})
- $(Pipeline.Workspace)/$(resources.triggeringAlias)/sail-cheri-mcu/SailSimulator/cheriot_sim \
- build/cheriot/cheriot/$(mode)/${example_name}
- done
- condition: startsWith(variables['board'],'sail')
- displayName: 'Running the examples'
-
-- job:
- displayName: Check coding style
- pool:
- vmImage: ubuntu-20.04
- timeoutInMinutes: 300
- steps:
- - checkout: self
- submodules: recursive
- - download: LLVM
- - script: |
- chmod +x $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/bin/*
- echo $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM
- echo $(Pipeline.Workspace)
- ls -R $(Pipeline.Workspace)
- displayName: 'See where anything is installed'
- - script: |
- ./scripts/run_clang_tidy_format.sh $(Pipeline.Workspace)/$(resources.triggeringAlias)/LLVM/LLVM/bin/
- displayName: 'Running clang-tidy and clang-format'
-
-- job:
- displayName: Compliance checks
- pool:
- vmImage: windows-latest
- steps:
- - task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@2
- displayName: 'Run CredScan'
- inputs:
- debugMode: false
- - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@3
- displayName: 'Publish Security Analysis Logs'
diff --git a/docs/WritingADeviceDriver.md b/docs/WritingADeviceDriver.md
index 305a4df..e24ce92 100644
--- a/docs/WritingADeviceDriver.md
+++ b/docs/WritingADeviceDriver.md
@@ -194,11 +194,11 @@
### Platform includes
Each board description contains a set of include paths.
-For example, our Flute prototype platform has this:
+For example, our Ibex prototype platform has this:
```json
"driver_includes" : [
- "../include/platform/flute",
+ "../include/platform/ibex",
"../include/platform/generic-riscv"
],
```
diff --git a/scripts/run-flute.sh b/scripts/run-flute.sh
deleted file mode 100755
index 107c9e3..0000000
--- a/scripts/run-flute.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-if [ -z "${FLUTE_BUILD}" ] ; then
- echo The FLUTE_BUILD environment variable should be set to the flute build directory
- exit 0
-fi
-# This script depends on non-portable GNU extensions, so prefer the g-prefixed
-# versions if they exist
-TAIL=tail
-if which gtail ; then TAIL=gtail ; fi
-HEAD=head
-if which ghead ; then HEAD=ghead ; fi
-PASTE=paste
-if which gpaste ; then PASTE=gpaste ; fi
-echo Using ${TAIL}, ${HEAD}, and ${PASTE}
-
-if [ ! -f tail.hex ] ; then
- for I in $(seq 0 32768) ; do
- echo 00000000 >> tail.hex
- done
-fi
-
-${FLUTE_BUILD}/../../Tests/elf_to_hex/elf_to_hex $1 Mem.hex
-
-awk '{print substr($0,33,8); print substr($0,0,8)}' Mem.hex > 1u-0.hex
-awk '{print substr($0,41,8); print substr($0,9,8)}' Mem.hex > 0u-0.hex
-awk '{print substr($0,49,8); print substr($0,17,8)}' Mem.hex > 1l-0.hex
-awk '{print substr($0,57,8); print substr($0,25,8)}' Mem.hex > 0l-0.hex
-
-${TAIL} -n +3 1u-0.hex > 1u-1.hex
-${TAIL} -n +3 0u-0.hex > 0u-1.hex
-${TAIL} -n +3 1l-0.hex > 1l-1.hex
-${TAIL} -n +3 0l-0.hex > 0l-1.hex
-
-${HEAD} -n -4 1u-1.hex > 1u-2.hex
-${HEAD} -n -4 0u-1.hex > 0u-2.hex
-${HEAD} -n -4 1l-1.hex > 1l-2.hex
-${HEAD} -n -4 0l-1.hex > 0l-2.hex
-
-${PASTE} -d \\n 1l-2.hex 1u-2.hex > 1-0.hex
-${PASTE} -d \\n 0l-2.hex 0u-2.hex > 0-0.hex
-
-cat 1-0.hex tail.hex | ${HEAD} -n 32768 > Mem-TCM-1.hex
-cat 0-0.hex tail.hex | ${HEAD} -n 32768 > Mem-TCM-0.hex
-
-${FLUTE_BUILD}/exe_HW_sim +tohost > /dev/null
diff --git a/sdk/boards/flute-debug-uart.json b/sdk/boards/flute-debug-uart.json
deleted file mode 100644
index b0dd865..0000000
--- a/sdk/boards/flute-debug-uart.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "devices" :
- {
- "clint" : {
- "start" : 0x2000000,
- "length" : 0x10000
- },
- "plic" : {
- "start" : 0xc000000,
- "length" : 0x400000
- },
- "uart" : {
- "start" : 0x10000100,
- "end" : 0x10000200
- },
- "ethernet" : {
- "start" : 0x10000100,
- "end" : 0x10000200
- },
- "shadow" : {
- "start" : 0x40000000,
- "end" : 0x40001000
- },
- "shadowctrl" : {
- "start" : 0x40001000,
- "end" : 0x40001028
- }
- },
- "instruction_memory" : {
- "start" : 0x80000000,
- "end" : 0x80040000
- },
- "heap" : {
- "end" : 0x80040000
- },
- "revoker" : "hardware",
- "stack_high_water_mark" : true,
- "driver_includes" : [
- "../include/platform/flute",
- "../include/platform/generic-riscv"
- ],
- "defines" : [
- "FLUTE",
- "FLUTE_SHADOW_BASE=0x40000000U",
- "FLUTE_SHADOW_SIZE=0x1000U"
- ],
- "timer_hz" : 40000,
- "tickrate_hz" : 10,
- "simulator" : "${sdk}/../scripts/run-flute.sh",
- "simulation" : true
-}
-
diff --git a/sdk/boards/flute-no-revoker.json b/sdk/boards/flute-no-revoker.json
deleted file mode 100644
index aca256b..0000000
--- a/sdk/boards/flute-no-revoker.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "devices" :
- {
- "clint" : {
- "start" : 0x2000000,
- "length" : 0x10000
- },
- "plic" : {
- "start" : 0xc000000,
- "length" : 0x400000
- },
- "uart" : {
- "start" : 0x10000100,
- "end" : 0x10000200
- },
- "shadow" : {
- "start" : 0x40000000,
- "end" : 0x40001000
- }
- },
- "instruction_memory" : {
- "start" : 0x80000000,
- "end" : 0x80040000
- },
- "heap" : {
- "end" : 0x80040000
- },
- "defines" : [
- "FLUTE",
- "FLUTE_SHADOW_BASE=0x40000000U",
- "FLUTE_SHADOW_SIZE=0x1000U"
- ],
- "stack_high_water_mark" : false,
- "driver_includes" : [
- "../include/platform/flute",
- "../include/platform/generic-riscv"
- ],
- "timer_hz" : 40000,
- "tickrate_hz" : 10,
- "simulator" : "${sdk}/../scripts/run-flute.sh",
- "simulation" : true
-}
-
diff --git a/sdk/boards/flute-software-revoker.json b/sdk/boards/flute-software-revoker.json
deleted file mode 100644
index 0968fd2..0000000
--- a/sdk/boards/flute-software-revoker.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "devices" :
- {
- "clint" : {
- "start" : 0x2000000,
- "length" : 0x10000
- },
- "plic" : {
- "start" : 0xc000000,
- "length" : 0x400000
- },
- "uart" : {
- "start" : 0x10000100,
- "end" : 0x10000200
- },
- "shadow" : {
- "start" : 0x40000000,
- "end" : 0x40001000
- }
- },
- "instruction_memory" : {
- "start" : 0x80000000,
- "end" : 0x80040000
- },
- "heap" : {
- "end" : 0x80040000
- },
- "stack_high_water_mark" : false,
- "driver_includes" : [
- "../include/platform/flute",
- "../include/platform/generic-riscv"
- ],
- "defines" : [
- "FLUTE",
- "FLUTE_SHADOW_BASE=0x40000000U",
- "FLUTE_SHADOW_SIZE=0x1000U"
- ],
- "timer_hz" : 40000,
- "tickrate_hz" : 10,
- "revoker" : "software",
- "simulator" : "${sdk}/../scripts/run-flute.sh",
- "simulation" : true
-}
-
diff --git a/sdk/boards/flute.json b/sdk/boards/flute.json
deleted file mode 100644
index 42586f5..0000000
--- a/sdk/boards/flute.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "devices" :
- {
- "clint" : {
- "start" : 0x2000000,
- "length" : 0x10000
- },
- "plic" : {
- "start" : 0xc000000,
- "length" : 0x400000
- },
- "uart" : {
- "start" : 0x10000000,
- "end" : 0x10000100
- },
- "ethernet" : {
- "start" : 0x10000100,
- "end" : 0x10000200
- },
- "shadow" : {
- "start" : 0x40000000,
- "end" : 0x40001000
- },
- "shadowctrl" : {
- "start" : 0x40001000,
- "end" : 0x40001028
- }
- },
- "instruction_memory" : {
- "start" : 0x80000000,
- "end" : 0x80040000
- },
- "heap" : {
- "end" : 0x80040000
- },
- "driver_includes" : [
- "../include/platform/flute",
- "../include/platform/generic-riscv"
- ],
- "defines" : [
- "FLUTE",
- "FLUTE_SHADOW_BASE=0x40000000U",
- "FLUTE_SHADOW_SIZE=0x1000U"
- ],
- "timer_hz" : 40000,
- "tickrate_hz" : 10,
- "revoker" : "hardware",
- "simulator" : "${sdk}/../scripts/run-flute.sh",
- "simulation" : true
-}
-
diff --git a/sdk/core/loader/boot.S b/sdk/core/loader/boot.S
index ae915cb..953db9e 100644
--- a/sdk/core/loader/boot.S
+++ b/sdk/core/loader/boot.S
@@ -65,7 +65,7 @@
la_abs s0, loader_entry_point
csetaddr cra, cra, s0
// Base and size of the GP of loader
- // Flute doesn't support unaligned loads, so we have to load the base as
+ // Old sails don't support unaligned loads, so we have to load the base as
// bytes
clbu s0, IMAGE_HEADER_LOADER_DATA_START_OFFSET+3(ca1)
sll s0, s0, 8
@@ -157,14 +157,7 @@
ecall
// The idle thread sleeps and only waits for interrupts.
.Lidle_loop:
- // There is a bug in the Flute hardware revoker that means it stops during
- // wfi, but we want it to run here. Flute is simulation only at the
- // moment, so we don't care that the nop is power-inefficient.
-#if defined(TEMPORAL_SAFETY) && defined(FLUTE) && !defined(SOFTWARE_REVOKER)
- nop
-#else
wfi
-#endif
j .Lidle_loop
.Lfill_block:
diff --git a/sdk/core/scheduler/plic.h b/sdk/core/scheduler/plic.h
index 99874d5..246b905 100644
--- a/sdk/core/scheduler/plic.h
+++ b/sdk/core/scheduler/plic.h
@@ -38,7 +38,7 @@
/*
* FIXME: Sail doesn't have an interrupt controller at all, but we pretend
- * it does just like FLUTE build to let things compile. We need tons of
+ * it does just like other builds to let things compile. We need tons of
* #ifdefs or a big rewrite to make the entire external interrupt path
* optional.
*
diff --git a/sdk/include/cheri.hh b/sdk/include/cheri.hh
index 0307cf7..f4d27aa 100644
--- a/sdk/include/cheri.hh
+++ b/sdk/include/cheri.hh
@@ -1065,20 +1065,7 @@
*/
Capability<T> &unseal(void *key)
{
-#ifdef FLUTE
- // Flute still throws exceptions on invalid use. As a temporary
- // work-around, add a quick check that this thing has the sealing
- // type and don't unseal if it hasn't. This isn't a complete test,
- // it's just sufficient to get the tests passing on Flute.
- if (type() != __builtin_cheri_address_get(key))
- {
- ptr = nullptr;
- }
- else
-#endif
- {
- ptr = static_cast<T *>(__builtin_cheri_unseal(ptr, key));
- }
+ ptr = static_cast<T *>(__builtin_cheri_unseal(ptr, key));
return *this;
}
diff --git a/sdk/include/platform/flute/platform-early_boot.inc b/sdk/include/platform/flute/platform-early_boot.inc
deleted file mode 100644
index f8532a5..0000000
--- a/sdk/include/platform/flute/platform-early_boot.inc
+++ /dev/null
@@ -1,12 +0,0 @@
- // Ugly hack. For some reason if I don't give this first load, subsequent mem
- // ops will trap on Flute-TCM.
- li a3, 0x80000000
- cspecialr ca4, mtdc
- csetaddr ca4, ca4, a3
- clc c0, 0(ca4)
- // The shadow memory may not be zeroed, ensure it is before we start or
- // random capability loads will fail.
- li a0, FLUTE_SHADOW_BASE
- csetaddr ca0, ca4, a0
- li a1, FLUTE_SHADOW_BASE + FLUTE_SHADOW_SIZE
- cjal .Lfill_block
diff --git a/sdk/include/platform/flute/platform-hardware_revoker.hh b/sdk/include/platform/flute/platform-hardware_revoker.hh
deleted file mode 100644
index 759db15..0000000
--- a/sdk/include/platform/flute/platform-hardware_revoker.hh
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright Microsoft and CHERIoT Contributors.
-// SPDX-License-Identifier: MIT
-
-#pragma once
-
-#include <cdefs.h>
-#include <compartment-macros.h>
-#include <riscvreg.h>
-#include <stddef.h>
-#include <stdint.h>
-
-namespace Flute
-{
- template<typename WordT, size_t TCMBaseAddr>
- class HardwareRevoker
- {
- private:
- // layout of the shadow space control registers
- struct ShadowCtrl
- {
- uint32_t base;
- uint32_t pad0;
- uint32_t top;
- uint32_t pad1;
- uint32_t epoch;
- uint32_t pad2;
- uint32_t go;
- uint32_t pad4;
- };
- static_assert(offsetof(ShadowCtrl, epoch) == 16);
- static_assert(offsetof(ShadowCtrl, go) == 24);
-
- volatile ShadowCtrl *shadowCtrl;
-
- public:
- /**
- * Currently the only hardware revoker implementation is async which
- * sweeps memory in the background.
- */
- static constexpr bool IsAsynchronous = true;
-
- /**
- * Initialise a revoker instance.
- */
- void init()
- {
- /**
- * These two symbols mark the region that needs revocation. We
- * revoke capabilities everywhere from the start of compartment
- * globals to the end of the heap.
- */
- extern char __compart_cgps, __export_mem_heap_end;
-
- auto base = LA_ABS(__compart_cgps);
- auto top = LA_ABS(__export_mem_heap_end);
- shadowCtrl = MMIO_CAPABILITY(ShadowCtrl, shadowctrl);
- shadowCtrl->base = base;
- shadowCtrl->top = top;
- // Clang tidy is checking headers as stand-alone compilation units
- // and so doesn't know what Debug is defined to.
-#ifndef CLANG_TIDY
- Debug::Invariant(base < top,
- "Memory map has unexpected layout, base {} is "
- "expected to be below top {}",
- base,
- top);
-#endif
- }
-
- /**
- * Returns the revocation epoch. This is the number of revocations
- * that have started.
- */
- uint32_t system_epoch_get()
- {
- asm volatile("" ::: "memory");
- return shadowCtrl->epoch;
- }
-
- /**
- * Queries whether the specified revocation epoch has finished.
- */
- template<bool AllowPartial = false>
- uint32_t has_revocation_finished_for_epoch(uint32_t epoch)
- {
- asm volatile("" ::: "memory");
- if (AllowPartial)
- {
- return shadowCtrl->epoch > epoch;
- }
- return shadowCtrl->epoch - epoch >= (2 + (epoch & 1));
- }
-
- // Start a revocation.
- void system_bg_revoker_kick()
- {
- asm volatile("" ::: "memory");
- shadowCtrl->go = 1;
- asm volatile("" ::: "memory");
- }
- };
-} // namespace Flute
-
-template<typename WordT, size_t TCMBaseAddr>
-using HardwareRevoker = Flute::HardwareRevoker<WordT, TCMBaseAddr>;