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>;