Commit Graph

4783 Commits

Author SHA1 Message Date
Gerwin Klein f46f9bd74e machine: make Kernel_Config available earlier
Definitions in Platform.thy may depend on kernel config options, so
we need Kernel_Config_Lemmas there already, and need to replace the
dependency in Machine_Types to avoid a dependency circle.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski 1378d1a200 aarch64 design: remove stale FIXMEs
These files have been reviewed, but the FIXMEs stuck around.

Update copyright on files we modified, and leave as is for only
copy+sed.

Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein ab76f0a250 aarch64 haskell: prefer "maybe" over "case"
More clear and concise.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 7d4b58f618 aarch64 aspec: style update
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski 37e2a34f28 aarch64 aspec: update handle_vm_fault
Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski 155d9057dc aarch64 haskell: update handleVMFault address masking
Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 1f128472a7 aarch64 haskell: decide on vmid/hw_asid naming
The C code PR still uses the old naming scheme (hw_asid), but even if
it stays that way so it can share code with paths that use a "generic"
hw_asid name, it is better for the specs to use the correct name.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein f7c4fee641 aarch64 haskell: mark SMMU TODOs for later
Rename FIXME AARCH64 into TODO AARCH64 for all SMMU tasks

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 66e67fdd77 aarch64 haskell+aspec: finalise_cap for VSpace
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 61e5a84670 aarch64 aspec+haskell: config dependent vm_level
Using value_type, we can capture both config options.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 47c0ec4bdc aarch64 aspec: validate remaining ASpec theories
These are ArchCSpace_A, ArchIpcCancel_A, ArchRetype_A, ArchTcb_A.
Already in good shape, just some style copyright headers, etc.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 7a914e897a aarch64 aspec: set up Init_A
Minor style update; set up global user page table and example kernel
vspace uses that should satisfy invariants.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein b8efa38453 aarch64 aspec: validate + style ArchInterrupt_A
Also sync handle_reserved_irq phrasing with Haskell and C (sequential
comparison instead of cascaded. Comes out to the same, but no need to
prove that here).

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein a9b5a5acc0 aarch64 aspec: validate ArchFault_A + Hypervisor_A
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 17e7ab1d42 aarch64 haskell: remove outdated comment
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 6d8134ef7a aarch64 haskell: sync flush decode with aspec
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein ac7491610b aarch64 aspec+machine: validate ArchDecode
This includes new vspace decode and page flush invocations, as well
as machine constants that are used in those paths.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 8275426a62 aarch64 haskell+design: ObjectType order
The actual order for the ObjectType enum is defined in design. This one
has to correspond to the C enum. Mirroring it here in Haskell for
consistency.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 5ee170d987 aarch64 haskell: fix name shadowing
The parameter pte was shadowed by the object load, resulting in
incorrect semantics.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 539e82858e aarch64 haskell: remove redundant check
The page table size can not be "vspace" here, because the invocation
is only for lower-level tables.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 27922da136 aarch64 haskell: sync invocation names with aspec
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 0c5c0fab57 aarch64 aspec: validate Arch+ArchInvocation
This includes adding flush invocations for page tables and vspace.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 9350978a4b aarch64 aspec: style for ArchVSpace_A
Now that VCPU is in, there is less risk of conflicts.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski 4ea3c0c307 aarch64 aspec: add VCPU/HYP infrastucture
Largely adapted from ARM_HYP, modified and checked against Haskell code.

Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski 15dc7d2959 aarch64 design: make vcpuBits available through MachineTypes
Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Rafal Kolanski f86a3944ba aarch64 aspec: prepare_thread_delete with FPU
Use simplified `fpuThreadDeleteOp` machine op abstraction to match
Haskell.

Signed-off-by: Rafal Kolanski <rafal.kolanski@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 9c3a02bd65 aarch64 aspec: validate ArchVSpace_A PT operations
VCPU and style still needs to be updated, but the virtual memory
operations in this file are validated.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein cf98dd20dc aarch64 aspec: review+style for ArchVSpaceAcc
This theory file should now be in a reasonably final state.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 1ce09ded7a aarch64 aspec: import handle_vm_fault from ARM
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 8c0eaa973f aarch64 aspec: asid_map and vmid operations
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 90f22d2b93 aarch64 machine+design: cache+barrier machine ops
This replaces the RISC-V operations; for now commented out in ASpec.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 03ea580a29 aarch64 aspec: add asid_pool_entry type
This only updates the rest of the spec to type check, it does not
yet use the vmid information stored in the new type.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 89815424cf aarch64 aspec/haskell: sync attribs_from_word
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 29518b9bb0 aarch64 aspec: validate pte type
The pte type is now in sync with Haskell and C.

Note that there is a trade-off in storing the entire paddr (base
address) in the pte. In RISC-V we don't store the bottom bits, so get
an invariant for free that these are always 0, but we need to do a
bunch of shifting and casting to convert addresses. The shifting there
aligns with the C code.

On AArch64, the address field instead uses field_high, which does the
shifting inside the bitfield generator and makes it invisible to the
rest of the C code. To model that there is no such shifting going on,
we choose to store the entire base address here (as in ARM/ARM_HYP).
This means we will need an invariant that they are all aligned to
pageBits.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 77dc7e0dc4 aarch64 aspec: use map union for ptes_of levels
Use a more principled way to define ptes_of/get_pte by defining
level_pte_of parametric in the level and setting ptes_of to the union
of all levels. This works because objects must be distinct.

For store_pte a simple union doesn't work, but we can still first
extract the level, and then use the level to update the object for that
level.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein b8236f1eb8 aarch64 haskell: validate Hardware definitions
No real content changes; remove unused armParityEnabled and rename
`isToplevel` to `isVSpace` for consistency with the rest.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 17542a5a94 aarch64 haskell: resolve FIXME
Nothing really to fix here, but keeping the comment for CRefine
reference.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 32b83566fa aarch64 haskell: validate ObjectType
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 70f8231775 aarch64 aspec: sync label name with C/Haskell
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein daca9fbcb4 aarch64 haskell: validate InvocationLabels
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein a50cf529aa aarch64 haskell: validate ARMPageTableInvocation
This includes decode, perform, and the functions called by them.
Removes the now unused RISCV sfence machine op.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein e3863af88b aarch64 haskell: performPageInvocation
Also removes the now unused function `checkSlot`.
With this, all of decode/perform ARMPageInvocation is validated.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 8d50dd2bb3 aarch64 haskell: decodeARMFrameInvocationMap
synced checks, order, and errors with C and factored out
`checkVSpaceRoot` which is used in a few other invocations. Some of the
`let`s here are not necessary, but inserted anyway to match up names
with the C code.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 02dbb29b9f aarch64 haskell/design: PTE encoding
Now that the C code is available, we can settle the PTE encoding for
the spec. Notable differences to RISCV64 are:

 - the base address uses field-high and doesn't need shifting
 - leads to simpler/more direct address access
 - PTEs use different attributes
 - uses a flag for 4k pages which have a different hardware encoding
 - page table PTEs have no rights/attributes

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 393ee8b687 aarch64 aspec: sync names with C/Haskell
VSpaceRootObj -> VSpaceObj and
acap_toplevel -> acap_is_vspace

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 5b77789f9d aarch64 haskell/design: sync names with C
The top-level object type is called `VSpaceObject` in C, so we use the
same name here. The top-level cap is `VSpaceCap` in C, but since we
want to keep it as a flag in the PT Cap in the specs, we call the flag
`capPTisVSpace` for consistency.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 325b8b0185 aarch64 design: complete ArchIntermediate_H
Adds creation of top-level tables.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 23ba18eba9 aarch64 aspec: VCPU+VSpaceRoot objs in Structures
This includes the type-checking fallout from those two main additions,
but no real further validation yet downstream from Structures.thy.

PageTable objects now have an inner object that contains either a
normal page table or a page table with the potentially different size
for top-level VSpace roots.

In ArchVSpaceAcc, the follow-on effects include making pte operations
figure out what kind of object is is by first checking for the
potentially smaller-sized object, and if that does not exist, trying
the larger-sized object (which has a different base address). When
pspace_distinct and pspace_aligned invariants hold, this should model
the behaviour of Haskell/C precisely.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein 6bac4e887a aarch64 aspec: validate Machine_A
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00
Gerwin Klein a371fdaae2 aarch64 design: enable ArmVSpaceRegionUse
Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2022-04-20 09:16:19 +10:00