From f9237709bfc53702b855577c5b34d7e2464c5b20 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 19 Feb 2021 22:20:11 +0800 Subject: [PATCH 01/71] pgtable case study code draft --- linux/casestudies/pgtable.c | 240 ++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 linux/casestudies/pgtable.c diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c new file mode 100644 index 00000000..d899f767 --- /dev/null +++ b/linux/casestudies/pgtable.c @@ -0,0 +1,240 @@ +#include +#include +#include + +typedef uint64_t u64; +typedef uint32_t u32; + +/* ??? */ + +#define PAGE_SHIFT 12 +#define WRITE_ONCE(a, b) ((a) = (b)) +#define BITS_PER_LONG (sizeof(long) * 8) +#define EINVAL 22 /* Invalid argument */ + +/* linux/bits.h */ + +#define BIT(N) (1UL << (N)) +/* + * Create a contiguous bitmask starting at bit position @l and ending at + * position @h. For example + * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. + */ +#define GENMASK(h, l) \ + (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + +/* linux/bitfield.h */ + +/** + * https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html + * + * This built-in function returns one plus the index of the least significant 1-bit of x, + * or if x is zero, returns zero. + * + * TODO: find an implementation or give it a spec? + */ +int __builtin_ffsll (long long x); + +#define __bf_shf(x) (__builtin_ffsll(x) - 1) + +/** + * FIELD_GET() - extract a bitfield element + * @_mask: shifted mask defining the field's length and position + * @_reg: value of entire bitfield + * + * FIELD_GET() extracts the field specified by @_mask from the + * bitfield passed in as @_reg by masking and shifting it down. + */ +/* +#define FIELD_GET(_mask, _reg) \ + ({ \ + __BF_FIELD_CHECK(_mask, _reg, 0U, "FIELD_GET: "); \ + (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ + }) +*/ +// TODO: `typeof` is a compiler extension. +// simple version without `typeof`: +#define FIELD_GET(_mask, _reg) \ + (((_reg) & (_mask)) >> __bf_shf(_mask)) + +/** + * FIELD_PREP() - prepare a bitfield element + * @_mask: shifted mask defining the field's length and position + * @_val: value to put in the field + * + * FIELD_PREP() masks and shifts up the value. The result should + * be combined with other fields of the bitfield using logical OR. + */ +/* +#define FIELD_PREP(_mask, _val) \ + ({ \ + __BF_FIELD_CHECK(_mask, 0ULL, _val, "FIELD_PREP: "); \ + ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \ + }) +*/ +// TODO: `typeof` is a compiler extension. +// simple version without `typeof`: +#define FIELD_PREP(_mask, _val) \ + (((_val) << __bf_shf(_mask)) & (_mask)) + +/* asm/kvm_pgtable.h */ + +typedef u64 kvm_pte_t; +typedef u64 phys_addr_t; + +/** + * enum kvm_pgtable_prot - Page-table permissions and attributes. + * @KVM_PGTABLE_PROT_X: Execute permission. + * @KVM_PGTABLE_PROT_W: Write permission. + * @KVM_PGTABLE_PROT_R: Read permission. + * @KVM_PGTABLE_PROT_DEVICE: Device attributes. + */ +enum kvm_pgtable_prot { + KVM_PGTABLE_PROT_X = BIT(0), + KVM_PGTABLE_PROT_W = BIT(1), + KVM_PGTABLE_PROT_R = BIT(2), + KVM_PGTABLE_PROT_DEVICE = BIT(3), +}; + +/** + * struct kvm_pgtable_mm_ops - Memory management callbacks. + * @zalloc_page: Allocate a zeroed memory page. + * @zalloc_pages_exact: Allocate an exact number of zeroed memory pages. + * @free_pages_exact: Free an exact number of memory pages. + * @get_page: Increment the refcount on a page. + * @put_page: Decrement the refcount on a page. + * @page_count: Returns the refcount of a page. + * @phys_to_virt: Convert a physical address into a virtual address. + * @virt_to_phys: Convert a virtual address into a physical address. + */ +struct kvm_pgtable_mm_ops { + void* (*zalloc_page)(void *arg); + void* (*zalloc_pages_exact)(size_t size); + void (*free_pages_exact)(void *addr, size_t size); + void (*get_page)(void *addr); + void (*put_page)(void *addr); + int (*page_count)(void *addr); + void* (*phys_to_virt)(phys_addr_t phys); + phys_addr_t (*virt_to_phys)(void *addr); +}; + +/* asm/memory.h */ + +#define MT_NORMAL 0 +#define MT_DEVICE_nGnRE 5 + +// pgtable.c + +#define KVM_PGTABLE_MAX_LEVELS 4U +#define KVM_PTE_VALID BIT(0) +#define KVM_PTE_TYPE BIT(1) +#define KVM_PTE_TYPE_BLOCK 0 +#define KVM_PTE_TYPE_PAGE 1 +#define KVM_PTE_TYPE_TABLE 1 +#define KVM_PTE_ADDR_MASK GENMASK(47, PAGE_SHIFT) +#define KVM_PTE_ADDR_51_48 GENMASK(15, 12) +#define KVM_PTE_LEAF_ATTR_LO GENMASK(11, 2) +#define KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX GENMASK(4, 2) +#define KVM_PTE_LEAF_ATTR_LO_S1_AP GENMASK(7, 6) +#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RO 3 +#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RW 1 +#define KVM_PTE_LEAF_ATTR_LO_S1_SH GENMASK(9, 8) +#define KVM_PTE_LEAF_ATTR_LO_S1_SH_IS 3 +#define KVM_PTE_LEAF_ATTR_LO_S1_AF BIT(10) +// #define KVM_PTE_LEAF_ATTR_LO_S2_MEMATTR GENMASK(5, 2) +// #define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R BIT(6) +// #define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W BIT(7) +// #define KVM_PTE_LEAF_ATTR_LO_S2_SH GENMASK(9, 8) +// #define KVM_PTE_LEAF_ATTR_LO_S2_SH_IS 3 +// #define KVM_PTE_LEAF_ATTR_LO_S2_AF BIT(10) +#define KVM_PTE_LEAF_ATTR_HI GENMASK(63, 51) +#define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) +// #define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) + +static bool kvm_pte_valid(kvm_pte_t pte) +{ + return pte & KVM_PTE_VALID; +} + +static bool kvm_pte_table(kvm_pte_t pte, u32 level) +{ + if (level == KVM_PGTABLE_MAX_LEVELS - 1) + return false; + if (!kvm_pte_valid(pte)) + return false; + return FIELD_GET(KVM_PTE_TYPE, pte) == KVM_PTE_TYPE_TABLE; +} + +static void kvm_set_invalid_pte(kvm_pte_t *ptep) +{ + kvm_pte_t pte = *ptep; + WRITE_ONCE(*ptep, pte & ~KVM_PTE_VALID); +} + +static kvm_pte_t kvm_phys_to_pte(u64 pa) +{ + kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; + + if (PAGE_SHIFT == 16) + pte |= FIELD_PREP(KVM_PTE_ADDR_51_48, pa >> 48); + + return pte; +} + +static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, + struct kvm_pgtable_mm_ops *mm_ops) +{ + kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp)); + pte |= FIELD_PREP(KVM_PTE_TYPE, KVM_PTE_TYPE_TABLE); + pte |= KVM_PTE_VALID; + // WARN_ON(kvm_pte_valid(old)); + // smp_store_release(ptep, pte); +} + +static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, + u32 level) +{ + kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(pa); + u64 type = (level == KVM_PGTABLE_MAX_LEVELS - 1) ? KVM_PTE_TYPE_PAGE : + KVM_PTE_TYPE_BLOCK; + pte |= attr & (KVM_PTE_LEAF_ATTR_LO | KVM_PTE_LEAF_ATTR_HI); + pte |= FIELD_PREP(KVM_PTE_TYPE, type); + pte |= KVM_PTE_VALID; + /* Tolerate KVM recreating the exact same mapping. */ + if (kvm_pte_valid(old)) + return old == pte; + // smp_store_release(ptep, pte); + return true; +} + +struct hyp_map_data { + u64 phys; + kvm_pte_t attr; + struct kvm_pgtable_mm_ops *mm_ops; +}; + +static int hyp_map_set_prot_attr(enum kvm_pgtable_prot prot, + struct hyp_map_data *data) +{ + bool device = prot & KVM_PGTABLE_PROT_DEVICE; + u32 mtype = device ? MT_DEVICE_nGnRE : MT_NORMAL; + kvm_pte_t attr = FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX, mtype); + u32 sh = KVM_PTE_LEAF_ATTR_LO_S1_SH_IS; + u32 ap = (prot & KVM_PGTABLE_PROT_W) ? KVM_PTE_LEAF_ATTR_LO_S1_AP_RW : + KVM_PTE_LEAF_ATTR_LO_S1_AP_RO; + if (!(prot & KVM_PGTABLE_PROT_R)) + return -EINVAL; + if (prot & KVM_PGTABLE_PROT_X) { + if (prot & KVM_PGTABLE_PROT_W) + return -EINVAL; + if (device) + return -EINVAL; + } else { + attr |= KVM_PTE_LEAF_ATTR_HI_S1_XN; + } + attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_AP, ap); + attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_SH, sh); + attr |= KVM_PTE_LEAF_ATTR_LO_S1_AF; + data->attr = attr; + return 0; +} -- GitLab From b41c796a2fdb89e7d998549b8ee8fc6e0662b134 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 23 Feb 2021 15:56:37 +0800 Subject: [PATCH 02/71] draft --- linux/casestudies/pgtable.c | 40 +- linux/casestudies/proofs/pgtable/dune | 5 + .../proofs/pgtable/generated_code.v | 894 ++++++++++++++++++ .../generated_proof_hyp_map_set_prot_attr.v | 1 + .../pgtable/generated_proof_kvm_phys_to_pte.v | 1 + .../pgtable/generated_proof_kvm_pte_table.v | 1 + .../pgtable/generated_proof_kvm_pte_valid.v | 1 + .../generated_proof_kvm_set_invalid_pte.v | 1 + .../generated_proof_kvm_set_table_pte.v | 1 + .../generated_proof_kvm_set_valid_leaf_pte.v | 1 + .../proofs/pgtable/generated_spec.v | 42 + .../proofs/pgtable/pgtable_lemmas.v | 14 + linux/casestudies/proofs/pgtable/proof_files | 8 + 13 files changed, 1008 insertions(+), 2 deletions(-) create mode 100644 linux/casestudies/proofs/pgtable/dune create mode 100644 linux/casestudies/proofs/pgtable/generated_code.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v create mode 100644 linux/casestudies/proofs/pgtable/generated_spec.v create mode 100644 linux/casestudies/proofs/pgtable/pgtable_lemmas.v create mode 100644 linux/casestudies/proofs/pgtable/proof_files diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index d899f767..1b8cc107 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -1,3 +1,5 @@ +//@rc::import pgtable_lemmas from refinedc.linux.casestudies.pgtable + #include #include #include @@ -32,7 +34,13 @@ typedef uint32_t u32; * or if x is zero, returns zero. * * TODO: find an implementation or give it a spec? + * Coq lib func. */ +[[rc::parameters("x : Z")]] +[[rc::args("x @ int")]] +[[rc::exists("i : nat")]] +[[rc::returns("{1 + i} @ int")]] +[[rc::ensures("{i < 64}", "{Z.testbit x i = true}", "{∀ j, j < i -> Z.testbit x j = false}")]] int __builtin_ffsll (long long x); #define __bf_shf(x) (__builtin_ffsll(x) - 1) @@ -151,11 +159,28 @@ struct kvm_pgtable_mm_ops { #define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) // #define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) +// TODO: typing rule for `NotIntOp` is missing? +// [[rc::parameters("x : Z")]] +// [[rc::args("x @ int")]] +// [[rc::returns("{Z.lnot x} @ int")]] +// static int not_int(int x) +// { +// return ~x; +// } + +[[rc::parameters("pte : Z")]] +[[rc::args("pte @ int")]] +[[rc::returns("{valid pte} @ boolean")]] +[[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; } +[[rc::parameters("pte : Z", "level : nat")]] +[[rc::args("pte @ int", "level @ int")]] +[[rc::returns("{bool_decide (level <> 3) && valid pte && table pte} @ boolean")]] +[[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { if (level == KVM_PGTABLE_MAX_LEVELS - 1) @@ -165,17 +190,28 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) return FIELD_GET(KVM_PTE_TYPE, pte) == KVM_PTE_TYPE_TABLE; } +[[rc::parameters("pte_old : Z", "p : loc")]] +[[rc::args("p @ &own>")]] +[[rc::exists("pte_new : Z")]] +[[rc::ensures("own p : pte_new @ int", "{valid pte_new = false}")]] +[[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { kvm_pte_t pte = *ptep; WRITE_ONCE(*ptep, pte & ~KVM_PTE_VALID); } +[[rc::parameters("pa : Z")]] +[[rc::args("pa @ int")]] +[[rc::exists("pte : Z")]] +[[rc::returns("pte @ int")]] +[[rc::ensures("{pa_pte pa pte}")]] +[[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; - if (PAGE_SHIFT == 16) + if (PAGE_SHIFT == 16) // false if PAGE_SHIFT == 12 pte |= FIELD_PREP(KVM_PTE_ADDR_51_48, pa >> 48); return pte; @@ -187,7 +223,7 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp)); pte |= FIELD_PREP(KVM_PTE_TYPE, KVM_PTE_TYPE_TABLE); pte |= KVM_PTE_VALID; - // WARN_ON(kvm_pte_valid(old)); + // WARN_ON(kvm_pte_valid(old)); TODO: assert // smp_store_release(ptep, pte); } diff --git a/linux/casestudies/proofs/pgtable/dune b/linux/casestudies/proofs/pgtable/dune new file mode 100644 index 00000000..507277cd --- /dev/null +++ b/linux/casestudies/proofs/pgtable/dune @@ -0,0 +1,5 @@ +; Generated by [refinedc], do not edit. +(coq.theory + (flags -w -notation-overridden -w -redundant-canonical-projection) + (name refinedc.linux.casestudies.pgtable) + (theories refinedc.lang refinedc.lithium refinedc.typing refinedc.typing.automation)) diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v new file mode 100644 index 00000000..948866b8 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -0,0 +1,894 @@ +From refinedc.lang Require Export notation. +From refinedc.lang Require Import tactics. +From refinedc.typing Require Import annotations. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section code. + Definition file_0 : string := "linux/casestudies/pgtable.c". + Definition loc_2 : location_info := LocationInfo file_0 176 4 176 30. + Definition loc_3 : location_info := LocationInfo file_0 176 11 176 29. + Definition loc_4 : location_info := LocationInfo file_0 176 11 176 14. + Definition loc_5 : location_info := LocationInfo file_0 176 11 176 14. + Definition loc_6 : location_info := LocationInfo file_0 176 17 176 29. + Definition loc_7 : location_info := LocationInfo file_0 176 18 176 21. + Definition loc_8 : location_info := LocationInfo file_0 176 25 176 28. + Definition loc_11 : location_info := LocationInfo file_0 185 4 186 17. + Definition loc_12 : location_info := LocationInfo file_0 187 4 188 17. + Definition loc_13 : location_info := LocationInfo file_0 189 4 189 82. + Definition loc_14 : location_info := LocationInfo file_0 189 11 189 81. + Definition loc_15 : location_info := LocationInfo file_0 189 11 189 76. + Definition loc_16 : location_info := LocationInfo file_0 189 12 189 36. + Definition loc_17 : location_info := LocationInfo file_0 189 13 189 18. + Definition loc_18 : location_info := LocationInfo file_0 189 13 189 18. + Definition loc_19 : location_info := LocationInfo file_0 189 21 189 35. + Definition loc_20 : location_info := LocationInfo file_0 189 23 189 26. + Definition loc_21 : location_info := LocationInfo file_0 189 30 189 33. + Definition loc_22 : location_info := LocationInfo file_0 189 40 189 75. + Definition loc_23 : location_info := LocationInfo file_0 189 41 189 70. + Definition loc_24 : location_info := LocationInfo file_0 189 41 189 56. + Definition loc_25 : location_info := LocationInfo file_0 189 41 189 56. + Definition loc_26 : location_info := LocationInfo file_0 189 57 189 69. + Definition loc_27 : location_info := LocationInfo file_0 189 58 189 61. + Definition loc_28 : location_info := LocationInfo file_0 189 65 189 68. + Definition loc_29 : location_info := LocationInfo file_0 189 73 189 74. + Definition loc_30 : location_info := LocationInfo file_0 189 80 189 81. + Definition loc_31 : location_info := LocationInfo file_0 188 8 188 17. + Definition loc_32 : location_info := LocationInfo file_0 188 15 188 16. + Definition loc_34 : location_info := LocationInfo file_0 187 8 187 27. + Definition loc_36 : location_info := LocationInfo file_0 187 9 187 27. + Definition loc_37 : location_info := LocationInfo file_0 187 9 187 22. + Definition loc_38 : location_info := LocationInfo file_0 187 9 187 22. + Definition loc_39 : location_info := LocationInfo file_0 187 23 187 26. + Definition loc_40 : location_info := LocationInfo file_0 187 23 187 26. + Definition loc_41 : location_info := LocationInfo file_0 186 8 186 17. + Definition loc_42 : location_info := LocationInfo file_0 186 15 186 16. + Definition loc_44 : location_info := LocationInfo file_0 185 8 185 23. + Definition loc_45 : location_info := LocationInfo file_0 185 8 185 13. + Definition loc_46 : location_info := LocationInfo file_0 185 8 185 13. + Definition loc_47 : location_info := LocationInfo file_0 185 17 185 23. + Definition loc_48 : location_info := LocationInfo file_0 185 17 185 19. + Definition loc_49 : location_info := LocationInfo file_0 185 22 185 23. + Definition loc_52 : location_info := LocationInfo file_0 199 4 199 26. + Definition loc_53 : location_info := LocationInfo file_0 200 4 200 38. + Definition loc_54 : location_info := LocationInfo file_0 200 5 200 12. + Definition loc_55 : location_info := LocationInfo file_0 200 7 200 11. + Definition loc_56 : location_info := LocationInfo file_0 200 7 200 11. + Definition loc_57 : location_info := LocationInfo file_0 200 15 200 36. + Definition loc_58 : location_info := LocationInfo file_0 200 16 200 19. + Definition loc_59 : location_info := LocationInfo file_0 200 16 200 19. + Definition loc_60 : location_info := LocationInfo file_0 200 22 200 35. + Definition loc_61 : location_info := LocationInfo file_0 200 23 200 35. + Definition loc_62 : location_info := LocationInfo file_0 200 24 200 27. + Definition loc_63 : location_info := LocationInfo file_0 200 31 200 34. + Definition loc_64 : location_info := LocationInfo file_0 199 20 199 25. + Definition loc_65 : location_info := LocationInfo file_0 199 20 199 25. + Definition loc_66 : location_info := LocationInfo file_0 199 21 199 25. + Definition loc_67 : location_info := LocationInfo file_0 199 21 199 25. + Definition loc_72 : location_info := LocationInfo file_0 211 4 211 100. + Definition loc_73 : location_info := LocationInfo file_0 213 4 214 210. + Definition loc_74 : location_info := LocationInfo file_0 216 4 216 15. + Definition loc_75 : location_info := LocationInfo file_0 216 11 216 14. + Definition loc_76 : location_info := LocationInfo file_0 216 11 216 14. + Definition loc_77 : location_info := LocationInfo file_0 214 8 214 210. + Definition loc_78 : location_info := LocationInfo file_0 214 8 214 11. + Definition loc_79 : location_info := LocationInfo file_0 214 8 214 209. + Definition loc_80 : location_info := LocationInfo file_0 214 8 214 11. + Definition loc_81 : location_info := LocationInfo file_0 214 8 214 11. + Definition loc_82 : location_info := LocationInfo file_0 214 15 214 209. + Definition loc_83 : location_info := LocationInfo file_0 214 16 214 129. + Definition loc_84 : location_info := LocationInfo file_0 214 17 214 27. + Definition loc_85 : location_info := LocationInfo file_0 214 18 214 20. + Definition loc_86 : location_info := LocationInfo file_0 214 18 214 20. + Definition loc_87 : location_info := LocationInfo file_0 214 24 214 26. + Definition loc_88 : location_info := LocationInfo file_0 214 31 214 128. + Definition loc_89 : location_info := LocationInfo file_0 214 32 214 123. + Definition loc_90 : location_info := LocationInfo file_0 214 32 214 47. + Definition loc_91 : location_info := LocationInfo file_0 214 32 214 47. + Definition loc_92 : location_info := LocationInfo file_0 214 48 214 122. + Definition loc_93 : location_info := LocationInfo file_0 214 49 214 77. + Definition loc_94 : location_info := LocationInfo file_0 214 50 214 72. + Definition loc_95 : location_info := LocationInfo file_0 214 50 214 56. + Definition loc_96 : location_info := LocationInfo file_0 214 52 214 55. + Definition loc_97 : location_info := LocationInfo file_0 214 59 214 72. + Definition loc_98 : location_info := LocationInfo file_0 214 60 214 63. + Definition loc_99 : location_info := LocationInfo file_0 214 67 214 71. + Definition loc_100 : location_info := LocationInfo file_0 214 75 214 76. + Definition loc_101 : location_info := LocationInfo file_0 214 80 214 121. + Definition loc_102 : location_info := LocationInfo file_0 214 81 214 85. + Definition loc_103 : location_info := LocationInfo file_0 214 82 214 85. + Definition loc_104 : location_info := LocationInfo file_0 214 89 214 120. + Definition loc_105 : location_info := LocationInfo file_0 214 90 214 112. + Definition loc_106 : location_info := LocationInfo file_0 214 90 214 108. + Definition loc_107 : location_info := LocationInfo file_0 214 91 214 103. + Definition loc_108 : location_info := LocationInfo file_0 214 106 214 107. + Definition loc_109 : location_info := LocationInfo file_0 214 111 214 112. + Definition loc_110 : location_info := LocationInfo file_0 214 115 214 119. + Definition loc_111 : location_info := LocationInfo file_0 214 126 214 127. + Definition loc_112 : location_info := LocationInfo file_0 214 132 214 208. + Definition loc_113 : location_info := LocationInfo file_0 214 134 214 162. + Definition loc_114 : location_info := LocationInfo file_0 214 135 214 157. + Definition loc_115 : location_info := LocationInfo file_0 214 135 214 141. + Definition loc_116 : location_info := LocationInfo file_0 214 137 214 140. + Definition loc_117 : location_info := LocationInfo file_0 214 144 214 157. + Definition loc_118 : location_info := LocationInfo file_0 214 145 214 148. + Definition loc_119 : location_info := LocationInfo file_0 214 152 214 156. + Definition loc_120 : location_info := LocationInfo file_0 214 160 214 161. + Definition loc_121 : location_info := LocationInfo file_0 214 165 214 206. + Definition loc_122 : location_info := LocationInfo file_0 214 166 214 170. + Definition loc_123 : location_info := LocationInfo file_0 214 167 214 170. + Definition loc_124 : location_info := LocationInfo file_0 214 174 214 205. + Definition loc_125 : location_info := LocationInfo file_0 214 175 214 197. + Definition loc_126 : location_info := LocationInfo file_0 214 175 214 193. + Definition loc_127 : location_info := LocationInfo file_0 214 176 214 188. + Definition loc_128 : location_info := LocationInfo file_0 214 191 214 192. + Definition loc_129 : location_info := LocationInfo file_0 214 196 214 197. + Definition loc_130 : location_info := LocationInfo file_0 214 200 214 204. + Definition loc_132 : location_info := LocationInfo file_0 213 8 213 16. + Definition loc_133 : location_info := LocationInfo file_0 213 8 213 10. + Definition loc_134 : location_info := LocationInfo file_0 213 14 213 16. + Definition loc_135 : location_info := LocationInfo file_0 211 20 211 99. + Definition loc_136 : location_info := LocationInfo file_0 211 20 211 22. + Definition loc_137 : location_info := LocationInfo file_0 211 20 211 22. + Definition loc_138 : location_info := LocationInfo file_0 211 25 211 99. + Definition loc_139 : location_info := LocationInfo file_0 211 26 211 54. + Definition loc_140 : location_info := LocationInfo file_0 211 27 211 49. + Definition loc_141 : location_info := LocationInfo file_0 211 27 211 33. + Definition loc_142 : location_info := LocationInfo file_0 211 29 211 32. + Definition loc_143 : location_info := LocationInfo file_0 211 36 211 49. + Definition loc_144 : location_info := LocationInfo file_0 211 37 211 40. + Definition loc_145 : location_info := LocationInfo file_0 211 44 211 48. + Definition loc_146 : location_info := LocationInfo file_0 211 52 211 53. + Definition loc_147 : location_info := LocationInfo file_0 211 57 211 98. + Definition loc_148 : location_info := LocationInfo file_0 211 58 211 62. + Definition loc_149 : location_info := LocationInfo file_0 211 59 211 62. + Definition loc_150 : location_info := LocationInfo file_0 211 66 211 97. + Definition loc_151 : location_info := LocationInfo file_0 211 67 211 89. + Definition loc_152 : location_info := LocationInfo file_0 211 67 211 85. + Definition loc_153 : location_info := LocationInfo file_0 211 68 211 80. + Definition loc_154 : location_info := LocationInfo file_0 211 83 211 84. + Definition loc_155 : location_info := LocationInfo file_0 211 88 211 89. + Definition loc_156 : location_info := LocationInfo file_0 211 92 211 96. + Definition loc_161 : location_info := LocationInfo file_0 222 4 222 79. + Definition loc_162 : location_info := LocationInfo file_0 223 4 223 75. + Definition loc_163 : location_info := LocationInfo file_0 224 4 224 24. + Definition loc_164 : location_info := LocationInfo file_0 224 4 224 7. + Definition loc_165 : location_info := LocationInfo file_0 224 4 224 23. + Definition loc_166 : location_info := LocationInfo file_0 224 4 224 7. + Definition loc_167 : location_info := LocationInfo file_0 224 4 224 7. + Definition loc_168 : location_info := LocationInfo file_0 224 11 224 23. + Definition loc_169 : location_info := LocationInfo file_0 224 12 224 15. + Definition loc_170 : location_info := LocationInfo file_0 224 19 224 22. + Definition loc_171 : location_info := LocationInfo file_0 223 4 223 7. + Definition loc_172 : location_info := LocationInfo file_0 223 4 223 74. + Definition loc_173 : location_info := LocationInfo file_0 223 4 223 7. + Definition loc_174 : location_info := LocationInfo file_0 223 4 223 7. + Definition loc_175 : location_info := LocationInfo file_0 223 11 223 74. + Definition loc_176 : location_info := LocationInfo file_0 223 12 223 56. + Definition loc_177 : location_info := LocationInfo file_0 223 13 223 16. + Definition loc_178 : location_info := LocationInfo file_0 223 20 223 55. + Definition loc_179 : location_info := LocationInfo file_0 223 21 223 50. + Definition loc_180 : location_info := LocationInfo file_0 223 21 223 36. + Definition loc_181 : location_info := LocationInfo file_0 223 21 223 36. + Definition loc_182 : location_info := LocationInfo file_0 223 37 223 49. + Definition loc_183 : location_info := LocationInfo file_0 223 38 223 41. + Definition loc_184 : location_info := LocationInfo file_0 223 45 223 48. + Definition loc_185 : location_info := LocationInfo file_0 223 53 223 54. + Definition loc_186 : location_info := LocationInfo file_0 223 59 223 73. + Definition loc_187 : location_info := LocationInfo file_0 223 61 223 64. + Definition loc_188 : location_info := LocationInfo file_0 223 68 223 71. + Definition loc_189 : location_info := LocationInfo file_0 222 33 222 78. + Definition loc_190 : location_info := LocationInfo file_0 222 33 222 48. + Definition loc_191 : location_info := LocationInfo file_0 222 33 222 48. + Definition loc_192 : location_info := LocationInfo file_0 222 49 222 77. + Definition loc_193 : location_info := LocationInfo file_0 222 49 222 69. + Definition loc_194 : location_info := LocationInfo file_0 222 49 222 69. + Definition loc_195 : location_info := LocationInfo file_0 222 49 222 69. + Definition loc_196 : location_info := LocationInfo file_0 222 49 222 55. + Definition loc_197 : location_info := LocationInfo file_0 222 49 222 55. + Definition loc_198 : location_info := LocationInfo file_0 222 70 222 76. + Definition loc_199 : location_info := LocationInfo file_0 222 70 222 76. + Definition loc_202 : location_info := LocationInfo file_0 222 20 222 25. + Definition loc_203 : location_info := LocationInfo file_0 222 20 222 25. + Definition loc_204 : location_info := LocationInfo file_0 222 21 222 25. + Definition loc_205 : location_info := LocationInfo file_0 222 21 222 25. + Definition loc_210 : location_info := LocationInfo file_0 232 4 232 53. + Definition loc_211 : location_info := LocationInfo file_0 233 4 234 33. + Definition loc_212 : location_info := LocationInfo file_0 235 4 235 171. + Definition loc_213 : location_info := LocationInfo file_0 236 4 236 78. + Definition loc_214 : location_info := LocationInfo file_0 237 4 237 24. + Definition loc_215 : location_info := LocationInfo file_0 239 4 240 26. + Definition loc_216 : location_info := LocationInfo file_0 242 4 242 13. + Definition loc_217 : location_info := LocationInfo file_0 242 11 242 12. + Definition loc_218 : location_info := LocationInfo file_0 240 8 240 26. + Definition loc_219 : location_info := LocationInfo file_0 240 15 240 25. + Definition loc_220 : location_info := LocationInfo file_0 240 15 240 18. + Definition loc_221 : location_info := LocationInfo file_0 240 15 240 18. + Definition loc_222 : location_info := LocationInfo file_0 240 22 240 25. + Definition loc_223 : location_info := LocationInfo file_0 240 22 240 25. + Definition loc_225 : location_info := LocationInfo file_0 239 8 239 26. + Definition loc_226 : location_info := LocationInfo file_0 239 8 239 21. + Definition loc_227 : location_info := LocationInfo file_0 239 8 239 21. + Definition loc_228 : location_info := LocationInfo file_0 239 22 239 25. + Definition loc_229 : location_info := LocationInfo file_0 239 22 239 25. + Definition loc_230 : location_info := LocationInfo file_0 237 4 237 7. + Definition loc_231 : location_info := LocationInfo file_0 237 4 237 23. + Definition loc_232 : location_info := LocationInfo file_0 237 4 237 7. + Definition loc_233 : location_info := LocationInfo file_0 237 4 237 7. + Definition loc_234 : location_info := LocationInfo file_0 237 11 237 23. + Definition loc_235 : location_info := LocationInfo file_0 237 12 237 15. + Definition loc_236 : location_info := LocationInfo file_0 237 19 237 22. + Definition loc_237 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_238 : location_info := LocationInfo file_0 236 4 236 77. + Definition loc_239 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_240 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_241 : location_info := LocationInfo file_0 236 11 236 77. + Definition loc_242 : location_info := LocationInfo file_0 236 12 236 59. + Definition loc_243 : location_info := LocationInfo file_0 236 13 236 19. + Definition loc_244 : location_info := LocationInfo file_0 236 13 236 19. + Definition loc_245 : location_info := LocationInfo file_0 236 23 236 58. + Definition loc_246 : location_info := LocationInfo file_0 236 24 236 53. + Definition loc_247 : location_info := LocationInfo file_0 236 24 236 39. + Definition loc_248 : location_info := LocationInfo file_0 236 24 236 39. + Definition loc_249 : location_info := LocationInfo file_0 236 40 236 52. + Definition loc_250 : location_info := LocationInfo file_0 236 41 236 44. + Definition loc_251 : location_info := LocationInfo file_0 236 48 236 51. + Definition loc_252 : location_info := LocationInfo file_0 236 56 236 57. + Definition loc_253 : location_info := LocationInfo file_0 236 62 236 76. + Definition loc_254 : location_info := LocationInfo file_0 236 64 236 67. + Definition loc_255 : location_info := LocationInfo file_0 236 71 236 74. + Definition loc_256 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_257 : location_info := LocationInfo file_0 235 4 235 170. + Definition loc_258 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_259 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_260 : location_info := LocationInfo file_0 235 11 235 170. + Definition loc_261 : location_info := LocationInfo file_0 235 11 235 15. + Definition loc_262 : location_info := LocationInfo file_0 235 11 235 15. + Definition loc_263 : location_info := LocationInfo file_0 235 18 235 170. + Definition loc_264 : location_info := LocationInfo file_0 235 19 235 92. + Definition loc_265 : location_info := LocationInfo file_0 235 20 235 47. + Definition loc_266 : location_info := LocationInfo file_0 235 21 235 42. + Definition loc_267 : location_info := LocationInfo file_0 235 21 235 27. + Definition loc_268 : location_info := LocationInfo file_0 235 23 235 26. + Definition loc_269 : location_info := LocationInfo file_0 235 30 235 42. + Definition loc_270 : location_info := LocationInfo file_0 235 31 235 34. + Definition loc_271 : location_info := LocationInfo file_0 235 38 235 41. + Definition loc_272 : location_info := LocationInfo file_0 235 45 235 46. + Definition loc_273 : location_info := LocationInfo file_0 235 50 235 91. + Definition loc_274 : location_info := LocationInfo file_0 235 51 235 55. + Definition loc_275 : location_info := LocationInfo file_0 235 52 235 55. + Definition loc_276 : location_info := LocationInfo file_0 235 59 235 90. + Definition loc_277 : location_info := LocationInfo file_0 235 60 235 82. + Definition loc_278 : location_info := LocationInfo file_0 235 60 235 78. + Definition loc_279 : location_info := LocationInfo file_0 235 61 235 73. + Definition loc_280 : location_info := LocationInfo file_0 235 76 235 77. + Definition loc_281 : location_info := LocationInfo file_0 235 81 235 82. + Definition loc_282 : location_info := LocationInfo file_0 235 85 235 89. + Definition loc_283 : location_info := LocationInfo file_0 235 95 235 169. + Definition loc_284 : location_info := LocationInfo file_0 235 96 235 124. + Definition loc_285 : location_info := LocationInfo file_0 235 97 235 119. + Definition loc_286 : location_info := LocationInfo file_0 235 97 235 103. + Definition loc_287 : location_info := LocationInfo file_0 235 99 235 102. + Definition loc_288 : location_info := LocationInfo file_0 235 106 235 119. + Definition loc_289 : location_info := LocationInfo file_0 235 107 235 110. + Definition loc_290 : location_info := LocationInfo file_0 235 114 235 118. + Definition loc_291 : location_info := LocationInfo file_0 235 122 235 123. + Definition loc_292 : location_info := LocationInfo file_0 235 127 235 168. + Definition loc_293 : location_info := LocationInfo file_0 235 128 235 132. + Definition loc_294 : location_info := LocationInfo file_0 235 129 235 132. + Definition loc_295 : location_info := LocationInfo file_0 235 136 235 167. + Definition loc_296 : location_info := LocationInfo file_0 235 137 235 159. + Definition loc_297 : location_info := LocationInfo file_0 235 137 235 155. + Definition loc_298 : location_info := LocationInfo file_0 235 138 235 150. + Definition loc_299 : location_info := LocationInfo file_0 235 153 235 154. + Definition loc_300 : location_info := LocationInfo file_0 235 158 235 159. + Definition loc_301 : location_info := LocationInfo file_0 235 162 235 166. + Definition loc_302 : location_info := LocationInfo file_0 233 15 234 32. + Definition loc_303 : location_info := LocationInfo file_0 233 15 233 32. + Definition loc_304 : location_info := LocationInfo file_0 233 16 233 21. + Definition loc_305 : location_info := LocationInfo file_0 233 16 233 21. + Definition loc_306 : location_info := LocationInfo file_0 233 25 233 31. + Definition loc_307 : location_info := LocationInfo file_0 233 25 233 27. + Definition loc_308 : location_info := LocationInfo file_0 233 30 233 31. + Definition loc_309 : location_info := LocationInfo file_0 233 35 233 36. + Definition loc_310 : location_info := LocationInfo file_0 234 31 234 32. + Definition loc_313 : location_info := LocationInfo file_0 232 33 232 52. + Definition loc_314 : location_info := LocationInfo file_0 232 33 232 48. + Definition loc_315 : location_info := LocationInfo file_0 232 33 232 48. + Definition loc_316 : location_info := LocationInfo file_0 232 49 232 51. + Definition loc_317 : location_info := LocationInfo file_0 232 49 232 51. + Definition loc_320 : location_info := LocationInfo file_0 232 20 232 25. + Definition loc_321 : location_info := LocationInfo file_0 232 20 232 25. + Definition loc_322 : location_info := LocationInfo file_0 232 21 232 25. + Definition loc_323 : location_info := LocationInfo file_0 232 21 232 25. + Definition loc_328 : location_info := LocationInfo file_0 254 4 254 50. + Definition loc_329 : location_info := LocationInfo file_0 255 4 255 31. + Definition loc_330 : location_info := LocationInfo file_0 256 4 256 209. + Definition loc_331 : location_info := LocationInfo file_0 257 4 257 15. + Definition loc_332 : location_info := LocationInfo file_0 258 4 259 29. + Definition loc_333 : location_info := LocationInfo file_0 260 4 261 19. + Definition loc_334 : location_info := LocationInfo file_0 262 4 269 5. + Definition loc_335 : location_info := LocationInfo file_0 270 4 270 197. + Definition loc_336 : location_info := LocationInfo file_0 271 4 271 197. + Definition loc_337 : location_info := LocationInfo file_0 272 4 272 26. + Definition loc_338 : location_info := LocationInfo file_0 273 4 273 22. + Definition loc_339 : location_info := LocationInfo file_0 274 4 274 13. + Definition loc_340 : location_info := LocationInfo file_0 274 11 274 12. + Definition loc_341 : location_info := LocationInfo file_0 273 4 273 14. + Definition loc_342 : location_info := LocationInfo file_0 273 4 273 8. + Definition loc_343 : location_info := LocationInfo file_0 273 4 273 8. + Definition loc_344 : location_info := LocationInfo file_0 273 17 273 21. + Definition loc_345 : location_info := LocationInfo file_0 273 17 273 21. + Definition loc_346 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_347 : location_info := LocationInfo file_0 272 4 272 25. + Definition loc_348 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_349 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_350 : location_info := LocationInfo file_0 272 12 272 25. + Definition loc_351 : location_info := LocationInfo file_0 272 13 272 16. + Definition loc_352 : location_info := LocationInfo file_0 272 20 272 24. + Definition loc_353 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_354 : location_info := LocationInfo file_0 271 4 271 196. + Definition loc_355 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_356 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_357 : location_info := LocationInfo file_0 271 12 271 196. + Definition loc_358 : location_info := LocationInfo file_0 271 13 271 118. + Definition loc_359 : location_info := LocationInfo file_0 271 14 271 18. + Definition loc_360 : location_info := LocationInfo file_0 271 14 271 18. + Definition loc_361 : location_info := LocationInfo file_0 271 22 271 117. + Definition loc_362 : location_info := LocationInfo file_0 271 23 271 112. + Definition loc_363 : location_info := LocationInfo file_0 271 23 271 38. + Definition loc_364 : location_info := LocationInfo file_0 271 23 271 38. + Definition loc_365 : location_info := LocationInfo file_0 271 39 271 111. + Definition loc_366 : location_info := LocationInfo file_0 271 40 271 67. + Definition loc_367 : location_info := LocationInfo file_0 271 41 271 62. + Definition loc_368 : location_info := LocationInfo file_0 271 41 271 47. + Definition loc_369 : location_info := LocationInfo file_0 271 43 271 46. + Definition loc_370 : location_info := LocationInfo file_0 271 50 271 62. + Definition loc_371 : location_info := LocationInfo file_0 271 51 271 54. + Definition loc_372 : location_info := LocationInfo file_0 271 58 271 61. + Definition loc_373 : location_info := LocationInfo file_0 271 65 271 66. + Definition loc_374 : location_info := LocationInfo file_0 271 70 271 110. + Definition loc_375 : location_info := LocationInfo file_0 271 71 271 75. + Definition loc_376 : location_info := LocationInfo file_0 271 72 271 75. + Definition loc_377 : location_info := LocationInfo file_0 271 79 271 109. + Definition loc_378 : location_info := LocationInfo file_0 271 80 271 102. + Definition loc_379 : location_info := LocationInfo file_0 271 80 271 98. + Definition loc_380 : location_info := LocationInfo file_0 271 81 271 93. + Definition loc_381 : location_info := LocationInfo file_0 271 96 271 97. + Definition loc_382 : location_info := LocationInfo file_0 271 101 271 102. + Definition loc_383 : location_info := LocationInfo file_0 271 105 271 108. + Definition loc_384 : location_info := LocationInfo file_0 271 115 271 116. + Definition loc_385 : location_info := LocationInfo file_0 271 121 271 195. + Definition loc_386 : location_info := LocationInfo file_0 271 123 271 150. + Definition loc_387 : location_info := LocationInfo file_0 271 124 271 145. + Definition loc_388 : location_info := LocationInfo file_0 271 124 271 130. + Definition loc_389 : location_info := LocationInfo file_0 271 126 271 129. + Definition loc_390 : location_info := LocationInfo file_0 271 133 271 145. + Definition loc_391 : location_info := LocationInfo file_0 271 134 271 137. + Definition loc_392 : location_info := LocationInfo file_0 271 141 271 144. + Definition loc_393 : location_info := LocationInfo file_0 271 148 271 149. + Definition loc_394 : location_info := LocationInfo file_0 271 153 271 193. + Definition loc_395 : location_info := LocationInfo file_0 271 154 271 158. + Definition loc_396 : location_info := LocationInfo file_0 271 155 271 158. + Definition loc_397 : location_info := LocationInfo file_0 271 162 271 192. + Definition loc_398 : location_info := LocationInfo file_0 271 163 271 185. + Definition loc_399 : location_info := LocationInfo file_0 271 163 271 181. + Definition loc_400 : location_info := LocationInfo file_0 271 164 271 176. + Definition loc_401 : location_info := LocationInfo file_0 271 179 271 180. + Definition loc_402 : location_info := LocationInfo file_0 271 184 271 185. + Definition loc_403 : location_info := LocationInfo file_0 271 188 271 191. + Definition loc_404 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_405 : location_info := LocationInfo file_0 270 4 270 196. + Definition loc_406 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_407 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_408 : location_info := LocationInfo file_0 270 12 270 196. + Definition loc_409 : location_info := LocationInfo file_0 270 13 270 118. + Definition loc_410 : location_info := LocationInfo file_0 270 14 270 18. + Definition loc_411 : location_info := LocationInfo file_0 270 14 270 18. + Definition loc_412 : location_info := LocationInfo file_0 270 22 270 117. + Definition loc_413 : location_info := LocationInfo file_0 270 23 270 112. + Definition loc_414 : location_info := LocationInfo file_0 270 23 270 38. + Definition loc_415 : location_info := LocationInfo file_0 270 23 270 38. + Definition loc_416 : location_info := LocationInfo file_0 270 39 270 111. + Definition loc_417 : location_info := LocationInfo file_0 270 40 270 67. + Definition loc_418 : location_info := LocationInfo file_0 270 41 270 62. + Definition loc_419 : location_info := LocationInfo file_0 270 41 270 47. + Definition loc_420 : location_info := LocationInfo file_0 270 43 270 46. + Definition loc_421 : location_info := LocationInfo file_0 270 50 270 62. + Definition loc_422 : location_info := LocationInfo file_0 270 51 270 54. + Definition loc_423 : location_info := LocationInfo file_0 270 58 270 61. + Definition loc_424 : location_info := LocationInfo file_0 270 65 270 66. + Definition loc_425 : location_info := LocationInfo file_0 270 70 270 110. + Definition loc_426 : location_info := LocationInfo file_0 270 71 270 75. + Definition loc_427 : location_info := LocationInfo file_0 270 72 270 75. + Definition loc_428 : location_info := LocationInfo file_0 270 79 270 109. + Definition loc_429 : location_info := LocationInfo file_0 270 80 270 102. + Definition loc_430 : location_info := LocationInfo file_0 270 80 270 98. + Definition loc_431 : location_info := LocationInfo file_0 270 81 270 93. + Definition loc_432 : location_info := LocationInfo file_0 270 96 270 97. + Definition loc_433 : location_info := LocationInfo file_0 270 101 270 102. + Definition loc_434 : location_info := LocationInfo file_0 270 105 270 108. + Definition loc_435 : location_info := LocationInfo file_0 270 115 270 116. + Definition loc_436 : location_info := LocationInfo file_0 270 121 270 195. + Definition loc_437 : location_info := LocationInfo file_0 270 123 270 150. + Definition loc_438 : location_info := LocationInfo file_0 270 124 270 145. + Definition loc_439 : location_info := LocationInfo file_0 270 124 270 130. + Definition loc_440 : location_info := LocationInfo file_0 270 126 270 129. + Definition loc_441 : location_info := LocationInfo file_0 270 133 270 145. + Definition loc_442 : location_info := LocationInfo file_0 270 134 270 137. + Definition loc_443 : location_info := LocationInfo file_0 270 141 270 144. + Definition loc_444 : location_info := LocationInfo file_0 270 148 270 149. + Definition loc_445 : location_info := LocationInfo file_0 270 153 270 193. + Definition loc_446 : location_info := LocationInfo file_0 270 154 270 158. + Definition loc_447 : location_info := LocationInfo file_0 270 155 270 158. + Definition loc_448 : location_info := LocationInfo file_0 270 162 270 192. + Definition loc_449 : location_info := LocationInfo file_0 270 163 270 185. + Definition loc_450 : location_info := LocationInfo file_0 270 163 270 181. + Definition loc_451 : location_info := LocationInfo file_0 270 164 270 176. + Definition loc_452 : location_info := LocationInfo file_0 270 179 270 180. + Definition loc_453 : location_info := LocationInfo file_0 270 184 270 185. + Definition loc_454 : location_info := LocationInfo file_0 270 188 270 191. + Definition loc_455 : location_info := LocationInfo file_0 262 35 267 5. + Definition loc_456 : location_info := LocationInfo file_0 263 8 264 23. + Definition loc_457 : location_info := LocationInfo file_0 265 8 266 23. + Definition loc_458 : location_info := LocationInfo file_0 266 12 266 23. + Definition loc_459 : location_info := LocationInfo file_0 266 19 266 22. + Definition loc_460 : location_info := LocationInfo file_0 266 20 266 22. + Definition loc_462 : location_info := LocationInfo file_0 265 12 265 18. + Definition loc_463 : location_info := LocationInfo file_0 265 12 265 18. + Definition loc_464 : location_info := LocationInfo file_0 264 12 264 23. + Definition loc_465 : location_info := LocationInfo file_0 264 19 264 22. + Definition loc_466 : location_info := LocationInfo file_0 264 20 264 22. + Definition loc_468 : location_info := LocationInfo file_0 263 12 263 37. + Definition loc_469 : location_info := LocationInfo file_0 263 12 263 16. + Definition loc_470 : location_info := LocationInfo file_0 263 12 263 16. + Definition loc_471 : location_info := LocationInfo file_0 263 19 263 37. + Definition loc_472 : location_info := LocationInfo file_0 267 11 269 5. + Definition loc_473 : location_info := LocationInfo file_0 268 8 268 30. + Definition loc_474 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_475 : location_info := LocationInfo file_0 268 8 268 29. + Definition loc_476 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_477 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_478 : location_info := LocationInfo file_0 268 16 268 29. + Definition loc_479 : location_info := LocationInfo file_0 268 17 268 20. + Definition loc_480 : location_info := LocationInfo file_0 268 24 268 28. + Definition loc_481 : location_info := LocationInfo file_0 262 8 262 33. + Definition loc_482 : location_info := LocationInfo file_0 262 8 262 12. + Definition loc_483 : location_info := LocationInfo file_0 262 8 262 12. + Definition loc_484 : location_info := LocationInfo file_0 262 15 262 33. + Definition loc_485 : location_info := LocationInfo file_0 261 8 261 19. + Definition loc_486 : location_info := LocationInfo file_0 261 15 261 18. + Definition loc_487 : location_info := LocationInfo file_0 261 16 261 18. + Definition loc_489 : location_info := LocationInfo file_0 260 8 260 36. + Definition loc_491 : location_info := LocationInfo file_0 260 9 260 36. + Definition loc_492 : location_info := LocationInfo file_0 260 10 260 14. + Definition loc_493 : location_info := LocationInfo file_0 260 10 260 14. + Definition loc_494 : location_info := LocationInfo file_0 260 17 260 35. + Definition loc_495 : location_info := LocationInfo file_0 258 13 259 28. + Definition loc_496 : location_info := LocationInfo file_0 258 13 258 40. + Definition loc_497 : location_info := LocationInfo file_0 258 14 258 18. + Definition loc_498 : location_info := LocationInfo file_0 258 14 258 18. + Definition loc_499 : location_info := LocationInfo file_0 258 21 258 39. + Definition loc_500 : location_info := LocationInfo file_0 258 43 258 44. + Definition loc_501 : location_info := LocationInfo file_0 259 27 259 28. + Definition loc_504 : location_info := LocationInfo file_0 257 13 257 14. + Definition loc_507 : location_info := LocationInfo file_0 256 21 256 208. + Definition loc_508 : location_info := LocationInfo file_0 256 22 256 130. + Definition loc_509 : location_info := LocationInfo file_0 256 23 256 30. + Definition loc_510 : location_info := LocationInfo file_0 256 23 256 30. + Definition loc_511 : location_info := LocationInfo file_0 256 34 256 129. + Definition loc_512 : location_info := LocationInfo file_0 256 35 256 124. + Definition loc_513 : location_info := LocationInfo file_0 256 35 256 50. + Definition loc_514 : location_info := LocationInfo file_0 256 35 256 50. + Definition loc_515 : location_info := LocationInfo file_0 256 51 256 123. + Definition loc_516 : location_info := LocationInfo file_0 256 52 256 79. + Definition loc_517 : location_info := LocationInfo file_0 256 53 256 74. + Definition loc_518 : location_info := LocationInfo file_0 256 53 256 59. + Definition loc_519 : location_info := LocationInfo file_0 256 55 256 58. + Definition loc_520 : location_info := LocationInfo file_0 256 62 256 74. + Definition loc_521 : location_info := LocationInfo file_0 256 63 256 66. + Definition loc_522 : location_info := LocationInfo file_0 256 70 256 73. + Definition loc_523 : location_info := LocationInfo file_0 256 77 256 78. + Definition loc_524 : location_info := LocationInfo file_0 256 82 256 122. + Definition loc_525 : location_info := LocationInfo file_0 256 83 256 87. + Definition loc_526 : location_info := LocationInfo file_0 256 84 256 87. + Definition loc_527 : location_info := LocationInfo file_0 256 91 256 121. + Definition loc_528 : location_info := LocationInfo file_0 256 92 256 114. + Definition loc_529 : location_info := LocationInfo file_0 256 92 256 110. + Definition loc_530 : location_info := LocationInfo file_0 256 93 256 105. + Definition loc_531 : location_info := LocationInfo file_0 256 108 256 109. + Definition loc_532 : location_info := LocationInfo file_0 256 113 256 114. + Definition loc_533 : location_info := LocationInfo file_0 256 117 256 120. + Definition loc_534 : location_info := LocationInfo file_0 256 127 256 128. + Definition loc_535 : location_info := LocationInfo file_0 256 133 256 207. + Definition loc_536 : location_info := LocationInfo file_0 256 135 256 162. + Definition loc_537 : location_info := LocationInfo file_0 256 136 256 157. + Definition loc_538 : location_info := LocationInfo file_0 256 136 256 142. + Definition loc_539 : location_info := LocationInfo file_0 256 138 256 141. + Definition loc_540 : location_info := LocationInfo file_0 256 145 256 157. + Definition loc_541 : location_info := LocationInfo file_0 256 146 256 149. + Definition loc_542 : location_info := LocationInfo file_0 256 153 256 156. + Definition loc_543 : location_info := LocationInfo file_0 256 160 256 161. + Definition loc_544 : location_info := LocationInfo file_0 256 165 256 205. + Definition loc_545 : location_info := LocationInfo file_0 256 166 256 170. + Definition loc_546 : location_info := LocationInfo file_0 256 167 256 170. + Definition loc_547 : location_info := LocationInfo file_0 256 174 256 204. + Definition loc_548 : location_info := LocationInfo file_0 256 175 256 197. + Definition loc_549 : location_info := LocationInfo file_0 256 175 256 193. + Definition loc_550 : location_info := LocationInfo file_0 256 176 256 188. + Definition loc_551 : location_info := LocationInfo file_0 256 191 256 192. + Definition loc_552 : location_info := LocationInfo file_0 256 196 256 197. + Definition loc_553 : location_info := LocationInfo file_0 256 200 256 203. + Definition loc_556 : location_info := LocationInfo file_0 255 16 255 30. + Definition loc_557 : location_info := LocationInfo file_0 255 16 255 22. + Definition loc_558 : location_info := LocationInfo file_0 255 16 255 22. + Definition loc_559 : location_info := LocationInfo file_0 255 25 255 26. + Definition loc_560 : location_info := LocationInfo file_0 255 29 255 30. + Definition loc_563 : location_info := LocationInfo file_0 254 19 254 49. + Definition loc_564 : location_info := LocationInfo file_0 254 19 254 23. + Definition loc_565 : location_info := LocationInfo file_0 254 19 254 23. + Definition loc_566 : location_info := LocationInfo file_0 254 26 254 49. + + (* Definition of struct [kvm_pgtable_mm_ops]. *) + Program Definition struct_kvm_pgtable_mm_ops := {| + sl_members := [ + (Some "zalloc_page", void*); + (Some "zalloc_pages_exact", void*); + (Some "free_pages_exact", void*); + (Some "get_page", void*); + (Some "put_page", void*); + (Some "page_count", void*); + (Some "phys_to_virt", void*); + (Some "virt_to_phys", void*) + ]; + |}. + Solve Obligations with solve_struct_obligations. + + (* Definition of struct [hyp_map_data]. *) + Program Definition struct_hyp_map_data := {| + sl_members := [ + (Some "phys", it_layout u64); + (Some "attr", it_layout u64); + (Some "mm_ops", void*) + ]; + |}. + Solve Obligations with solve_struct_obligations. + + (* Definition of function [kvm_pte_valid]. *) + Definition impl_kvm_pte_valid : function := {| + f_args := [ + ("pte", it_layout u64) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_2 ; + Return (LocInfoE loc_3 (UnOp (CastOp $ IntOp bool_it) (IntOp u64) (LocInfoE loc_3 ((LocInfoE loc_4 (use{it_layout u64} (LocInfoE loc_5 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_6 ((LocInfoE loc_7 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_8 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_8 (i2v 0 i32)))))))))) + ]> $∅ + )%E + |}. + + (* Definition of function [kvm_pte_table]. *) + Definition impl_kvm_pte_table (global___builtin_ffsll global_kvm_pte_valid : loc): function := {| + f_args := [ + ("pte", it_layout u64); + ("level", it_layout u32) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_44 ; + if: LocInfoE loc_44 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_44 ((LocInfoE loc_45 (use{it_layout u32} (LocInfoE loc_46 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_47 ((LocInfoE loc_48 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_49 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_49 (i2v 1 i32))))))))) + then + locinfo: loc_41 ; + Goto "#5" + else + locinfo: loc_34 ; + Goto "#6" + ]> $ + <[ "#1" := + locinfo: loc_34 ; + if: LocInfoE loc_34 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_34 ((i2v 0 i32) ={IntOp i32, IntOp i32} (LocInfoE loc_36 (UnOp (CastOp $ IntOp i32) (IntOp bool_it) (LocInfoE loc_36 (Call (LocInfoE loc_38 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_39 (use{it_layout u64} (LocInfoE loc_40 ("pte"))) ]))))))) + then + locinfo: loc_31 ; + Goto "#3" + else + locinfo: loc_13 ; + Goto "#4" + ]> $ + <[ "#2" := + locinfo: loc_13 ; + Return (LocInfoE loc_14 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_14 ((LocInfoE loc_15 ((LocInfoE loc_16 ((LocInfoE loc_17 (use{it_layout u64} (LocInfoE loc_18 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_19 ((LocInfoE loc_20 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_21 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_21 (i2v 1 i32)))))))) >>{IntOp u64, IntOp u64} (LocInfoE loc_22 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_22 ((LocInfoE loc_23 (Call (LocInfoE loc_25 (global___builtin_ffsll)) [@{expr} LocInfoE loc_26 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_26 ((LocInfoE loc_27 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_28 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_28 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_29 (i2v 1 i32)))))))) ={IntOp u64, IntOp u64} (LocInfoE loc_30 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_30 (i2v 1 i32)))))))) + ]> $ + <[ "#3" := + locinfo: loc_31 ; + Return (LocInfoE loc_32 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_32 (i2v 0 i32)))) + ]> $ + <[ "#4" := + locinfo: loc_13 ; + Goto "#2" + ]> $ + <[ "#5" := + locinfo: loc_41 ; + Return (LocInfoE loc_42 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_42 (i2v 0 i32)))) + ]> $ + <[ "#6" := + locinfo: loc_34 ; + Goto "#1" + ]> $∅ + )%E + |}. + + (* Definition of function [kvm_set_invalid_pte]. *) + Definition impl_kvm_set_invalid_pte : function := {| + f_args := [ + ("ptep", void*) + ]; + f_local_vars := [ + ("pte", it_layout u64) + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + "pte" <-{ it_layout u64 } + LocInfoE loc_64 (use{it_layout u64} (LocInfoE loc_66 (!{void*} (LocInfoE loc_67 ("ptep"))))) ; + locinfo: loc_53 ; + LocInfoE loc_55 (!{void*} (LocInfoE loc_56 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_57 ((LocInfoE loc_58 (use{it_layout u64} (LocInfoE loc_59 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_60 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_61 ((LocInfoE loc_62 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_63 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_63 (i2v 0 i32))))))))) ; + Return (VOID) + ]> $∅ + )%E + |}. + + (* Definition of function [kvm_phys_to_pte]. *) + Definition impl_kvm_phys_to_pte (global___builtin_ffsll : loc): function := {| + f_args := [ + ("pa", it_layout u64) + ]; + f_local_vars := [ + ("pte", it_layout u64) + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + "pte" <-{ it_layout u64 } + LocInfoE loc_135 ((LocInfoE loc_136 (use{it_layout u64} (LocInfoE loc_137 ("pa")))) &{IntOp u64, IntOp u64} (LocInfoE loc_138 ((LocInfoE loc_139 ((LocInfoE loc_140 ((LocInfoE loc_141 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_142 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_143 ((LocInfoE loc_144 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_145 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_145 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_146 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_146 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_147 ((LocInfoE loc_148 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_149 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_150 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_150 ((LocInfoE loc_151 ((LocInfoE loc_152 ((LocInfoE loc_153 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_154 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_154 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_155 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_155 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_156 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_156 (i2v 47 i32))))))))))))) ; + locinfo: loc_132 ; + if: LocInfoE loc_132 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_132 ((LocInfoE loc_133 (i2v 12 i32)) ={IntOp i32, IntOp i32} (LocInfoE loc_134 (i2v 16 i32))))) + then + locinfo: loc_77 ; + Goto "#2" + else + locinfo: loc_74 ; + Goto "#3" + ]> $ + <[ "#1" := + locinfo: loc_74 ; + Return (LocInfoE loc_75 (use{it_layout u64} (LocInfoE loc_76 ("pte")))) + ]> $ + <[ "#2" := + locinfo: loc_77 ; + LocInfoE loc_78 ("pte") <-{ it_layout u64 } + LocInfoE loc_79 ((LocInfoE loc_80 (use{it_layout u64} (LocInfoE loc_81 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_82 ((LocInfoE loc_83 ((LocInfoE loc_84 ((LocInfoE loc_85 (use{it_layout u64} (LocInfoE loc_86 ("pa")))) >>{IntOp u64, IntOp u64} (LocInfoE loc_87 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_87 (i2v 48 i32)))))) <<{IntOp u64, IntOp u64} (LocInfoE loc_88 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_88 ((LocInfoE loc_89 (Call (LocInfoE loc_91 (global___builtin_ffsll)) [@{expr} LocInfoE loc_92 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_92 ((LocInfoE loc_93 ((LocInfoE loc_94 ((LocInfoE loc_95 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_96 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_97 ((LocInfoE loc_98 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_99 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_99 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_100 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_100 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_101 ((LocInfoE loc_102 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_103 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_104 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_104 ((LocInfoE loc_105 ((LocInfoE loc_106 ((LocInfoE loc_107 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_108 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_108 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_109 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_109 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_110 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_110 (i2v 15 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_111 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_112 ((LocInfoE loc_113 ((LocInfoE loc_114 ((LocInfoE loc_115 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_116 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_117 ((LocInfoE loc_118 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_119 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_119 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_120 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_120 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_121 ((LocInfoE loc_122 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_123 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_124 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_124 ((LocInfoE loc_125 ((LocInfoE loc_126 ((LocInfoE loc_127 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_128 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_128 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_129 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_129 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_130 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_130 (i2v 15 i32))))))))))))))) ; + locinfo: loc_74 ; + Goto "#1" + ]> $ + <[ "#3" := + locinfo: loc_74 ; + Goto "#1" + ]> $∅ + )%E + |}. + + (* Definition of function [kvm_set_table_pte]. *) + Definition impl_kvm_set_table_pte (global___builtin_ffsll global_kvm_phys_to_pte : loc): function := {| + f_args := [ + ("ptep", void*); + ("childp", void*); + ("mm_ops", void*) + ]; + f_local_vars := [ + ("old", it_layout u64); + ("pte", it_layout u64) + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + "old" <-{ it_layout u64 } + LocInfoE loc_202 (use{it_layout u64} (LocInfoE loc_204 (!{void*} (LocInfoE loc_205 ("ptep"))))) ; + "pte" <-{ it_layout u64 } + LocInfoE loc_189 (Call (LocInfoE loc_191 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_192 (Call (LocInfoE loc_194 (use{void*} (LocInfoE loc_195 ((LocInfoE loc_196 (!{void*} (LocInfoE loc_197 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_198 (use{void*} (LocInfoE loc_199 ("childp"))) ]) ]) ; + locinfo: loc_162 ; + LocInfoE loc_171 ("pte") <-{ it_layout u64 } + LocInfoE loc_172 ((LocInfoE loc_173 (use{it_layout u64} (LocInfoE loc_174 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_175 ((LocInfoE loc_176 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_176 ((LocInfoE loc_177 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_178 ((LocInfoE loc_179 (Call (LocInfoE loc_181 (global___builtin_ffsll)) [@{expr} LocInfoE loc_182 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_182 ((LocInfoE loc_183 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_184 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_184 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_185 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_186 ((LocInfoE loc_187 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_188 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_188 (i2v 1 i32))))))))) ; + locinfo: loc_163 ; + LocInfoE loc_164 ("pte") <-{ it_layout u64 } + LocInfoE loc_165 ((LocInfoE loc_166 (use{it_layout u64} (LocInfoE loc_167 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_168 ((LocInfoE loc_169 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_170 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_170 (i2v 0 i32))))))) ; + Return (VOID) + ]> $∅ + )%E + |}. + + (* Definition of function [kvm_set_valid_leaf_pte]. *) + Definition impl_kvm_set_valid_leaf_pte (global___builtin_ffsll global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| + f_args := [ + ("ptep", void*); + ("pa", it_layout u64); + ("attr", it_layout u64); + ("level", it_layout u32) + ]; + f_local_vars := [ + ("old", it_layout u64); + ("type", it_layout u64); + ("pte", it_layout u64) + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + "old" <-{ it_layout u64 } + LocInfoE loc_320 (use{it_layout u64} (LocInfoE loc_322 (!{void*} (LocInfoE loc_323 ("ptep"))))) ; + "pte" <-{ it_layout u64 } + LocInfoE loc_313 (Call (LocInfoE loc_315 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_316 (use{it_layout u64} (LocInfoE loc_317 ("pa"))) ]) ; + "type" <-{ it_layout u64 } + LocInfoE loc_302 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_302 (IfE + (IntOp i32) + (LocInfoE loc_303 ((LocInfoE loc_304 (use{it_layout u32} (LocInfoE loc_305 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_306 ((LocInfoE loc_307 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_308 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_308 (i2v 1 i32)))))))) + (LocInfoE loc_309 (i2v 1 i32)) (LocInfoE loc_310 (i2v 0 i32))))) ; + locinfo: loc_212 ; + LocInfoE loc_256 ("pte") <-{ it_layout u64 } + LocInfoE loc_257 ((LocInfoE loc_258 (use{it_layout u64} (LocInfoE loc_259 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_260 ((LocInfoE loc_261 (use{it_layout u64} (LocInfoE loc_262 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_263 ((LocInfoE loc_264 ((LocInfoE loc_265 ((LocInfoE loc_266 ((LocInfoE loc_267 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_268 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_269 ((LocInfoE loc_270 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_271 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_271 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_272 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_272 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_273 ((LocInfoE loc_274 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_275 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_276 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_276 ((LocInfoE loc_277 ((LocInfoE loc_278 ((LocInfoE loc_279 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_280 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_280 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_281 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_281 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_282 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_282 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_283 ((LocInfoE loc_284 ((LocInfoE loc_285 ((LocInfoE loc_286 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_287 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_288 ((LocInfoE loc_289 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_290 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_290 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_291 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_291 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_292 ((LocInfoE loc_293 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_294 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_295 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 ((LocInfoE loc_298 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_299 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_299 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_300 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_300 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_301 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_301 (i2v 63 i32))))))))))))))))) ; + locinfo: loc_213 ; + LocInfoE loc_237 ("pte") <-{ it_layout u64 } + LocInfoE loc_238 ((LocInfoE loc_239 (use{it_layout u64} (LocInfoE loc_240 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_241 ((LocInfoE loc_242 ((LocInfoE loc_243 (use{it_layout u64} (LocInfoE loc_244 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_245 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_245 ((LocInfoE loc_246 (Call (LocInfoE loc_248 (global___builtin_ffsll)) [@{expr} LocInfoE loc_249 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_249 ((LocInfoE loc_250 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_251 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_251 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_252 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_253 ((LocInfoE loc_254 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_255 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_255 (i2v 1 i32))))))))) ; + locinfo: loc_214 ; + LocInfoE loc_230 ("pte") <-{ it_layout u64 } + LocInfoE loc_231 ((LocInfoE loc_232 (use{it_layout u64} (LocInfoE loc_233 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_234 ((LocInfoE loc_235 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_236 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_236 (i2v 0 i32))))))) ; + locinfo: loc_225 ; + if: LocInfoE loc_225 (Call (LocInfoE loc_227 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_228 (use{it_layout u64} (LocInfoE loc_229 ("old"))) ]) + then + locinfo: loc_218 ; + Goto "#2" + else + locinfo: loc_216 ; + Goto "#3" + ]> $ + <[ "#1" := + locinfo: loc_216 ; + Return (LocInfoE loc_217 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_217 (i2v 1 i32)))) + ]> $ + <[ "#2" := + locinfo: loc_218 ; + Return (LocInfoE loc_219 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_219 ((LocInfoE loc_220 (use{it_layout u64} (LocInfoE loc_221 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_222 (use{it_layout u64} (LocInfoE loc_223 ("pte")))))))) + ]> $ + <[ "#3" := + locinfo: loc_216 ; + Goto "#1" + ]> $∅ + )%E + |}. + + (* Definition of function [hyp_map_set_prot_attr]. *) + Definition impl_hyp_map_set_prot_attr (global___builtin_ffsll : loc): function := {| + f_args := [ + ("prot", it_layout u32); + ("data", void*) + ]; + f_local_vars := [ + ("mtype", it_layout u32); + ("sh", it_layout u32); + ("ap", it_layout u32); + ("attr", it_layout u64); + ("device", it_layout bool_it) + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + "device" <-{ it_layout bool_it } + LocInfoE loc_563 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_563 ((LocInfoE loc_564 (use{it_layout u32} (LocInfoE loc_565 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_566 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_566 (i2v 8 i32))))))) ; + "mtype" <-{ it_layout u32 } + LocInfoE loc_556 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_556 (IfE + (IntOp bool_it) + (LocInfoE loc_557 (use{it_layout bool_it} (LocInfoE loc_558 ("device")))) + (LocInfoE loc_559 (i2v 5 i32)) (LocInfoE loc_560 (i2v 0 i32))))) ; + "attr" <-{ it_layout u64 } + LocInfoE loc_507 ((LocInfoE loc_508 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_508 ((LocInfoE loc_509 (use{it_layout u32} (LocInfoE loc_510 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_511 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_511 ((LocInfoE loc_512 (Call (LocInfoE loc_514 (global___builtin_ffsll)) [@{expr} LocInfoE loc_515 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_515 ((LocInfoE loc_516 ((LocInfoE loc_517 ((LocInfoE loc_518 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_519 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_520 ((LocInfoE loc_521 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_522 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_522 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_523 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_523 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_524 ((LocInfoE loc_525 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_526 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_527 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_527 ((LocInfoE loc_528 ((LocInfoE loc_529 ((LocInfoE loc_530 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_531 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_531 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_532 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_532 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_533 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_533 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_534 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_535 ((LocInfoE loc_536 ((LocInfoE loc_537 ((LocInfoE loc_538 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_539 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_540 ((LocInfoE loc_541 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_542 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_542 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_543 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_543 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_544 ((LocInfoE loc_545 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_546 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_547 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_547 ((LocInfoE loc_548 ((LocInfoE loc_549 ((LocInfoE loc_550 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_551 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_551 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_552 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_552 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_553 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_553 (i2v 4 i32))))))))))))) ; + "sh" <-{ it_layout u32 } + LocInfoE loc_504 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_504 (i2v 3 i32))) ; + "ap" <-{ it_layout u32 } + LocInfoE loc_495 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_495 (IfE + (IntOp u32) + (LocInfoE loc_496 ((LocInfoE loc_497 (use{it_layout u32} (LocInfoE loc_498 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_499 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_499 (i2v 2 i32)))))) + (LocInfoE loc_500 (i2v 1 i32)) (LocInfoE loc_501 (i2v 3 i32))))) ; + locinfo: loc_489 ; + if: LocInfoE loc_489 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_489 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_491 ((LocInfoE loc_492 (use{it_layout u32} (LocInfoE loc_493 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_494 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_494 (i2v 4 i32))))))))) + then + locinfo: loc_485 ; + Goto "#10" + else + locinfo: loc_481 ; + Goto "#11" + ]> $ + <[ "#1" := + locinfo: loc_481 ; + if: LocInfoE loc_481 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_481 ((LocInfoE loc_482 (use{it_layout u32} (LocInfoE loc_483 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_484 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_484 (i2v 1 i32))))))) + then + locinfo: loc_468 ; + Goto "#3" + else + locinfo: loc_473 ; + Goto "#9" + ]> $ + <[ "#10" := + locinfo: loc_485 ; + Return (LocInfoE loc_486 (UnOp NegOp (IntOp i32) (LocInfoE loc_487 (i2v 22 i32)))) + ]> $ + <[ "#11" := + locinfo: loc_481 ; + Goto "#1" + ]> $ + <[ "#2" := + locinfo: loc_335 ; + LocInfoE loc_404 ("attr") <-{ it_layout u64 } + LocInfoE loc_405 ((LocInfoE loc_406 (use{it_layout u64} (LocInfoE loc_407 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_408 ((LocInfoE loc_409 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_409 ((LocInfoE loc_410 (use{it_layout u32} (LocInfoE loc_411 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_412 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_412 ((LocInfoE loc_413 (Call (LocInfoE loc_415 (global___builtin_ffsll)) [@{expr} LocInfoE loc_416 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_416 ((LocInfoE loc_417 ((LocInfoE loc_418 ((LocInfoE loc_419 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_420 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_421 ((LocInfoE loc_422 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_423 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_423 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_424 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_424 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_425 ((LocInfoE loc_426 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_427 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_428 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_428 ((LocInfoE loc_429 ((LocInfoE loc_430 ((LocInfoE loc_431 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_432 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_432 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_433 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_433 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_434 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_434 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_435 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_436 ((LocInfoE loc_437 ((LocInfoE loc_438 ((LocInfoE loc_439 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_440 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_441 ((LocInfoE loc_442 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_443 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_443 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_444 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_444 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_445 ((LocInfoE loc_446 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_447 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_448 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_448 ((LocInfoE loc_449 ((LocInfoE loc_450 ((LocInfoE loc_451 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_452 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_452 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_453 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_453 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_454 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_454 (i2v 7 i32))))))))))))))) ; + locinfo: loc_336 ; + LocInfoE loc_353 ("attr") <-{ it_layout u64 } + LocInfoE loc_354 ((LocInfoE loc_355 (use{it_layout u64} (LocInfoE loc_356 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_357 ((LocInfoE loc_358 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_358 ((LocInfoE loc_359 (use{it_layout u32} (LocInfoE loc_360 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_361 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_361 ((LocInfoE loc_362 (Call (LocInfoE loc_364 (global___builtin_ffsll)) [@{expr} LocInfoE loc_365 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_365 ((LocInfoE loc_366 ((LocInfoE loc_367 ((LocInfoE loc_368 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_369 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_370 ((LocInfoE loc_371 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_372 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_372 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_373 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_373 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_374 ((LocInfoE loc_375 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_376 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_377 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_377 ((LocInfoE loc_378 ((LocInfoE loc_379 ((LocInfoE loc_380 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_381 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_381 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_382 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_382 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_383 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_383 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_384 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_385 ((LocInfoE loc_386 ((LocInfoE loc_387 ((LocInfoE loc_388 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_389 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_390 ((LocInfoE loc_391 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_392 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_392 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_393 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_393 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_394 ((LocInfoE loc_395 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_396 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_397 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_397 ((LocInfoE loc_398 ((LocInfoE loc_399 ((LocInfoE loc_400 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_401 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_401 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_402 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_402 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_403 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_403 (i2v 9 i32))))))))))))))) ; + locinfo: loc_337 ; + LocInfoE loc_346 ("attr") <-{ it_layout u64 } + LocInfoE loc_347 ((LocInfoE loc_348 (use{it_layout u64} (LocInfoE loc_349 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_350 ((LocInfoE loc_351 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_352 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_352 (i2v 10 i32))))))) ; + locinfo: loc_338 ; + LocInfoE loc_341 ((LocInfoE loc_342 (!{void*} (LocInfoE loc_343 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } + LocInfoE loc_344 (use{it_layout u64} (LocInfoE loc_345 ("attr"))) ; + locinfo: loc_339 ; + Return (LocInfoE loc_340 (i2v 0 i32)) + ]> $ + <[ "#3" := + locinfo: loc_468 ; + if: LocInfoE loc_468 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_468 ((LocInfoE loc_469 (use{it_layout u32} (LocInfoE loc_470 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_471 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_471 (i2v 2 i32))))))) + then + locinfo: loc_464 ; + Goto "#7" + else + locinfo: loc_462 ; + Goto "#8" + ]> $ + <[ "#4" := + locinfo: loc_462 ; + if: LocInfoE loc_462 (use{it_layout bool_it} (LocInfoE loc_463 ("device"))) + then + locinfo: loc_458 ; + Goto "#5" + else + locinfo: loc_335 ; + Goto "#6" + ]> $ + <[ "#5" := + locinfo: loc_458 ; + Return (LocInfoE loc_459 (UnOp NegOp (IntOp i32) (LocInfoE loc_460 (i2v 22 i32)))) + ]> $ + <[ "#6" := + locinfo: loc_335 ; + Goto "#2" + ]> $ + <[ "#7" := + locinfo: loc_464 ; + Return (LocInfoE loc_465 (UnOp NegOp (IntOp i32) (LocInfoE loc_466 (i2v 22 i32)))) + ]> $ + <[ "#8" := + locinfo: loc_462 ; + Goto "#4" + ]> $ + <[ "#9" := + locinfo: loc_473 ; + LocInfoE loc_474 ("attr") <-{ it_layout u64 } + LocInfoE loc_475 ((LocInfoE loc_476 (use{it_layout u64} (LocInfoE loc_477 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_478 ((LocInfoE loc_479 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_480 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_480 (i2v 54 i32))))))) ; + locinfo: loc_335 ; + Goto "#2" + ]> $∅ + )%E + |}. +End code. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v b/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v new file mode 100644 index 00000000..7afb1f35 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v @@ -0,0 +1 @@ +(* You were too lazy to even write a spec for this function. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v new file mode 100644 index 00000000..7afb1f35 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v @@ -0,0 +1 @@ +(* You were too lazy to even write a spec for this function. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v new file mode 100644 index 00000000..7afb1f35 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v @@ -0,0 +1 @@ +(* You were too lazy to even write a spec for this function. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v new file mode 100644 index 00000000..a88ce7f7 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -0,0 +1,42 @@ +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section spec. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Type definitions. *) + + (* Specifications for function [__builtin_ffsll]. *) + Definition type_of___builtin_ffsll := + fn(∀ x : Z; (x @ (int (i64))); True) + → ∃ i : nat, ((1 + i) @ (int (i32))); ⌜i < 64⌝ ∗ ⌜Z.testbit x i = true⌝ ∗ ⌜∀ j, j < i -> Z.testbit x j = false⌝. + + (* Specifications for function [kvm_pte_valid]. *) + Definition type_of_kvm_pte_valid := + fn(∀ pte : Z; (pte @ (int (u64))); True) + → ∃ () : (), ((valid pte) @ (boolean (bool_it))); True. + + (* Specifications for function [kvm_pte_table]. *) + Definition type_of_kvm_pte_table := + fn(∀ (pte, level) : Z * nat; (pte @ (int (u64))), (level @ (int (u32))); True) + → ∃ () : (), ((negb (level =? 3) && valid pte && table pte) @ (boolean (bool_it))); True. + + (* Specifications for function [kvm_set_invalid_pte]. *) + Definition type_of_kvm_set_invalid_pte := + fn(∀ (pte_old, p) : Z * loc; (p @ (&own (pte_old @ (int (u64))))); True) + → ∃ pte_new : Z, (void); (p ◁ₗ (pte_new @ (int (u64)))) ∗ ⌜valid pte_new = false⌝. + + (* Specifications for function [kvm_phys_to_pte]. *) + Definition type_of_kvm_phys_to_pte := + fn(∀ pa : Z; (pa @ (int (u64))); True) + → ∃ pte : Z, (pte @ (int (u64))); ⌜pa_pte pa pte⌝. + + (* Function [kvm_set_table_pte] has been skipped. *) + + (* Function [kvm_set_valid_leaf_pte] has been skipped. *) + + (* Function [hyp_map_set_prot_attr] has been skipped. *) +End spec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v new file mode 100644 index 00000000..911a2663 --- /dev/null +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -0,0 +1,14 @@ +From refinedc.typing Require Import typing. + +(* TODO: pte as record *) + +Definition valid (pte : Z) : bool := + Z.testbit pte 0. + +Definition table (pte : Z) : bool := + Z.testbit pte 1. + +(* Definition invalidate (pte : Z) : Z := . *) + +Definition pa_pte (pa pte : Z) : Prop := + ∀ i, 12 ≤ i ≤ 47 -> Z.testbit pa i = Z.testbit pte i. diff --git a/linux/casestudies/proofs/pgtable/proof_files b/linux/casestudies/proofs/pgtable/proof_files new file mode 100644 index 00000000..ba90f13a --- /dev/null +++ b/linux/casestudies/proofs/pgtable/proof_files @@ -0,0 +1,8 @@ +generated_proof___builtin_ffsll.v +generated_proof_hyp_map_set_prot_attr.v +generated_proof_kvm_phys_to_pte.v +generated_proof_kvm_pte_table.v +generated_proof_kvm_pte_valid.v +generated_proof_kvm_set_invalid_pte.v +generated_proof_kvm_set_table_pte.v +generated_proof_kvm_set_valid_leaf_pte.v -- GitLab From dcf343ebe08a5dbf799718f251c2c0bfe41ec8e0 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 25 Feb 2021 18:09:04 +0800 Subject: [PATCH 03/71] try define and customize fields --- linux/casestudies/pgtable.c | 17 +- .../proofs/pgtable/generated_code.v | 1192 +++++++++-------- .../proofs/pgtable/generated_spec.v | 10 +- .../proofs/pgtable/pgtable_lemmas.v | 80 +- 4 files changed, 690 insertions(+), 609 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 1b8cc107..7b0a5d15 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -170,7 +170,7 @@ struct kvm_pgtable_mm_ops { [[rc::parameters("pte : Z")]] [[rc::args("pte @ int")]] -[[rc::returns("{valid pte} @ boolean")]] +[[rc::returns("{get_field pte_valid pte} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { @@ -179,7 +179,7 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : Z", "level : nat")]] [[rc::args("pte @ int", "level @ int")]] -[[rc::returns("{bool_decide (level <> 3) && valid pte && table pte} @ boolean")]] +[[rc::returns("{bool_decide (level <> 3%nat) && get_field pte_valid pte && get_field pte_table pte} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -190,10 +190,9 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) return FIELD_GET(KVM_PTE_TYPE, pte) == KVM_PTE_TYPE_TABLE; } -[[rc::parameters("pte_old : Z", "p : loc")]] -[[rc::args("p @ &own>")]] -[[rc::exists("pte_new : Z")]] -[[rc::ensures("own p : pte_new @ int", "{valid pte_new = false}")]] +[[rc::parameters("pte : Z", "p : loc")]] +[[rc::args("p @ &own>")]] +[[rc::ensures("own p : {put_field pte_valid false pte} @ int")]] [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -203,9 +202,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] -[[rc::exists("pte : Z")]] -[[rc::returns("pte @ int")]] -[[rc::ensures("{pa_pte pa pte}")]] +[[rc::returns("{mask_field pte_addr pa} @ int")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { @@ -225,6 +222,7 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, pte |= KVM_PTE_VALID; // WARN_ON(kvm_pte_valid(old)); TODO: assert // smp_store_release(ptep, pte); + *ptep = pte; } static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, @@ -240,6 +238,7 @@ static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, if (kvm_pte_valid(old)) return old == pte; // smp_store_release(ptep, pte); + *ptep = pte; return true; } diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 948866b8..d0230459 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,49 +6,49 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 176 4 176 30. - Definition loc_3 : location_info := LocationInfo file_0 176 11 176 29. - Definition loc_4 : location_info := LocationInfo file_0 176 11 176 14. - Definition loc_5 : location_info := LocationInfo file_0 176 11 176 14. - Definition loc_6 : location_info := LocationInfo file_0 176 17 176 29. - Definition loc_7 : location_info := LocationInfo file_0 176 18 176 21. - Definition loc_8 : location_info := LocationInfo file_0 176 25 176 28. - Definition loc_11 : location_info := LocationInfo file_0 185 4 186 17. - Definition loc_12 : location_info := LocationInfo file_0 187 4 188 17. - Definition loc_13 : location_info := LocationInfo file_0 189 4 189 82. - Definition loc_14 : location_info := LocationInfo file_0 189 11 189 81. - Definition loc_15 : location_info := LocationInfo file_0 189 11 189 76. - Definition loc_16 : location_info := LocationInfo file_0 189 12 189 36. - Definition loc_17 : location_info := LocationInfo file_0 189 13 189 18. - Definition loc_18 : location_info := LocationInfo file_0 189 13 189 18. - Definition loc_19 : location_info := LocationInfo file_0 189 21 189 35. - Definition loc_20 : location_info := LocationInfo file_0 189 23 189 26. - Definition loc_21 : location_info := LocationInfo file_0 189 30 189 33. - Definition loc_22 : location_info := LocationInfo file_0 189 40 189 75. - Definition loc_23 : location_info := LocationInfo file_0 189 41 189 70. - Definition loc_24 : location_info := LocationInfo file_0 189 41 189 56. - Definition loc_25 : location_info := LocationInfo file_0 189 41 189 56. - Definition loc_26 : location_info := LocationInfo file_0 189 57 189 69. - Definition loc_27 : location_info := LocationInfo file_0 189 58 189 61. - Definition loc_28 : location_info := LocationInfo file_0 189 65 189 68. - Definition loc_29 : location_info := LocationInfo file_0 189 73 189 74. - Definition loc_30 : location_info := LocationInfo file_0 189 80 189 81. - Definition loc_31 : location_info := LocationInfo file_0 188 8 188 17. - Definition loc_32 : location_info := LocationInfo file_0 188 15 188 16. - Definition loc_34 : location_info := LocationInfo file_0 187 8 187 27. - Definition loc_36 : location_info := LocationInfo file_0 187 9 187 27. - Definition loc_37 : location_info := LocationInfo file_0 187 9 187 22. - Definition loc_38 : location_info := LocationInfo file_0 187 9 187 22. - Definition loc_39 : location_info := LocationInfo file_0 187 23 187 26. - Definition loc_40 : location_info := LocationInfo file_0 187 23 187 26. - Definition loc_41 : location_info := LocationInfo file_0 186 8 186 17. - Definition loc_42 : location_info := LocationInfo file_0 186 15 186 16. - Definition loc_44 : location_info := LocationInfo file_0 185 8 185 23. - Definition loc_45 : location_info := LocationInfo file_0 185 8 185 13. - Definition loc_46 : location_info := LocationInfo file_0 185 8 185 13. - Definition loc_47 : location_info := LocationInfo file_0 185 17 185 23. - Definition loc_48 : location_info := LocationInfo file_0 185 17 185 19. - Definition loc_49 : location_info := LocationInfo file_0 185 22 185 23. + Definition loc_2 : location_info := LocationInfo file_0 177 4 177 30. + Definition loc_3 : location_info := LocationInfo file_0 177 11 177 29. + Definition loc_4 : location_info := LocationInfo file_0 177 11 177 14. + Definition loc_5 : location_info := LocationInfo file_0 177 11 177 14. + Definition loc_6 : location_info := LocationInfo file_0 177 17 177 29. + Definition loc_7 : location_info := LocationInfo file_0 177 18 177 21. + Definition loc_8 : location_info := LocationInfo file_0 177 25 177 28. + Definition loc_11 : location_info := LocationInfo file_0 186 4 187 17. + Definition loc_12 : location_info := LocationInfo file_0 188 4 189 17. + Definition loc_13 : location_info := LocationInfo file_0 190 4 190 82. + Definition loc_14 : location_info := LocationInfo file_0 190 11 190 81. + Definition loc_15 : location_info := LocationInfo file_0 190 11 190 76. + Definition loc_16 : location_info := LocationInfo file_0 190 12 190 36. + Definition loc_17 : location_info := LocationInfo file_0 190 13 190 18. + Definition loc_18 : location_info := LocationInfo file_0 190 13 190 18. + Definition loc_19 : location_info := LocationInfo file_0 190 21 190 35. + Definition loc_20 : location_info := LocationInfo file_0 190 23 190 26. + Definition loc_21 : location_info := LocationInfo file_0 190 30 190 33. + Definition loc_22 : location_info := LocationInfo file_0 190 40 190 75. + Definition loc_23 : location_info := LocationInfo file_0 190 41 190 70. + Definition loc_24 : location_info := LocationInfo file_0 190 41 190 56. + Definition loc_25 : location_info := LocationInfo file_0 190 41 190 56. + Definition loc_26 : location_info := LocationInfo file_0 190 57 190 69. + Definition loc_27 : location_info := LocationInfo file_0 190 58 190 61. + Definition loc_28 : location_info := LocationInfo file_0 190 65 190 68. + Definition loc_29 : location_info := LocationInfo file_0 190 73 190 74. + Definition loc_30 : location_info := LocationInfo file_0 190 80 190 81. + Definition loc_31 : location_info := LocationInfo file_0 189 8 189 17. + Definition loc_32 : location_info := LocationInfo file_0 189 15 189 16. + Definition loc_34 : location_info := LocationInfo file_0 188 8 188 27. + Definition loc_36 : location_info := LocationInfo file_0 188 9 188 27. + Definition loc_37 : location_info := LocationInfo file_0 188 9 188 22. + Definition loc_38 : location_info := LocationInfo file_0 188 9 188 22. + Definition loc_39 : location_info := LocationInfo file_0 188 23 188 26. + Definition loc_40 : location_info := LocationInfo file_0 188 23 188 26. + Definition loc_41 : location_info := LocationInfo file_0 187 8 187 17. + Definition loc_42 : location_info := LocationInfo file_0 187 15 187 16. + Definition loc_44 : location_info := LocationInfo file_0 186 8 186 23. + Definition loc_45 : location_info := LocationInfo file_0 186 8 186 13. + Definition loc_46 : location_info := LocationInfo file_0 186 8 186 13. + Definition loc_47 : location_info := LocationInfo file_0 186 17 186 23. + Definition loc_48 : location_info := LocationInfo file_0 186 17 186 19. + Definition loc_49 : location_info := LocationInfo file_0 186 22 186 23. Definition loc_52 : location_info := LocationInfo file_0 199 4 199 26. Definition loc_53 : location_info := LocationInfo file_0 200 4 200 38. Definition loc_54 : location_info := LocationInfo file_0 200 5 200 12. @@ -65,469 +65,481 @@ Section code. Definition loc_65 : location_info := LocationInfo file_0 199 20 199 25. Definition loc_66 : location_info := LocationInfo file_0 199 21 199 25. Definition loc_67 : location_info := LocationInfo file_0 199 21 199 25. - Definition loc_72 : location_info := LocationInfo file_0 211 4 211 100. - Definition loc_73 : location_info := LocationInfo file_0 213 4 214 210. - Definition loc_74 : location_info := LocationInfo file_0 216 4 216 15. - Definition loc_75 : location_info := LocationInfo file_0 216 11 216 14. - Definition loc_76 : location_info := LocationInfo file_0 216 11 216 14. - Definition loc_77 : location_info := LocationInfo file_0 214 8 214 210. - Definition loc_78 : location_info := LocationInfo file_0 214 8 214 11. - Definition loc_79 : location_info := LocationInfo file_0 214 8 214 209. - Definition loc_80 : location_info := LocationInfo file_0 214 8 214 11. - Definition loc_81 : location_info := LocationInfo file_0 214 8 214 11. - Definition loc_82 : location_info := LocationInfo file_0 214 15 214 209. - Definition loc_83 : location_info := LocationInfo file_0 214 16 214 129. - Definition loc_84 : location_info := LocationInfo file_0 214 17 214 27. - Definition loc_85 : location_info := LocationInfo file_0 214 18 214 20. - Definition loc_86 : location_info := LocationInfo file_0 214 18 214 20. - Definition loc_87 : location_info := LocationInfo file_0 214 24 214 26. - Definition loc_88 : location_info := LocationInfo file_0 214 31 214 128. - Definition loc_89 : location_info := LocationInfo file_0 214 32 214 123. - Definition loc_90 : location_info := LocationInfo file_0 214 32 214 47. - Definition loc_91 : location_info := LocationInfo file_0 214 32 214 47. - Definition loc_92 : location_info := LocationInfo file_0 214 48 214 122. - Definition loc_93 : location_info := LocationInfo file_0 214 49 214 77. - Definition loc_94 : location_info := LocationInfo file_0 214 50 214 72. - Definition loc_95 : location_info := LocationInfo file_0 214 50 214 56. - Definition loc_96 : location_info := LocationInfo file_0 214 52 214 55. - Definition loc_97 : location_info := LocationInfo file_0 214 59 214 72. - Definition loc_98 : location_info := LocationInfo file_0 214 60 214 63. - Definition loc_99 : location_info := LocationInfo file_0 214 67 214 71. - Definition loc_100 : location_info := LocationInfo file_0 214 75 214 76. - Definition loc_101 : location_info := LocationInfo file_0 214 80 214 121. - Definition loc_102 : location_info := LocationInfo file_0 214 81 214 85. - Definition loc_103 : location_info := LocationInfo file_0 214 82 214 85. - Definition loc_104 : location_info := LocationInfo file_0 214 89 214 120. - Definition loc_105 : location_info := LocationInfo file_0 214 90 214 112. - Definition loc_106 : location_info := LocationInfo file_0 214 90 214 108. - Definition loc_107 : location_info := LocationInfo file_0 214 91 214 103. - Definition loc_108 : location_info := LocationInfo file_0 214 106 214 107. - Definition loc_109 : location_info := LocationInfo file_0 214 111 214 112. - Definition loc_110 : location_info := LocationInfo file_0 214 115 214 119. - Definition loc_111 : location_info := LocationInfo file_0 214 126 214 127. - Definition loc_112 : location_info := LocationInfo file_0 214 132 214 208. - Definition loc_113 : location_info := LocationInfo file_0 214 134 214 162. - Definition loc_114 : location_info := LocationInfo file_0 214 135 214 157. - Definition loc_115 : location_info := LocationInfo file_0 214 135 214 141. - Definition loc_116 : location_info := LocationInfo file_0 214 137 214 140. - Definition loc_117 : location_info := LocationInfo file_0 214 144 214 157. - Definition loc_118 : location_info := LocationInfo file_0 214 145 214 148. - Definition loc_119 : location_info := LocationInfo file_0 214 152 214 156. - Definition loc_120 : location_info := LocationInfo file_0 214 160 214 161. - Definition loc_121 : location_info := LocationInfo file_0 214 165 214 206. - Definition loc_122 : location_info := LocationInfo file_0 214 166 214 170. - Definition loc_123 : location_info := LocationInfo file_0 214 167 214 170. - Definition loc_124 : location_info := LocationInfo file_0 214 174 214 205. - Definition loc_125 : location_info := LocationInfo file_0 214 175 214 197. - Definition loc_126 : location_info := LocationInfo file_0 214 175 214 193. - Definition loc_127 : location_info := LocationInfo file_0 214 176 214 188. - Definition loc_128 : location_info := LocationInfo file_0 214 191 214 192. - Definition loc_129 : location_info := LocationInfo file_0 214 196 214 197. - Definition loc_130 : location_info := LocationInfo file_0 214 200 214 204. - Definition loc_132 : location_info := LocationInfo file_0 213 8 213 16. - Definition loc_133 : location_info := LocationInfo file_0 213 8 213 10. - Definition loc_134 : location_info := LocationInfo file_0 213 14 213 16. - Definition loc_135 : location_info := LocationInfo file_0 211 20 211 99. - Definition loc_136 : location_info := LocationInfo file_0 211 20 211 22. - Definition loc_137 : location_info := LocationInfo file_0 211 20 211 22. - Definition loc_138 : location_info := LocationInfo file_0 211 25 211 99. - Definition loc_139 : location_info := LocationInfo file_0 211 26 211 54. - Definition loc_140 : location_info := LocationInfo file_0 211 27 211 49. - Definition loc_141 : location_info := LocationInfo file_0 211 27 211 33. - Definition loc_142 : location_info := LocationInfo file_0 211 29 211 32. - Definition loc_143 : location_info := LocationInfo file_0 211 36 211 49. - Definition loc_144 : location_info := LocationInfo file_0 211 37 211 40. - Definition loc_145 : location_info := LocationInfo file_0 211 44 211 48. - Definition loc_146 : location_info := LocationInfo file_0 211 52 211 53. - Definition loc_147 : location_info := LocationInfo file_0 211 57 211 98. - Definition loc_148 : location_info := LocationInfo file_0 211 58 211 62. - Definition loc_149 : location_info := LocationInfo file_0 211 59 211 62. - Definition loc_150 : location_info := LocationInfo file_0 211 66 211 97. - Definition loc_151 : location_info := LocationInfo file_0 211 67 211 89. - Definition loc_152 : location_info := LocationInfo file_0 211 67 211 85. - Definition loc_153 : location_info := LocationInfo file_0 211 68 211 80. - Definition loc_154 : location_info := LocationInfo file_0 211 83 211 84. - Definition loc_155 : location_info := LocationInfo file_0 211 88 211 89. - Definition loc_156 : location_info := LocationInfo file_0 211 92 211 96. - Definition loc_161 : location_info := LocationInfo file_0 222 4 222 79. - Definition loc_162 : location_info := LocationInfo file_0 223 4 223 75. - Definition loc_163 : location_info := LocationInfo file_0 224 4 224 24. - Definition loc_164 : location_info := LocationInfo file_0 224 4 224 7. - Definition loc_165 : location_info := LocationInfo file_0 224 4 224 23. - Definition loc_166 : location_info := LocationInfo file_0 224 4 224 7. - Definition loc_167 : location_info := LocationInfo file_0 224 4 224 7. - Definition loc_168 : location_info := LocationInfo file_0 224 11 224 23. - Definition loc_169 : location_info := LocationInfo file_0 224 12 224 15. - Definition loc_170 : location_info := LocationInfo file_0 224 19 224 22. - Definition loc_171 : location_info := LocationInfo file_0 223 4 223 7. - Definition loc_172 : location_info := LocationInfo file_0 223 4 223 74. - Definition loc_173 : location_info := LocationInfo file_0 223 4 223 7. - Definition loc_174 : location_info := LocationInfo file_0 223 4 223 7. - Definition loc_175 : location_info := LocationInfo file_0 223 11 223 74. - Definition loc_176 : location_info := LocationInfo file_0 223 12 223 56. - Definition loc_177 : location_info := LocationInfo file_0 223 13 223 16. - Definition loc_178 : location_info := LocationInfo file_0 223 20 223 55. - Definition loc_179 : location_info := LocationInfo file_0 223 21 223 50. - Definition loc_180 : location_info := LocationInfo file_0 223 21 223 36. - Definition loc_181 : location_info := LocationInfo file_0 223 21 223 36. - Definition loc_182 : location_info := LocationInfo file_0 223 37 223 49. - Definition loc_183 : location_info := LocationInfo file_0 223 38 223 41. - Definition loc_184 : location_info := LocationInfo file_0 223 45 223 48. - Definition loc_185 : location_info := LocationInfo file_0 223 53 223 54. - Definition loc_186 : location_info := LocationInfo file_0 223 59 223 73. - Definition loc_187 : location_info := LocationInfo file_0 223 61 223 64. - Definition loc_188 : location_info := LocationInfo file_0 223 68 223 71. - Definition loc_189 : location_info := LocationInfo file_0 222 33 222 78. - Definition loc_190 : location_info := LocationInfo file_0 222 33 222 48. - Definition loc_191 : location_info := LocationInfo file_0 222 33 222 48. - Definition loc_192 : location_info := LocationInfo file_0 222 49 222 77. - Definition loc_193 : location_info := LocationInfo file_0 222 49 222 69. - Definition loc_194 : location_info := LocationInfo file_0 222 49 222 69. - Definition loc_195 : location_info := LocationInfo file_0 222 49 222 69. - Definition loc_196 : location_info := LocationInfo file_0 222 49 222 55. - Definition loc_197 : location_info := LocationInfo file_0 222 49 222 55. - Definition loc_198 : location_info := LocationInfo file_0 222 70 222 76. - Definition loc_199 : location_info := LocationInfo file_0 222 70 222 76. - Definition loc_202 : location_info := LocationInfo file_0 222 20 222 25. - Definition loc_203 : location_info := LocationInfo file_0 222 20 222 25. - Definition loc_204 : location_info := LocationInfo file_0 222 21 222 25. - Definition loc_205 : location_info := LocationInfo file_0 222 21 222 25. - Definition loc_210 : location_info := LocationInfo file_0 232 4 232 53. - Definition loc_211 : location_info := LocationInfo file_0 233 4 234 33. - Definition loc_212 : location_info := LocationInfo file_0 235 4 235 171. - Definition loc_213 : location_info := LocationInfo file_0 236 4 236 78. - Definition loc_214 : location_info := LocationInfo file_0 237 4 237 24. - Definition loc_215 : location_info := LocationInfo file_0 239 4 240 26. - Definition loc_216 : location_info := LocationInfo file_0 242 4 242 13. - Definition loc_217 : location_info := LocationInfo file_0 242 11 242 12. - Definition loc_218 : location_info := LocationInfo file_0 240 8 240 26. - Definition loc_219 : location_info := LocationInfo file_0 240 15 240 25. - Definition loc_220 : location_info := LocationInfo file_0 240 15 240 18. - Definition loc_221 : location_info := LocationInfo file_0 240 15 240 18. - Definition loc_222 : location_info := LocationInfo file_0 240 22 240 25. - Definition loc_223 : location_info := LocationInfo file_0 240 22 240 25. - Definition loc_225 : location_info := LocationInfo file_0 239 8 239 26. - Definition loc_226 : location_info := LocationInfo file_0 239 8 239 21. - Definition loc_227 : location_info := LocationInfo file_0 239 8 239 21. - Definition loc_228 : location_info := LocationInfo file_0 239 22 239 25. - Definition loc_229 : location_info := LocationInfo file_0 239 22 239 25. - Definition loc_230 : location_info := LocationInfo file_0 237 4 237 7. - Definition loc_231 : location_info := LocationInfo file_0 237 4 237 23. - Definition loc_232 : location_info := LocationInfo file_0 237 4 237 7. - Definition loc_233 : location_info := LocationInfo file_0 237 4 237 7. - Definition loc_234 : location_info := LocationInfo file_0 237 11 237 23. - Definition loc_235 : location_info := LocationInfo file_0 237 12 237 15. - Definition loc_236 : location_info := LocationInfo file_0 237 19 237 22. - Definition loc_237 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_238 : location_info := LocationInfo file_0 236 4 236 77. - Definition loc_239 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_240 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_241 : location_info := LocationInfo file_0 236 11 236 77. - Definition loc_242 : location_info := LocationInfo file_0 236 12 236 59. - Definition loc_243 : location_info := LocationInfo file_0 236 13 236 19. - Definition loc_244 : location_info := LocationInfo file_0 236 13 236 19. - Definition loc_245 : location_info := LocationInfo file_0 236 23 236 58. - Definition loc_246 : location_info := LocationInfo file_0 236 24 236 53. - Definition loc_247 : location_info := LocationInfo file_0 236 24 236 39. - Definition loc_248 : location_info := LocationInfo file_0 236 24 236 39. - Definition loc_249 : location_info := LocationInfo file_0 236 40 236 52. - Definition loc_250 : location_info := LocationInfo file_0 236 41 236 44. - Definition loc_251 : location_info := LocationInfo file_0 236 48 236 51. - Definition loc_252 : location_info := LocationInfo file_0 236 56 236 57. - Definition loc_253 : location_info := LocationInfo file_0 236 62 236 76. - Definition loc_254 : location_info := LocationInfo file_0 236 64 236 67. - Definition loc_255 : location_info := LocationInfo file_0 236 71 236 74. - Definition loc_256 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_257 : location_info := LocationInfo file_0 235 4 235 170. - Definition loc_258 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_259 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_260 : location_info := LocationInfo file_0 235 11 235 170. - Definition loc_261 : location_info := LocationInfo file_0 235 11 235 15. - Definition loc_262 : location_info := LocationInfo file_0 235 11 235 15. - Definition loc_263 : location_info := LocationInfo file_0 235 18 235 170. - Definition loc_264 : location_info := LocationInfo file_0 235 19 235 92. - Definition loc_265 : location_info := LocationInfo file_0 235 20 235 47. - Definition loc_266 : location_info := LocationInfo file_0 235 21 235 42. - Definition loc_267 : location_info := LocationInfo file_0 235 21 235 27. - Definition loc_268 : location_info := LocationInfo file_0 235 23 235 26. - Definition loc_269 : location_info := LocationInfo file_0 235 30 235 42. - Definition loc_270 : location_info := LocationInfo file_0 235 31 235 34. - Definition loc_271 : location_info := LocationInfo file_0 235 38 235 41. - Definition loc_272 : location_info := LocationInfo file_0 235 45 235 46. - Definition loc_273 : location_info := LocationInfo file_0 235 50 235 91. - Definition loc_274 : location_info := LocationInfo file_0 235 51 235 55. - Definition loc_275 : location_info := LocationInfo file_0 235 52 235 55. - Definition loc_276 : location_info := LocationInfo file_0 235 59 235 90. - Definition loc_277 : location_info := LocationInfo file_0 235 60 235 82. - Definition loc_278 : location_info := LocationInfo file_0 235 60 235 78. - Definition loc_279 : location_info := LocationInfo file_0 235 61 235 73. - Definition loc_280 : location_info := LocationInfo file_0 235 76 235 77. - Definition loc_281 : location_info := LocationInfo file_0 235 81 235 82. - Definition loc_282 : location_info := LocationInfo file_0 235 85 235 89. - Definition loc_283 : location_info := LocationInfo file_0 235 95 235 169. - Definition loc_284 : location_info := LocationInfo file_0 235 96 235 124. - Definition loc_285 : location_info := LocationInfo file_0 235 97 235 119. - Definition loc_286 : location_info := LocationInfo file_0 235 97 235 103. - Definition loc_287 : location_info := LocationInfo file_0 235 99 235 102. - Definition loc_288 : location_info := LocationInfo file_0 235 106 235 119. - Definition loc_289 : location_info := LocationInfo file_0 235 107 235 110. - Definition loc_290 : location_info := LocationInfo file_0 235 114 235 118. - Definition loc_291 : location_info := LocationInfo file_0 235 122 235 123. - Definition loc_292 : location_info := LocationInfo file_0 235 127 235 168. - Definition loc_293 : location_info := LocationInfo file_0 235 128 235 132. - Definition loc_294 : location_info := LocationInfo file_0 235 129 235 132. - Definition loc_295 : location_info := LocationInfo file_0 235 136 235 167. - Definition loc_296 : location_info := LocationInfo file_0 235 137 235 159. - Definition loc_297 : location_info := LocationInfo file_0 235 137 235 155. - Definition loc_298 : location_info := LocationInfo file_0 235 138 235 150. - Definition loc_299 : location_info := LocationInfo file_0 235 153 235 154. - Definition loc_300 : location_info := LocationInfo file_0 235 158 235 159. - Definition loc_301 : location_info := LocationInfo file_0 235 162 235 166. - Definition loc_302 : location_info := LocationInfo file_0 233 15 234 32. - Definition loc_303 : location_info := LocationInfo file_0 233 15 233 32. - Definition loc_304 : location_info := LocationInfo file_0 233 16 233 21. - Definition loc_305 : location_info := LocationInfo file_0 233 16 233 21. - Definition loc_306 : location_info := LocationInfo file_0 233 25 233 31. - Definition loc_307 : location_info := LocationInfo file_0 233 25 233 27. - Definition loc_308 : location_info := LocationInfo file_0 233 30 233 31. - Definition loc_309 : location_info := LocationInfo file_0 233 35 233 36. - Definition loc_310 : location_info := LocationInfo file_0 234 31 234 32. - Definition loc_313 : location_info := LocationInfo file_0 232 33 232 52. - Definition loc_314 : location_info := LocationInfo file_0 232 33 232 48. - Definition loc_315 : location_info := LocationInfo file_0 232 33 232 48. - Definition loc_316 : location_info := LocationInfo file_0 232 49 232 51. - Definition loc_317 : location_info := LocationInfo file_0 232 49 232 51. - Definition loc_320 : location_info := LocationInfo file_0 232 20 232 25. - Definition loc_321 : location_info := LocationInfo file_0 232 20 232 25. - Definition loc_322 : location_info := LocationInfo file_0 232 21 232 25. - Definition loc_323 : location_info := LocationInfo file_0 232 21 232 25. - Definition loc_328 : location_info := LocationInfo file_0 254 4 254 50. - Definition loc_329 : location_info := LocationInfo file_0 255 4 255 31. - Definition loc_330 : location_info := LocationInfo file_0 256 4 256 209. - Definition loc_331 : location_info := LocationInfo file_0 257 4 257 15. - Definition loc_332 : location_info := LocationInfo file_0 258 4 259 29. - Definition loc_333 : location_info := LocationInfo file_0 260 4 261 19. - Definition loc_334 : location_info := LocationInfo file_0 262 4 269 5. - Definition loc_335 : location_info := LocationInfo file_0 270 4 270 197. - Definition loc_336 : location_info := LocationInfo file_0 271 4 271 197. - Definition loc_337 : location_info := LocationInfo file_0 272 4 272 26. - Definition loc_338 : location_info := LocationInfo file_0 273 4 273 22. - Definition loc_339 : location_info := LocationInfo file_0 274 4 274 13. - Definition loc_340 : location_info := LocationInfo file_0 274 11 274 12. - Definition loc_341 : location_info := LocationInfo file_0 273 4 273 14. - Definition loc_342 : location_info := LocationInfo file_0 273 4 273 8. - Definition loc_343 : location_info := LocationInfo file_0 273 4 273 8. - Definition loc_344 : location_info := LocationInfo file_0 273 17 273 21. - Definition loc_345 : location_info := LocationInfo file_0 273 17 273 21. - Definition loc_346 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_347 : location_info := LocationInfo file_0 272 4 272 25. - Definition loc_348 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_349 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_350 : location_info := LocationInfo file_0 272 12 272 25. - Definition loc_351 : location_info := LocationInfo file_0 272 13 272 16. - Definition loc_352 : location_info := LocationInfo file_0 272 20 272 24. - Definition loc_353 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_354 : location_info := LocationInfo file_0 271 4 271 196. - Definition loc_355 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_356 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_357 : location_info := LocationInfo file_0 271 12 271 196. - Definition loc_358 : location_info := LocationInfo file_0 271 13 271 118. - Definition loc_359 : location_info := LocationInfo file_0 271 14 271 18. - Definition loc_360 : location_info := LocationInfo file_0 271 14 271 18. - Definition loc_361 : location_info := LocationInfo file_0 271 22 271 117. - Definition loc_362 : location_info := LocationInfo file_0 271 23 271 112. - Definition loc_363 : location_info := LocationInfo file_0 271 23 271 38. - Definition loc_364 : location_info := LocationInfo file_0 271 23 271 38. - Definition loc_365 : location_info := LocationInfo file_0 271 39 271 111. - Definition loc_366 : location_info := LocationInfo file_0 271 40 271 67. - Definition loc_367 : location_info := LocationInfo file_0 271 41 271 62. - Definition loc_368 : location_info := LocationInfo file_0 271 41 271 47. - Definition loc_369 : location_info := LocationInfo file_0 271 43 271 46. - Definition loc_370 : location_info := LocationInfo file_0 271 50 271 62. - Definition loc_371 : location_info := LocationInfo file_0 271 51 271 54. - Definition loc_372 : location_info := LocationInfo file_0 271 58 271 61. - Definition loc_373 : location_info := LocationInfo file_0 271 65 271 66. - Definition loc_374 : location_info := LocationInfo file_0 271 70 271 110. - Definition loc_375 : location_info := LocationInfo file_0 271 71 271 75. - Definition loc_376 : location_info := LocationInfo file_0 271 72 271 75. - Definition loc_377 : location_info := LocationInfo file_0 271 79 271 109. - Definition loc_378 : location_info := LocationInfo file_0 271 80 271 102. - Definition loc_379 : location_info := LocationInfo file_0 271 80 271 98. - Definition loc_380 : location_info := LocationInfo file_0 271 81 271 93. - Definition loc_381 : location_info := LocationInfo file_0 271 96 271 97. - Definition loc_382 : location_info := LocationInfo file_0 271 101 271 102. - Definition loc_383 : location_info := LocationInfo file_0 271 105 271 108. - Definition loc_384 : location_info := LocationInfo file_0 271 115 271 116. - Definition loc_385 : location_info := LocationInfo file_0 271 121 271 195. - Definition loc_386 : location_info := LocationInfo file_0 271 123 271 150. - Definition loc_387 : location_info := LocationInfo file_0 271 124 271 145. - Definition loc_388 : location_info := LocationInfo file_0 271 124 271 130. - Definition loc_389 : location_info := LocationInfo file_0 271 126 271 129. - Definition loc_390 : location_info := LocationInfo file_0 271 133 271 145. - Definition loc_391 : location_info := LocationInfo file_0 271 134 271 137. - Definition loc_392 : location_info := LocationInfo file_0 271 141 271 144. - Definition loc_393 : location_info := LocationInfo file_0 271 148 271 149. - Definition loc_394 : location_info := LocationInfo file_0 271 153 271 193. - Definition loc_395 : location_info := LocationInfo file_0 271 154 271 158. - Definition loc_396 : location_info := LocationInfo file_0 271 155 271 158. - Definition loc_397 : location_info := LocationInfo file_0 271 162 271 192. - Definition loc_398 : location_info := LocationInfo file_0 271 163 271 185. - Definition loc_399 : location_info := LocationInfo file_0 271 163 271 181. - Definition loc_400 : location_info := LocationInfo file_0 271 164 271 176. - Definition loc_401 : location_info := LocationInfo file_0 271 179 271 180. - Definition loc_402 : location_info := LocationInfo file_0 271 184 271 185. - Definition loc_403 : location_info := LocationInfo file_0 271 188 271 191. - Definition loc_404 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_405 : location_info := LocationInfo file_0 270 4 270 196. - Definition loc_406 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_407 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_408 : location_info := LocationInfo file_0 270 12 270 196. - Definition loc_409 : location_info := LocationInfo file_0 270 13 270 118. - Definition loc_410 : location_info := LocationInfo file_0 270 14 270 18. - Definition loc_411 : location_info := LocationInfo file_0 270 14 270 18. - Definition loc_412 : location_info := LocationInfo file_0 270 22 270 117. - Definition loc_413 : location_info := LocationInfo file_0 270 23 270 112. - Definition loc_414 : location_info := LocationInfo file_0 270 23 270 38. - Definition loc_415 : location_info := LocationInfo file_0 270 23 270 38. - Definition loc_416 : location_info := LocationInfo file_0 270 39 270 111. - Definition loc_417 : location_info := LocationInfo file_0 270 40 270 67. - Definition loc_418 : location_info := LocationInfo file_0 270 41 270 62. - Definition loc_419 : location_info := LocationInfo file_0 270 41 270 47. - Definition loc_420 : location_info := LocationInfo file_0 270 43 270 46. - Definition loc_421 : location_info := LocationInfo file_0 270 50 270 62. - Definition loc_422 : location_info := LocationInfo file_0 270 51 270 54. - Definition loc_423 : location_info := LocationInfo file_0 270 58 270 61. - Definition loc_424 : location_info := LocationInfo file_0 270 65 270 66. - Definition loc_425 : location_info := LocationInfo file_0 270 70 270 110. - Definition loc_426 : location_info := LocationInfo file_0 270 71 270 75. - Definition loc_427 : location_info := LocationInfo file_0 270 72 270 75. - Definition loc_428 : location_info := LocationInfo file_0 270 79 270 109. - Definition loc_429 : location_info := LocationInfo file_0 270 80 270 102. - Definition loc_430 : location_info := LocationInfo file_0 270 80 270 98. - Definition loc_431 : location_info := LocationInfo file_0 270 81 270 93. - Definition loc_432 : location_info := LocationInfo file_0 270 96 270 97. - Definition loc_433 : location_info := LocationInfo file_0 270 101 270 102. - Definition loc_434 : location_info := LocationInfo file_0 270 105 270 108. - Definition loc_435 : location_info := LocationInfo file_0 270 115 270 116. - Definition loc_436 : location_info := LocationInfo file_0 270 121 270 195. - Definition loc_437 : location_info := LocationInfo file_0 270 123 270 150. - Definition loc_438 : location_info := LocationInfo file_0 270 124 270 145. - Definition loc_439 : location_info := LocationInfo file_0 270 124 270 130. - Definition loc_440 : location_info := LocationInfo file_0 270 126 270 129. - Definition loc_441 : location_info := LocationInfo file_0 270 133 270 145. - Definition loc_442 : location_info := LocationInfo file_0 270 134 270 137. - Definition loc_443 : location_info := LocationInfo file_0 270 141 270 144. - Definition loc_444 : location_info := LocationInfo file_0 270 148 270 149. - Definition loc_445 : location_info := LocationInfo file_0 270 153 270 193. - Definition loc_446 : location_info := LocationInfo file_0 270 154 270 158. - Definition loc_447 : location_info := LocationInfo file_0 270 155 270 158. - Definition loc_448 : location_info := LocationInfo file_0 270 162 270 192. - Definition loc_449 : location_info := LocationInfo file_0 270 163 270 185. - Definition loc_450 : location_info := LocationInfo file_0 270 163 270 181. - Definition loc_451 : location_info := LocationInfo file_0 270 164 270 176. - Definition loc_452 : location_info := LocationInfo file_0 270 179 270 180. - Definition loc_453 : location_info := LocationInfo file_0 270 184 270 185. - Definition loc_454 : location_info := LocationInfo file_0 270 188 270 191. - Definition loc_455 : location_info := LocationInfo file_0 262 35 267 5. - Definition loc_456 : location_info := LocationInfo file_0 263 8 264 23. - Definition loc_457 : location_info := LocationInfo file_0 265 8 266 23. - Definition loc_458 : location_info := LocationInfo file_0 266 12 266 23. - Definition loc_459 : location_info := LocationInfo file_0 266 19 266 22. - Definition loc_460 : location_info := LocationInfo file_0 266 20 266 22. - Definition loc_462 : location_info := LocationInfo file_0 265 12 265 18. - Definition loc_463 : location_info := LocationInfo file_0 265 12 265 18. - Definition loc_464 : location_info := LocationInfo file_0 264 12 264 23. - Definition loc_465 : location_info := LocationInfo file_0 264 19 264 22. - Definition loc_466 : location_info := LocationInfo file_0 264 20 264 22. - Definition loc_468 : location_info := LocationInfo file_0 263 12 263 37. - Definition loc_469 : location_info := LocationInfo file_0 263 12 263 16. - Definition loc_470 : location_info := LocationInfo file_0 263 12 263 16. - Definition loc_471 : location_info := LocationInfo file_0 263 19 263 37. - Definition loc_472 : location_info := LocationInfo file_0 267 11 269 5. - Definition loc_473 : location_info := LocationInfo file_0 268 8 268 30. - Definition loc_474 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_475 : location_info := LocationInfo file_0 268 8 268 29. - Definition loc_476 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_477 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_478 : location_info := LocationInfo file_0 268 16 268 29. - Definition loc_479 : location_info := LocationInfo file_0 268 17 268 20. - Definition loc_480 : location_info := LocationInfo file_0 268 24 268 28. - Definition loc_481 : location_info := LocationInfo file_0 262 8 262 33. - Definition loc_482 : location_info := LocationInfo file_0 262 8 262 12. - Definition loc_483 : location_info := LocationInfo file_0 262 8 262 12. - Definition loc_484 : location_info := LocationInfo file_0 262 15 262 33. - Definition loc_485 : location_info := LocationInfo file_0 261 8 261 19. - Definition loc_486 : location_info := LocationInfo file_0 261 15 261 18. - Definition loc_487 : location_info := LocationInfo file_0 261 16 261 18. - Definition loc_489 : location_info := LocationInfo file_0 260 8 260 36. - Definition loc_491 : location_info := LocationInfo file_0 260 9 260 36. - Definition loc_492 : location_info := LocationInfo file_0 260 10 260 14. - Definition loc_493 : location_info := LocationInfo file_0 260 10 260 14. - Definition loc_494 : location_info := LocationInfo file_0 260 17 260 35. - Definition loc_495 : location_info := LocationInfo file_0 258 13 259 28. - Definition loc_496 : location_info := LocationInfo file_0 258 13 258 40. - Definition loc_497 : location_info := LocationInfo file_0 258 14 258 18. - Definition loc_498 : location_info := LocationInfo file_0 258 14 258 18. - Definition loc_499 : location_info := LocationInfo file_0 258 21 258 39. - Definition loc_500 : location_info := LocationInfo file_0 258 43 258 44. - Definition loc_501 : location_info := LocationInfo file_0 259 27 259 28. - Definition loc_504 : location_info := LocationInfo file_0 257 13 257 14. - Definition loc_507 : location_info := LocationInfo file_0 256 21 256 208. - Definition loc_508 : location_info := LocationInfo file_0 256 22 256 130. - Definition loc_509 : location_info := LocationInfo file_0 256 23 256 30. - Definition loc_510 : location_info := LocationInfo file_0 256 23 256 30. - Definition loc_511 : location_info := LocationInfo file_0 256 34 256 129. - Definition loc_512 : location_info := LocationInfo file_0 256 35 256 124. - Definition loc_513 : location_info := LocationInfo file_0 256 35 256 50. - Definition loc_514 : location_info := LocationInfo file_0 256 35 256 50. - Definition loc_515 : location_info := LocationInfo file_0 256 51 256 123. - Definition loc_516 : location_info := LocationInfo file_0 256 52 256 79. - Definition loc_517 : location_info := LocationInfo file_0 256 53 256 74. - Definition loc_518 : location_info := LocationInfo file_0 256 53 256 59. - Definition loc_519 : location_info := LocationInfo file_0 256 55 256 58. - Definition loc_520 : location_info := LocationInfo file_0 256 62 256 74. - Definition loc_521 : location_info := LocationInfo file_0 256 63 256 66. - Definition loc_522 : location_info := LocationInfo file_0 256 70 256 73. - Definition loc_523 : location_info := LocationInfo file_0 256 77 256 78. - Definition loc_524 : location_info := LocationInfo file_0 256 82 256 122. - Definition loc_525 : location_info := LocationInfo file_0 256 83 256 87. - Definition loc_526 : location_info := LocationInfo file_0 256 84 256 87. - Definition loc_527 : location_info := LocationInfo file_0 256 91 256 121. - Definition loc_528 : location_info := LocationInfo file_0 256 92 256 114. - Definition loc_529 : location_info := LocationInfo file_0 256 92 256 110. - Definition loc_530 : location_info := LocationInfo file_0 256 93 256 105. - Definition loc_531 : location_info := LocationInfo file_0 256 108 256 109. - Definition loc_532 : location_info := LocationInfo file_0 256 113 256 114. - Definition loc_533 : location_info := LocationInfo file_0 256 117 256 120. - Definition loc_534 : location_info := LocationInfo file_0 256 127 256 128. - Definition loc_535 : location_info := LocationInfo file_0 256 133 256 207. - Definition loc_536 : location_info := LocationInfo file_0 256 135 256 162. - Definition loc_537 : location_info := LocationInfo file_0 256 136 256 157. - Definition loc_538 : location_info := LocationInfo file_0 256 136 256 142. - Definition loc_539 : location_info := LocationInfo file_0 256 138 256 141. - Definition loc_540 : location_info := LocationInfo file_0 256 145 256 157. - Definition loc_541 : location_info := LocationInfo file_0 256 146 256 149. - Definition loc_542 : location_info := LocationInfo file_0 256 153 256 156. - Definition loc_543 : location_info := LocationInfo file_0 256 160 256 161. - Definition loc_544 : location_info := LocationInfo file_0 256 165 256 205. - Definition loc_545 : location_info := LocationInfo file_0 256 166 256 170. - Definition loc_546 : location_info := LocationInfo file_0 256 167 256 170. - Definition loc_547 : location_info := LocationInfo file_0 256 174 256 204. - Definition loc_548 : location_info := LocationInfo file_0 256 175 256 197. - Definition loc_549 : location_info := LocationInfo file_0 256 175 256 193. - Definition loc_550 : location_info := LocationInfo file_0 256 176 256 188. - Definition loc_551 : location_info := LocationInfo file_0 256 191 256 192. - Definition loc_552 : location_info := LocationInfo file_0 256 196 256 197. - Definition loc_553 : location_info := LocationInfo file_0 256 200 256 203. - Definition loc_556 : location_info := LocationInfo file_0 255 16 255 30. - Definition loc_557 : location_info := LocationInfo file_0 255 16 255 22. - Definition loc_558 : location_info := LocationInfo file_0 255 16 255 22. - Definition loc_559 : location_info := LocationInfo file_0 255 25 255 26. - Definition loc_560 : location_info := LocationInfo file_0 255 29 255 30. - Definition loc_563 : location_info := LocationInfo file_0 254 19 254 49. - Definition loc_564 : location_info := LocationInfo file_0 254 19 254 23. - Definition loc_565 : location_info := LocationInfo file_0 254 19 254 23. - Definition loc_566 : location_info := LocationInfo file_0 254 26 254 49. + Definition loc_72 : location_info := LocationInfo file_0 209 4 209 100. + Definition loc_73 : location_info := LocationInfo file_0 211 4 212 210. + Definition loc_74 : location_info := LocationInfo file_0 214 4 214 15. + Definition loc_75 : location_info := LocationInfo file_0 214 11 214 14. + Definition loc_76 : location_info := LocationInfo file_0 214 11 214 14. + Definition loc_77 : location_info := LocationInfo file_0 212 8 212 210. + Definition loc_78 : location_info := LocationInfo file_0 212 8 212 11. + Definition loc_79 : location_info := LocationInfo file_0 212 8 212 209. + Definition loc_80 : location_info := LocationInfo file_0 212 8 212 11. + Definition loc_81 : location_info := LocationInfo file_0 212 8 212 11. + Definition loc_82 : location_info := LocationInfo file_0 212 15 212 209. + Definition loc_83 : location_info := LocationInfo file_0 212 16 212 129. + Definition loc_84 : location_info := LocationInfo file_0 212 17 212 27. + Definition loc_85 : location_info := LocationInfo file_0 212 18 212 20. + Definition loc_86 : location_info := LocationInfo file_0 212 18 212 20. + Definition loc_87 : location_info := LocationInfo file_0 212 24 212 26. + Definition loc_88 : location_info := LocationInfo file_0 212 31 212 128. + Definition loc_89 : location_info := LocationInfo file_0 212 32 212 123. + Definition loc_90 : location_info := LocationInfo file_0 212 32 212 47. + Definition loc_91 : location_info := LocationInfo file_0 212 32 212 47. + Definition loc_92 : location_info := LocationInfo file_0 212 48 212 122. + Definition loc_93 : location_info := LocationInfo file_0 212 49 212 77. + Definition loc_94 : location_info := LocationInfo file_0 212 50 212 72. + Definition loc_95 : location_info := LocationInfo file_0 212 50 212 56. + Definition loc_96 : location_info := LocationInfo file_0 212 52 212 55. + Definition loc_97 : location_info := LocationInfo file_0 212 59 212 72. + Definition loc_98 : location_info := LocationInfo file_0 212 60 212 63. + Definition loc_99 : location_info := LocationInfo file_0 212 67 212 71. + Definition loc_100 : location_info := LocationInfo file_0 212 75 212 76. + Definition loc_101 : location_info := LocationInfo file_0 212 80 212 121. + Definition loc_102 : location_info := LocationInfo file_0 212 81 212 85. + Definition loc_103 : location_info := LocationInfo file_0 212 82 212 85. + Definition loc_104 : location_info := LocationInfo file_0 212 89 212 120. + Definition loc_105 : location_info := LocationInfo file_0 212 90 212 112. + Definition loc_106 : location_info := LocationInfo file_0 212 90 212 108. + Definition loc_107 : location_info := LocationInfo file_0 212 91 212 103. + Definition loc_108 : location_info := LocationInfo file_0 212 106 212 107. + Definition loc_109 : location_info := LocationInfo file_0 212 111 212 112. + Definition loc_110 : location_info := LocationInfo file_0 212 115 212 119. + Definition loc_111 : location_info := LocationInfo file_0 212 126 212 127. + Definition loc_112 : location_info := LocationInfo file_0 212 132 212 208. + Definition loc_113 : location_info := LocationInfo file_0 212 134 212 162. + Definition loc_114 : location_info := LocationInfo file_0 212 135 212 157. + Definition loc_115 : location_info := LocationInfo file_0 212 135 212 141. + Definition loc_116 : location_info := LocationInfo file_0 212 137 212 140. + Definition loc_117 : location_info := LocationInfo file_0 212 144 212 157. + Definition loc_118 : location_info := LocationInfo file_0 212 145 212 148. + Definition loc_119 : location_info := LocationInfo file_0 212 152 212 156. + Definition loc_120 : location_info := LocationInfo file_0 212 160 212 161. + Definition loc_121 : location_info := LocationInfo file_0 212 165 212 206. + Definition loc_122 : location_info := LocationInfo file_0 212 166 212 170. + Definition loc_123 : location_info := LocationInfo file_0 212 167 212 170. + Definition loc_124 : location_info := LocationInfo file_0 212 174 212 205. + Definition loc_125 : location_info := LocationInfo file_0 212 175 212 197. + Definition loc_126 : location_info := LocationInfo file_0 212 175 212 193. + Definition loc_127 : location_info := LocationInfo file_0 212 176 212 188. + Definition loc_128 : location_info := LocationInfo file_0 212 191 212 192. + Definition loc_129 : location_info := LocationInfo file_0 212 196 212 197. + Definition loc_130 : location_info := LocationInfo file_0 212 200 212 204. + Definition loc_132 : location_info := LocationInfo file_0 211 8 211 16. + Definition loc_133 : location_info := LocationInfo file_0 211 8 211 10. + Definition loc_134 : location_info := LocationInfo file_0 211 14 211 16. + Definition loc_135 : location_info := LocationInfo file_0 209 20 209 99. + Definition loc_136 : location_info := LocationInfo file_0 209 20 209 22. + Definition loc_137 : location_info := LocationInfo file_0 209 20 209 22. + Definition loc_138 : location_info := LocationInfo file_0 209 25 209 99. + Definition loc_139 : location_info := LocationInfo file_0 209 26 209 54. + Definition loc_140 : location_info := LocationInfo file_0 209 27 209 49. + Definition loc_141 : location_info := LocationInfo file_0 209 27 209 33. + Definition loc_142 : location_info := LocationInfo file_0 209 29 209 32. + Definition loc_143 : location_info := LocationInfo file_0 209 36 209 49. + Definition loc_144 : location_info := LocationInfo file_0 209 37 209 40. + Definition loc_145 : location_info := LocationInfo file_0 209 44 209 48. + Definition loc_146 : location_info := LocationInfo file_0 209 52 209 53. + Definition loc_147 : location_info := LocationInfo file_0 209 57 209 98. + Definition loc_148 : location_info := LocationInfo file_0 209 58 209 62. + Definition loc_149 : location_info := LocationInfo file_0 209 59 209 62. + Definition loc_150 : location_info := LocationInfo file_0 209 66 209 97. + Definition loc_151 : location_info := LocationInfo file_0 209 67 209 89. + Definition loc_152 : location_info := LocationInfo file_0 209 67 209 85. + Definition loc_153 : location_info := LocationInfo file_0 209 68 209 80. + Definition loc_154 : location_info := LocationInfo file_0 209 83 209 84. + Definition loc_155 : location_info := LocationInfo file_0 209 88 209 89. + Definition loc_156 : location_info := LocationInfo file_0 209 92 209 96. + Definition loc_161 : location_info := LocationInfo file_0 220 4 220 79. + Definition loc_162 : location_info := LocationInfo file_0 221 4 221 75. + Definition loc_163 : location_info := LocationInfo file_0 222 4 222 24. + Definition loc_164 : location_info := LocationInfo file_0 225 1 225 13. + Definition loc_165 : location_info := LocationInfo file_0 225 1 225 6. + Definition loc_166 : location_info := LocationInfo file_0 225 2 225 6. + Definition loc_167 : location_info := LocationInfo file_0 225 2 225 6. + Definition loc_168 : location_info := LocationInfo file_0 225 9 225 12. + Definition loc_169 : location_info := LocationInfo file_0 225 9 225 12. + Definition loc_170 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_171 : location_info := LocationInfo file_0 222 4 222 23. + Definition loc_172 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_173 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_174 : location_info := LocationInfo file_0 222 11 222 23. + Definition loc_175 : location_info := LocationInfo file_0 222 12 222 15. + Definition loc_176 : location_info := LocationInfo file_0 222 19 222 22. + Definition loc_177 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_178 : location_info := LocationInfo file_0 221 4 221 74. + Definition loc_179 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_180 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_181 : location_info := LocationInfo file_0 221 11 221 74. + Definition loc_182 : location_info := LocationInfo file_0 221 12 221 56. + Definition loc_183 : location_info := LocationInfo file_0 221 13 221 16. + Definition loc_184 : location_info := LocationInfo file_0 221 20 221 55. + Definition loc_185 : location_info := LocationInfo file_0 221 21 221 50. + Definition loc_186 : location_info := LocationInfo file_0 221 21 221 36. + Definition loc_187 : location_info := LocationInfo file_0 221 21 221 36. + Definition loc_188 : location_info := LocationInfo file_0 221 37 221 49. + Definition loc_189 : location_info := LocationInfo file_0 221 38 221 41. + Definition loc_190 : location_info := LocationInfo file_0 221 45 221 48. + Definition loc_191 : location_info := LocationInfo file_0 221 53 221 54. + Definition loc_192 : location_info := LocationInfo file_0 221 59 221 73. + Definition loc_193 : location_info := LocationInfo file_0 221 61 221 64. + Definition loc_194 : location_info := LocationInfo file_0 221 68 221 71. + Definition loc_195 : location_info := LocationInfo file_0 220 33 220 78. + Definition loc_196 : location_info := LocationInfo file_0 220 33 220 48. + Definition loc_197 : location_info := LocationInfo file_0 220 33 220 48. + Definition loc_198 : location_info := LocationInfo file_0 220 49 220 77. + Definition loc_199 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_200 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_201 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_202 : location_info := LocationInfo file_0 220 49 220 55. + Definition loc_203 : location_info := LocationInfo file_0 220 49 220 55. + Definition loc_204 : location_info := LocationInfo file_0 220 70 220 76. + Definition loc_205 : location_info := LocationInfo file_0 220 70 220 76. + Definition loc_208 : location_info := LocationInfo file_0 220 20 220 25. + Definition loc_209 : location_info := LocationInfo file_0 220 20 220 25. + Definition loc_210 : location_info := LocationInfo file_0 220 21 220 25. + Definition loc_211 : location_info := LocationInfo file_0 220 21 220 25. + Definition loc_216 : location_info := LocationInfo file_0 231 4 231 53. + Definition loc_217 : location_info := LocationInfo file_0 232 4 233 33. + Definition loc_218 : location_info := LocationInfo file_0 234 4 234 171. + Definition loc_219 : location_info := LocationInfo file_0 235 4 235 78. + Definition loc_220 : location_info := LocationInfo file_0 236 4 236 24. + Definition loc_221 : location_info := LocationInfo file_0 238 4 239 26. + Definition loc_222 : location_info := LocationInfo file_0 241 1 241 13. + Definition loc_223 : location_info := LocationInfo file_0 242 4 242 13. + Definition loc_224 : location_info := LocationInfo file_0 242 11 242 12. + Definition loc_225 : location_info := LocationInfo file_0 241 1 241 6. + Definition loc_226 : location_info := LocationInfo file_0 241 2 241 6. + Definition loc_227 : location_info := LocationInfo file_0 241 2 241 6. + Definition loc_228 : location_info := LocationInfo file_0 241 9 241 12. + Definition loc_229 : location_info := LocationInfo file_0 241 9 241 12. + Definition loc_230 : location_info := LocationInfo file_0 239 8 239 26. + Definition loc_231 : location_info := LocationInfo file_0 239 15 239 25. + Definition loc_232 : location_info := LocationInfo file_0 239 15 239 18. + Definition loc_233 : location_info := LocationInfo file_0 239 15 239 18. + Definition loc_234 : location_info := LocationInfo file_0 239 22 239 25. + Definition loc_235 : location_info := LocationInfo file_0 239 22 239 25. + Definition loc_237 : location_info := LocationInfo file_0 238 8 238 26. + Definition loc_238 : location_info := LocationInfo file_0 238 8 238 21. + Definition loc_239 : location_info := LocationInfo file_0 238 8 238 21. + Definition loc_240 : location_info := LocationInfo file_0 238 22 238 25. + Definition loc_241 : location_info := LocationInfo file_0 238 22 238 25. + Definition loc_242 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_243 : location_info := LocationInfo file_0 236 4 236 23. + Definition loc_244 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_245 : location_info := LocationInfo file_0 236 4 236 7. + Definition loc_246 : location_info := LocationInfo file_0 236 11 236 23. + Definition loc_247 : location_info := LocationInfo file_0 236 12 236 15. + Definition loc_248 : location_info := LocationInfo file_0 236 19 236 22. + Definition loc_249 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_250 : location_info := LocationInfo file_0 235 4 235 77. + Definition loc_251 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_252 : location_info := LocationInfo file_0 235 4 235 7. + Definition loc_253 : location_info := LocationInfo file_0 235 11 235 77. + Definition loc_254 : location_info := LocationInfo file_0 235 12 235 59. + Definition loc_255 : location_info := LocationInfo file_0 235 13 235 19. + Definition loc_256 : location_info := LocationInfo file_0 235 13 235 19. + Definition loc_257 : location_info := LocationInfo file_0 235 23 235 58. + Definition loc_258 : location_info := LocationInfo file_0 235 24 235 53. + Definition loc_259 : location_info := LocationInfo file_0 235 24 235 39. + Definition loc_260 : location_info := LocationInfo file_0 235 24 235 39. + Definition loc_261 : location_info := LocationInfo file_0 235 40 235 52. + Definition loc_262 : location_info := LocationInfo file_0 235 41 235 44. + Definition loc_263 : location_info := LocationInfo file_0 235 48 235 51. + Definition loc_264 : location_info := LocationInfo file_0 235 56 235 57. + Definition loc_265 : location_info := LocationInfo file_0 235 62 235 76. + Definition loc_266 : location_info := LocationInfo file_0 235 64 235 67. + Definition loc_267 : location_info := LocationInfo file_0 235 71 235 74. + Definition loc_268 : location_info := LocationInfo file_0 234 4 234 7. + Definition loc_269 : location_info := LocationInfo file_0 234 4 234 170. + Definition loc_270 : location_info := LocationInfo file_0 234 4 234 7. + Definition loc_271 : location_info := LocationInfo file_0 234 4 234 7. + Definition loc_272 : location_info := LocationInfo file_0 234 11 234 170. + Definition loc_273 : location_info := LocationInfo file_0 234 11 234 15. + Definition loc_274 : location_info := LocationInfo file_0 234 11 234 15. + Definition loc_275 : location_info := LocationInfo file_0 234 18 234 170. + Definition loc_276 : location_info := LocationInfo file_0 234 19 234 92. + Definition loc_277 : location_info := LocationInfo file_0 234 20 234 47. + Definition loc_278 : location_info := LocationInfo file_0 234 21 234 42. + Definition loc_279 : location_info := LocationInfo file_0 234 21 234 27. + Definition loc_280 : location_info := LocationInfo file_0 234 23 234 26. + Definition loc_281 : location_info := LocationInfo file_0 234 30 234 42. + Definition loc_282 : location_info := LocationInfo file_0 234 31 234 34. + Definition loc_283 : location_info := LocationInfo file_0 234 38 234 41. + Definition loc_284 : location_info := LocationInfo file_0 234 45 234 46. + Definition loc_285 : location_info := LocationInfo file_0 234 50 234 91. + Definition loc_286 : location_info := LocationInfo file_0 234 51 234 55. + Definition loc_287 : location_info := LocationInfo file_0 234 52 234 55. + Definition loc_288 : location_info := LocationInfo file_0 234 59 234 90. + Definition loc_289 : location_info := LocationInfo file_0 234 60 234 82. + Definition loc_290 : location_info := LocationInfo file_0 234 60 234 78. + Definition loc_291 : location_info := LocationInfo file_0 234 61 234 73. + Definition loc_292 : location_info := LocationInfo file_0 234 76 234 77. + Definition loc_293 : location_info := LocationInfo file_0 234 81 234 82. + Definition loc_294 : location_info := LocationInfo file_0 234 85 234 89. + Definition loc_295 : location_info := LocationInfo file_0 234 95 234 169. + Definition loc_296 : location_info := LocationInfo file_0 234 96 234 124. + Definition loc_297 : location_info := LocationInfo file_0 234 97 234 119. + Definition loc_298 : location_info := LocationInfo file_0 234 97 234 103. + Definition loc_299 : location_info := LocationInfo file_0 234 99 234 102. + Definition loc_300 : location_info := LocationInfo file_0 234 106 234 119. + Definition loc_301 : location_info := LocationInfo file_0 234 107 234 110. + Definition loc_302 : location_info := LocationInfo file_0 234 114 234 118. + Definition loc_303 : location_info := LocationInfo file_0 234 122 234 123. + Definition loc_304 : location_info := LocationInfo file_0 234 127 234 168. + Definition loc_305 : location_info := LocationInfo file_0 234 128 234 132. + Definition loc_306 : location_info := LocationInfo file_0 234 129 234 132. + Definition loc_307 : location_info := LocationInfo file_0 234 136 234 167. + Definition loc_308 : location_info := LocationInfo file_0 234 137 234 159. + Definition loc_309 : location_info := LocationInfo file_0 234 137 234 155. + Definition loc_310 : location_info := LocationInfo file_0 234 138 234 150. + Definition loc_311 : location_info := LocationInfo file_0 234 153 234 154. + Definition loc_312 : location_info := LocationInfo file_0 234 158 234 159. + Definition loc_313 : location_info := LocationInfo file_0 234 162 234 166. + Definition loc_314 : location_info := LocationInfo file_0 232 15 233 32. + Definition loc_315 : location_info := LocationInfo file_0 232 15 232 32. + Definition loc_316 : location_info := LocationInfo file_0 232 16 232 21. + Definition loc_317 : location_info := LocationInfo file_0 232 16 232 21. + Definition loc_318 : location_info := LocationInfo file_0 232 25 232 31. + Definition loc_319 : location_info := LocationInfo file_0 232 25 232 27. + Definition loc_320 : location_info := LocationInfo file_0 232 30 232 31. + Definition loc_321 : location_info := LocationInfo file_0 232 35 232 36. + Definition loc_322 : location_info := LocationInfo file_0 233 31 233 32. + Definition loc_325 : location_info := LocationInfo file_0 231 33 231 52. + Definition loc_326 : location_info := LocationInfo file_0 231 33 231 48. + Definition loc_327 : location_info := LocationInfo file_0 231 33 231 48. + Definition loc_328 : location_info := LocationInfo file_0 231 49 231 51. + Definition loc_329 : location_info := LocationInfo file_0 231 49 231 51. + Definition loc_332 : location_info := LocationInfo file_0 231 20 231 25. + Definition loc_333 : location_info := LocationInfo file_0 231 20 231 25. + Definition loc_334 : location_info := LocationInfo file_0 231 21 231 25. + Definition loc_335 : location_info := LocationInfo file_0 231 21 231 25. + Definition loc_340 : location_info := LocationInfo file_0 254 4 254 50. + Definition loc_341 : location_info := LocationInfo file_0 255 4 255 31. + Definition loc_342 : location_info := LocationInfo file_0 256 4 256 209. + Definition loc_343 : location_info := LocationInfo file_0 257 4 257 15. + Definition loc_344 : location_info := LocationInfo file_0 258 4 259 29. + Definition loc_345 : location_info := LocationInfo file_0 260 4 261 19. + Definition loc_346 : location_info := LocationInfo file_0 262 4 269 5. + Definition loc_347 : location_info := LocationInfo file_0 270 4 270 197. + Definition loc_348 : location_info := LocationInfo file_0 271 4 271 197. + Definition loc_349 : location_info := LocationInfo file_0 272 4 272 26. + Definition loc_350 : location_info := LocationInfo file_0 273 4 273 22. + Definition loc_351 : location_info := LocationInfo file_0 274 4 274 13. + Definition loc_352 : location_info := LocationInfo file_0 274 11 274 12. + Definition loc_353 : location_info := LocationInfo file_0 273 4 273 14. + Definition loc_354 : location_info := LocationInfo file_0 273 4 273 8. + Definition loc_355 : location_info := LocationInfo file_0 273 4 273 8. + Definition loc_356 : location_info := LocationInfo file_0 273 17 273 21. + Definition loc_357 : location_info := LocationInfo file_0 273 17 273 21. + Definition loc_358 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_359 : location_info := LocationInfo file_0 272 4 272 25. + Definition loc_360 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_361 : location_info := LocationInfo file_0 272 4 272 8. + Definition loc_362 : location_info := LocationInfo file_0 272 12 272 25. + Definition loc_363 : location_info := LocationInfo file_0 272 13 272 16. + Definition loc_364 : location_info := LocationInfo file_0 272 20 272 24. + Definition loc_365 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_366 : location_info := LocationInfo file_0 271 4 271 196. + Definition loc_367 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_368 : location_info := LocationInfo file_0 271 4 271 8. + Definition loc_369 : location_info := LocationInfo file_0 271 12 271 196. + Definition loc_370 : location_info := LocationInfo file_0 271 13 271 118. + Definition loc_371 : location_info := LocationInfo file_0 271 14 271 18. + Definition loc_372 : location_info := LocationInfo file_0 271 14 271 18. + Definition loc_373 : location_info := LocationInfo file_0 271 22 271 117. + Definition loc_374 : location_info := LocationInfo file_0 271 23 271 112. + Definition loc_375 : location_info := LocationInfo file_0 271 23 271 38. + Definition loc_376 : location_info := LocationInfo file_0 271 23 271 38. + Definition loc_377 : location_info := LocationInfo file_0 271 39 271 111. + Definition loc_378 : location_info := LocationInfo file_0 271 40 271 67. + Definition loc_379 : location_info := LocationInfo file_0 271 41 271 62. + Definition loc_380 : location_info := LocationInfo file_0 271 41 271 47. + Definition loc_381 : location_info := LocationInfo file_0 271 43 271 46. + Definition loc_382 : location_info := LocationInfo file_0 271 50 271 62. + Definition loc_383 : location_info := LocationInfo file_0 271 51 271 54. + Definition loc_384 : location_info := LocationInfo file_0 271 58 271 61. + Definition loc_385 : location_info := LocationInfo file_0 271 65 271 66. + Definition loc_386 : location_info := LocationInfo file_0 271 70 271 110. + Definition loc_387 : location_info := LocationInfo file_0 271 71 271 75. + Definition loc_388 : location_info := LocationInfo file_0 271 72 271 75. + Definition loc_389 : location_info := LocationInfo file_0 271 79 271 109. + Definition loc_390 : location_info := LocationInfo file_0 271 80 271 102. + Definition loc_391 : location_info := LocationInfo file_0 271 80 271 98. + Definition loc_392 : location_info := LocationInfo file_0 271 81 271 93. + Definition loc_393 : location_info := LocationInfo file_0 271 96 271 97. + Definition loc_394 : location_info := LocationInfo file_0 271 101 271 102. + Definition loc_395 : location_info := LocationInfo file_0 271 105 271 108. + Definition loc_396 : location_info := LocationInfo file_0 271 115 271 116. + Definition loc_397 : location_info := LocationInfo file_0 271 121 271 195. + Definition loc_398 : location_info := LocationInfo file_0 271 123 271 150. + Definition loc_399 : location_info := LocationInfo file_0 271 124 271 145. + Definition loc_400 : location_info := LocationInfo file_0 271 124 271 130. + Definition loc_401 : location_info := LocationInfo file_0 271 126 271 129. + Definition loc_402 : location_info := LocationInfo file_0 271 133 271 145. + Definition loc_403 : location_info := LocationInfo file_0 271 134 271 137. + Definition loc_404 : location_info := LocationInfo file_0 271 141 271 144. + Definition loc_405 : location_info := LocationInfo file_0 271 148 271 149. + Definition loc_406 : location_info := LocationInfo file_0 271 153 271 193. + Definition loc_407 : location_info := LocationInfo file_0 271 154 271 158. + Definition loc_408 : location_info := LocationInfo file_0 271 155 271 158. + Definition loc_409 : location_info := LocationInfo file_0 271 162 271 192. + Definition loc_410 : location_info := LocationInfo file_0 271 163 271 185. + Definition loc_411 : location_info := LocationInfo file_0 271 163 271 181. + Definition loc_412 : location_info := LocationInfo file_0 271 164 271 176. + Definition loc_413 : location_info := LocationInfo file_0 271 179 271 180. + Definition loc_414 : location_info := LocationInfo file_0 271 184 271 185. + Definition loc_415 : location_info := LocationInfo file_0 271 188 271 191. + Definition loc_416 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_417 : location_info := LocationInfo file_0 270 4 270 196. + Definition loc_418 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_419 : location_info := LocationInfo file_0 270 4 270 8. + Definition loc_420 : location_info := LocationInfo file_0 270 12 270 196. + Definition loc_421 : location_info := LocationInfo file_0 270 13 270 118. + Definition loc_422 : location_info := LocationInfo file_0 270 14 270 18. + Definition loc_423 : location_info := LocationInfo file_0 270 14 270 18. + Definition loc_424 : location_info := LocationInfo file_0 270 22 270 117. + Definition loc_425 : location_info := LocationInfo file_0 270 23 270 112. + Definition loc_426 : location_info := LocationInfo file_0 270 23 270 38. + Definition loc_427 : location_info := LocationInfo file_0 270 23 270 38. + Definition loc_428 : location_info := LocationInfo file_0 270 39 270 111. + Definition loc_429 : location_info := LocationInfo file_0 270 40 270 67. + Definition loc_430 : location_info := LocationInfo file_0 270 41 270 62. + Definition loc_431 : location_info := LocationInfo file_0 270 41 270 47. + Definition loc_432 : location_info := LocationInfo file_0 270 43 270 46. + Definition loc_433 : location_info := LocationInfo file_0 270 50 270 62. + Definition loc_434 : location_info := LocationInfo file_0 270 51 270 54. + Definition loc_435 : location_info := LocationInfo file_0 270 58 270 61. + Definition loc_436 : location_info := LocationInfo file_0 270 65 270 66. + Definition loc_437 : location_info := LocationInfo file_0 270 70 270 110. + Definition loc_438 : location_info := LocationInfo file_0 270 71 270 75. + Definition loc_439 : location_info := LocationInfo file_0 270 72 270 75. + Definition loc_440 : location_info := LocationInfo file_0 270 79 270 109. + Definition loc_441 : location_info := LocationInfo file_0 270 80 270 102. + Definition loc_442 : location_info := LocationInfo file_0 270 80 270 98. + Definition loc_443 : location_info := LocationInfo file_0 270 81 270 93. + Definition loc_444 : location_info := LocationInfo file_0 270 96 270 97. + Definition loc_445 : location_info := LocationInfo file_0 270 101 270 102. + Definition loc_446 : location_info := LocationInfo file_0 270 105 270 108. + Definition loc_447 : location_info := LocationInfo file_0 270 115 270 116. + Definition loc_448 : location_info := LocationInfo file_0 270 121 270 195. + Definition loc_449 : location_info := LocationInfo file_0 270 123 270 150. + Definition loc_450 : location_info := LocationInfo file_0 270 124 270 145. + Definition loc_451 : location_info := LocationInfo file_0 270 124 270 130. + Definition loc_452 : location_info := LocationInfo file_0 270 126 270 129. + Definition loc_453 : location_info := LocationInfo file_0 270 133 270 145. + Definition loc_454 : location_info := LocationInfo file_0 270 134 270 137. + Definition loc_455 : location_info := LocationInfo file_0 270 141 270 144. + Definition loc_456 : location_info := LocationInfo file_0 270 148 270 149. + Definition loc_457 : location_info := LocationInfo file_0 270 153 270 193. + Definition loc_458 : location_info := LocationInfo file_0 270 154 270 158. + Definition loc_459 : location_info := LocationInfo file_0 270 155 270 158. + Definition loc_460 : location_info := LocationInfo file_0 270 162 270 192. + Definition loc_461 : location_info := LocationInfo file_0 270 163 270 185. + Definition loc_462 : location_info := LocationInfo file_0 270 163 270 181. + Definition loc_463 : location_info := LocationInfo file_0 270 164 270 176. + Definition loc_464 : location_info := LocationInfo file_0 270 179 270 180. + Definition loc_465 : location_info := LocationInfo file_0 270 184 270 185. + Definition loc_466 : location_info := LocationInfo file_0 270 188 270 191. + Definition loc_467 : location_info := LocationInfo file_0 262 35 267 5. + Definition loc_468 : location_info := LocationInfo file_0 263 8 264 23. + Definition loc_469 : location_info := LocationInfo file_0 265 8 266 23. + Definition loc_470 : location_info := LocationInfo file_0 266 12 266 23. + Definition loc_471 : location_info := LocationInfo file_0 266 19 266 22. + Definition loc_472 : location_info := LocationInfo file_0 266 20 266 22. + Definition loc_474 : location_info := LocationInfo file_0 265 12 265 18. + Definition loc_475 : location_info := LocationInfo file_0 265 12 265 18. + Definition loc_476 : location_info := LocationInfo file_0 264 12 264 23. + Definition loc_477 : location_info := LocationInfo file_0 264 19 264 22. + Definition loc_478 : location_info := LocationInfo file_0 264 20 264 22. + Definition loc_480 : location_info := LocationInfo file_0 263 12 263 37. + Definition loc_481 : location_info := LocationInfo file_0 263 12 263 16. + Definition loc_482 : location_info := LocationInfo file_0 263 12 263 16. + Definition loc_483 : location_info := LocationInfo file_0 263 19 263 37. + Definition loc_484 : location_info := LocationInfo file_0 267 11 269 5. + Definition loc_485 : location_info := LocationInfo file_0 268 8 268 30. + Definition loc_486 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_487 : location_info := LocationInfo file_0 268 8 268 29. + Definition loc_488 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_489 : location_info := LocationInfo file_0 268 8 268 12. + Definition loc_490 : location_info := LocationInfo file_0 268 16 268 29. + Definition loc_491 : location_info := LocationInfo file_0 268 17 268 20. + Definition loc_492 : location_info := LocationInfo file_0 268 24 268 28. + Definition loc_493 : location_info := LocationInfo file_0 262 8 262 33. + Definition loc_494 : location_info := LocationInfo file_0 262 8 262 12. + Definition loc_495 : location_info := LocationInfo file_0 262 8 262 12. + Definition loc_496 : location_info := LocationInfo file_0 262 15 262 33. + Definition loc_497 : location_info := LocationInfo file_0 261 8 261 19. + Definition loc_498 : location_info := LocationInfo file_0 261 15 261 18. + Definition loc_499 : location_info := LocationInfo file_0 261 16 261 18. + Definition loc_501 : location_info := LocationInfo file_0 260 8 260 36. + Definition loc_503 : location_info := LocationInfo file_0 260 9 260 36. + Definition loc_504 : location_info := LocationInfo file_0 260 10 260 14. + Definition loc_505 : location_info := LocationInfo file_0 260 10 260 14. + Definition loc_506 : location_info := LocationInfo file_0 260 17 260 35. + Definition loc_507 : location_info := LocationInfo file_0 258 13 259 28. + Definition loc_508 : location_info := LocationInfo file_0 258 13 258 40. + Definition loc_509 : location_info := LocationInfo file_0 258 14 258 18. + Definition loc_510 : location_info := LocationInfo file_0 258 14 258 18. + Definition loc_511 : location_info := LocationInfo file_0 258 21 258 39. + Definition loc_512 : location_info := LocationInfo file_0 258 43 258 44. + Definition loc_513 : location_info := LocationInfo file_0 259 27 259 28. + Definition loc_516 : location_info := LocationInfo file_0 257 13 257 14. + Definition loc_519 : location_info := LocationInfo file_0 256 21 256 208. + Definition loc_520 : location_info := LocationInfo file_0 256 22 256 130. + Definition loc_521 : location_info := LocationInfo file_0 256 23 256 30. + Definition loc_522 : location_info := LocationInfo file_0 256 23 256 30. + Definition loc_523 : location_info := LocationInfo file_0 256 34 256 129. + Definition loc_524 : location_info := LocationInfo file_0 256 35 256 124. + Definition loc_525 : location_info := LocationInfo file_0 256 35 256 50. + Definition loc_526 : location_info := LocationInfo file_0 256 35 256 50. + Definition loc_527 : location_info := LocationInfo file_0 256 51 256 123. + Definition loc_528 : location_info := LocationInfo file_0 256 52 256 79. + Definition loc_529 : location_info := LocationInfo file_0 256 53 256 74. + Definition loc_530 : location_info := LocationInfo file_0 256 53 256 59. + Definition loc_531 : location_info := LocationInfo file_0 256 55 256 58. + Definition loc_532 : location_info := LocationInfo file_0 256 62 256 74. + Definition loc_533 : location_info := LocationInfo file_0 256 63 256 66. + Definition loc_534 : location_info := LocationInfo file_0 256 70 256 73. + Definition loc_535 : location_info := LocationInfo file_0 256 77 256 78. + Definition loc_536 : location_info := LocationInfo file_0 256 82 256 122. + Definition loc_537 : location_info := LocationInfo file_0 256 83 256 87. + Definition loc_538 : location_info := LocationInfo file_0 256 84 256 87. + Definition loc_539 : location_info := LocationInfo file_0 256 91 256 121. + Definition loc_540 : location_info := LocationInfo file_0 256 92 256 114. + Definition loc_541 : location_info := LocationInfo file_0 256 92 256 110. + Definition loc_542 : location_info := LocationInfo file_0 256 93 256 105. + Definition loc_543 : location_info := LocationInfo file_0 256 108 256 109. + Definition loc_544 : location_info := LocationInfo file_0 256 113 256 114. + Definition loc_545 : location_info := LocationInfo file_0 256 117 256 120. + Definition loc_546 : location_info := LocationInfo file_0 256 127 256 128. + Definition loc_547 : location_info := LocationInfo file_0 256 133 256 207. + Definition loc_548 : location_info := LocationInfo file_0 256 135 256 162. + Definition loc_549 : location_info := LocationInfo file_0 256 136 256 157. + Definition loc_550 : location_info := LocationInfo file_0 256 136 256 142. + Definition loc_551 : location_info := LocationInfo file_0 256 138 256 141. + Definition loc_552 : location_info := LocationInfo file_0 256 145 256 157. + Definition loc_553 : location_info := LocationInfo file_0 256 146 256 149. + Definition loc_554 : location_info := LocationInfo file_0 256 153 256 156. + Definition loc_555 : location_info := LocationInfo file_0 256 160 256 161. + Definition loc_556 : location_info := LocationInfo file_0 256 165 256 205. + Definition loc_557 : location_info := LocationInfo file_0 256 166 256 170. + Definition loc_558 : location_info := LocationInfo file_0 256 167 256 170. + Definition loc_559 : location_info := LocationInfo file_0 256 174 256 204. + Definition loc_560 : location_info := LocationInfo file_0 256 175 256 197. + Definition loc_561 : location_info := LocationInfo file_0 256 175 256 193. + Definition loc_562 : location_info := LocationInfo file_0 256 176 256 188. + Definition loc_563 : location_info := LocationInfo file_0 256 191 256 192. + Definition loc_564 : location_info := LocationInfo file_0 256 196 256 197. + Definition loc_565 : location_info := LocationInfo file_0 256 200 256 203. + Definition loc_568 : location_info := LocationInfo file_0 255 16 255 30. + Definition loc_569 : location_info := LocationInfo file_0 255 16 255 22. + Definition loc_570 : location_info := LocationInfo file_0 255 16 255 22. + Definition loc_571 : location_info := LocationInfo file_0 255 25 255 26. + Definition loc_572 : location_info := LocationInfo file_0 255 29 255 30. + Definition loc_575 : location_info := LocationInfo file_0 254 19 254 49. + Definition loc_576 : location_info := LocationInfo file_0 254 19 254 23. + Definition loc_577 : location_info := LocationInfo file_0 254 19 254 23. + Definition loc_578 : location_info := LocationInfo file_0 254 26 254 49. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| @@ -699,15 +711,18 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_202 (use{it_layout u64} (LocInfoE loc_204 (!{void*} (LocInfoE loc_205 ("ptep"))))) ; + LocInfoE loc_208 (use{it_layout u64} (LocInfoE loc_210 (!{void*} (LocInfoE loc_211 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_189 (Call (LocInfoE loc_191 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_192 (Call (LocInfoE loc_194 (use{void*} (LocInfoE loc_195 ((LocInfoE loc_196 (!{void*} (LocInfoE loc_197 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_198 (use{void*} (LocInfoE loc_199 ("childp"))) ]) ]) ; + LocInfoE loc_195 (Call (LocInfoE loc_197 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_198 (Call (LocInfoE loc_200 (use{void*} (LocInfoE loc_201 ((LocInfoE loc_202 (!{void*} (LocInfoE loc_203 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_204 (use{void*} (LocInfoE loc_205 ("childp"))) ]) ]) ; locinfo: loc_162 ; - LocInfoE loc_171 ("pte") <-{ it_layout u64 } - LocInfoE loc_172 ((LocInfoE loc_173 (use{it_layout u64} (LocInfoE loc_174 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_175 ((LocInfoE loc_176 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_176 ((LocInfoE loc_177 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_178 ((LocInfoE loc_179 (Call (LocInfoE loc_181 (global___builtin_ffsll)) [@{expr} LocInfoE loc_182 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_182 ((LocInfoE loc_183 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_184 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_184 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_185 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_186 ((LocInfoE loc_187 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_188 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_188 (i2v 1 i32))))))))) ; + LocInfoE loc_177 ("pte") <-{ it_layout u64 } + LocInfoE loc_178 ((LocInfoE loc_179 (use{it_layout u64} (LocInfoE loc_180 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_181 ((LocInfoE loc_182 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_182 ((LocInfoE loc_183 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_184 ((LocInfoE loc_185 (Call (LocInfoE loc_187 (global___builtin_ffsll)) [@{expr} LocInfoE loc_188 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_188 ((LocInfoE loc_189 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_190 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_190 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_191 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_192 ((LocInfoE loc_193 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_194 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_194 (i2v 1 i32))))))))) ; locinfo: loc_163 ; - LocInfoE loc_164 ("pte") <-{ it_layout u64 } - LocInfoE loc_165 ((LocInfoE loc_166 (use{it_layout u64} (LocInfoE loc_167 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_168 ((LocInfoE loc_169 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_170 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_170 (i2v 0 i32))))))) ; + LocInfoE loc_170 ("pte") <-{ it_layout u64 } + LocInfoE loc_171 ((LocInfoE loc_172 (use{it_layout u64} (LocInfoE loc_173 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_174 ((LocInfoE loc_175 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_176 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_176 (i2v 0 i32))))))) ; + locinfo: loc_164 ; + LocInfoE loc_166 (!{void*} (LocInfoE loc_167 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_168 (use{it_layout u64} (LocInfoE loc_169 ("pte"))) ; Return (VOID) ]> $∅ )%E @@ -730,42 +745,45 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_320 (use{it_layout u64} (LocInfoE loc_322 (!{void*} (LocInfoE loc_323 ("ptep"))))) ; + LocInfoE loc_332 (use{it_layout u64} (LocInfoE loc_334 (!{void*} (LocInfoE loc_335 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_313 (Call (LocInfoE loc_315 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_316 (use{it_layout u64} (LocInfoE loc_317 ("pa"))) ]) ; + LocInfoE loc_325 (Call (LocInfoE loc_327 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_328 (use{it_layout u64} (LocInfoE loc_329 ("pa"))) ]) ; "type" <-{ it_layout u64 } - LocInfoE loc_302 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_302 (IfE + LocInfoE loc_314 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_314 (IfE (IntOp i32) - (LocInfoE loc_303 ((LocInfoE loc_304 (use{it_layout u32} (LocInfoE loc_305 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_306 ((LocInfoE loc_307 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_308 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_308 (i2v 1 i32)))))))) - (LocInfoE loc_309 (i2v 1 i32)) (LocInfoE loc_310 (i2v 0 i32))))) ; - locinfo: loc_212 ; - LocInfoE loc_256 ("pte") <-{ it_layout u64 } - LocInfoE loc_257 ((LocInfoE loc_258 (use{it_layout u64} (LocInfoE loc_259 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_260 ((LocInfoE loc_261 (use{it_layout u64} (LocInfoE loc_262 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_263 ((LocInfoE loc_264 ((LocInfoE loc_265 ((LocInfoE loc_266 ((LocInfoE loc_267 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_268 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_269 ((LocInfoE loc_270 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_271 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_271 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_272 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_272 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_273 ((LocInfoE loc_274 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_275 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_276 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_276 ((LocInfoE loc_277 ((LocInfoE loc_278 ((LocInfoE loc_279 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_280 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_280 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_281 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_281 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_282 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_282 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_283 ((LocInfoE loc_284 ((LocInfoE loc_285 ((LocInfoE loc_286 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_287 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_288 ((LocInfoE loc_289 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_290 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_290 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_291 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_291 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_292 ((LocInfoE loc_293 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_294 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_295 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 ((LocInfoE loc_298 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_299 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_299 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_300 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_300 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_301 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_301 (i2v 63 i32))))))))))))))))) ; - locinfo: loc_213 ; - LocInfoE loc_237 ("pte") <-{ it_layout u64 } - LocInfoE loc_238 ((LocInfoE loc_239 (use{it_layout u64} (LocInfoE loc_240 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_241 ((LocInfoE loc_242 ((LocInfoE loc_243 (use{it_layout u64} (LocInfoE loc_244 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_245 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_245 ((LocInfoE loc_246 (Call (LocInfoE loc_248 (global___builtin_ffsll)) [@{expr} LocInfoE loc_249 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_249 ((LocInfoE loc_250 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_251 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_251 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_252 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_253 ((LocInfoE loc_254 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_255 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_255 (i2v 1 i32))))))))) ; - locinfo: loc_214 ; - LocInfoE loc_230 ("pte") <-{ it_layout u64 } - LocInfoE loc_231 ((LocInfoE loc_232 (use{it_layout u64} (LocInfoE loc_233 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_234 ((LocInfoE loc_235 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_236 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_236 (i2v 0 i32))))))) ; - locinfo: loc_225 ; - if: LocInfoE loc_225 (Call (LocInfoE loc_227 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_228 (use{it_layout u64} (LocInfoE loc_229 ("old"))) ]) - then + (LocInfoE loc_315 ((LocInfoE loc_316 (use{it_layout u32} (LocInfoE loc_317 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_318 ((LocInfoE loc_319 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_320 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_320 (i2v 1 i32)))))))) + (LocInfoE loc_321 (i2v 1 i32)) (LocInfoE loc_322 (i2v 0 i32))))) ; locinfo: loc_218 ; + LocInfoE loc_268 ("pte") <-{ it_layout u64 } + LocInfoE loc_269 ((LocInfoE loc_270 (use{it_layout u64} (LocInfoE loc_271 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_272 ((LocInfoE loc_273 (use{it_layout u64} (LocInfoE loc_274 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_275 ((LocInfoE loc_276 ((LocInfoE loc_277 ((LocInfoE loc_278 ((LocInfoE loc_279 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_280 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_281 ((LocInfoE loc_282 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_283 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_283 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_284 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_284 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_285 ((LocInfoE loc_286 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_287 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_288 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_288 ((LocInfoE loc_289 ((LocInfoE loc_290 ((LocInfoE loc_291 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_292 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_292 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_293 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_293 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_294 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_294 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 ((LocInfoE loc_298 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_299 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_300 ((LocInfoE loc_301 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_302 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_302 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_303 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_303 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_304 ((LocInfoE loc_305 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_306 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_307 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_307 ((LocInfoE loc_308 ((LocInfoE loc_309 ((LocInfoE loc_310 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_311 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_311 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_312 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_312 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_313 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_313 (i2v 63 i32))))))))))))))))) ; + locinfo: loc_219 ; + LocInfoE loc_249 ("pte") <-{ it_layout u64 } + LocInfoE loc_250 ((LocInfoE loc_251 (use{it_layout u64} (LocInfoE loc_252 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_253 ((LocInfoE loc_254 ((LocInfoE loc_255 (use{it_layout u64} (LocInfoE loc_256 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_257 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_257 ((LocInfoE loc_258 (Call (LocInfoE loc_260 (global___builtin_ffsll)) [@{expr} LocInfoE loc_261 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_261 ((LocInfoE loc_262 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_263 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_263 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_264 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_265 ((LocInfoE loc_266 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_267 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_267 (i2v 1 i32))))))))) ; + locinfo: loc_220 ; + LocInfoE loc_242 ("pte") <-{ it_layout u64 } + LocInfoE loc_243 ((LocInfoE loc_244 (use{it_layout u64} (LocInfoE loc_245 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_246 ((LocInfoE loc_247 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_248 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_248 (i2v 0 i32))))))) ; + locinfo: loc_237 ; + if: LocInfoE loc_237 (Call (LocInfoE loc_239 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_240 (use{it_layout u64} (LocInfoE loc_241 ("old"))) ]) + then + locinfo: loc_230 ; Goto "#2" else - locinfo: loc_216 ; + locinfo: loc_222 ; Goto "#3" ]> $ <[ "#1" := - locinfo: loc_216 ; - Return (LocInfoE loc_217 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_217 (i2v 1 i32)))) + locinfo: loc_222 ; + LocInfoE loc_226 (!{void*} (LocInfoE loc_227 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_228 (use{it_layout u64} (LocInfoE loc_229 ("pte"))) ; + locinfo: loc_223 ; + Return (LocInfoE loc_224 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_224 (i2v 1 i32)))) ]> $ <[ "#2" := - locinfo: loc_218 ; - Return (LocInfoE loc_219 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_219 ((LocInfoE loc_220 (use{it_layout u64} (LocInfoE loc_221 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_222 (use{it_layout u64} (LocInfoE loc_223 ("pte")))))))) + locinfo: loc_230 ; + Return (LocInfoE loc_231 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_231 ((LocInfoE loc_232 (use{it_layout u64} (LocInfoE loc_233 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_234 (use{it_layout u64} (LocInfoE loc_235 ("pte")))))))) ]> $ <[ "#3" := - locinfo: loc_216 ; + locinfo: loc_222 ; Goto "#1" ]> $∅ )%E @@ -788,105 +806,105 @@ Section code. f_code := ( <[ "#0" := "device" <-{ it_layout bool_it } - LocInfoE loc_563 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_563 ((LocInfoE loc_564 (use{it_layout u32} (LocInfoE loc_565 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_566 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_566 (i2v 8 i32))))))) ; + LocInfoE loc_575 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_575 ((LocInfoE loc_576 (use{it_layout u32} (LocInfoE loc_577 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_578 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_578 (i2v 8 i32))))))) ; "mtype" <-{ it_layout u32 } - LocInfoE loc_556 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_556 (IfE + LocInfoE loc_568 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_568 (IfE (IntOp bool_it) - (LocInfoE loc_557 (use{it_layout bool_it} (LocInfoE loc_558 ("device")))) - (LocInfoE loc_559 (i2v 5 i32)) (LocInfoE loc_560 (i2v 0 i32))))) ; + (LocInfoE loc_569 (use{it_layout bool_it} (LocInfoE loc_570 ("device")))) + (LocInfoE loc_571 (i2v 5 i32)) (LocInfoE loc_572 (i2v 0 i32))))) ; "attr" <-{ it_layout u64 } - LocInfoE loc_507 ((LocInfoE loc_508 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_508 ((LocInfoE loc_509 (use{it_layout u32} (LocInfoE loc_510 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_511 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_511 ((LocInfoE loc_512 (Call (LocInfoE loc_514 (global___builtin_ffsll)) [@{expr} LocInfoE loc_515 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_515 ((LocInfoE loc_516 ((LocInfoE loc_517 ((LocInfoE loc_518 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_519 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_520 ((LocInfoE loc_521 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_522 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_522 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_523 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_523 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_524 ((LocInfoE loc_525 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_526 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_527 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_527 ((LocInfoE loc_528 ((LocInfoE loc_529 ((LocInfoE loc_530 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_531 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_531 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_532 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_532 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_533 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_533 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_534 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_535 ((LocInfoE loc_536 ((LocInfoE loc_537 ((LocInfoE loc_538 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_539 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_540 ((LocInfoE loc_541 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_542 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_542 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_543 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_543 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_544 ((LocInfoE loc_545 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_546 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_547 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_547 ((LocInfoE loc_548 ((LocInfoE loc_549 ((LocInfoE loc_550 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_551 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_551 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_552 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_552 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_553 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_553 (i2v 4 i32))))))))))))) ; + LocInfoE loc_519 ((LocInfoE loc_520 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_520 ((LocInfoE loc_521 (use{it_layout u32} (LocInfoE loc_522 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_523 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_523 ((LocInfoE loc_524 (Call (LocInfoE loc_526 (global___builtin_ffsll)) [@{expr} LocInfoE loc_527 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_527 ((LocInfoE loc_528 ((LocInfoE loc_529 ((LocInfoE loc_530 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_531 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_532 ((LocInfoE loc_533 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_534 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_534 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_535 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_535 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_536 ((LocInfoE loc_537 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_538 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_539 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_539 ((LocInfoE loc_540 ((LocInfoE loc_541 ((LocInfoE loc_542 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_543 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_543 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_544 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_544 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_545 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_545 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_546 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_547 ((LocInfoE loc_548 ((LocInfoE loc_549 ((LocInfoE loc_550 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_551 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_552 ((LocInfoE loc_553 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_554 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_554 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_555 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_555 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_556 ((LocInfoE loc_557 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_558 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_559 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_559 ((LocInfoE loc_560 ((LocInfoE loc_561 ((LocInfoE loc_562 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_563 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_563 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_564 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_564 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_565 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_565 (i2v 4 i32))))))))))))) ; "sh" <-{ it_layout u32 } - LocInfoE loc_504 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_504 (i2v 3 i32))) ; + LocInfoE loc_516 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_516 (i2v 3 i32))) ; "ap" <-{ it_layout u32 } - LocInfoE loc_495 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_495 (IfE + LocInfoE loc_507 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_507 (IfE (IntOp u32) - (LocInfoE loc_496 ((LocInfoE loc_497 (use{it_layout u32} (LocInfoE loc_498 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_499 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_499 (i2v 2 i32)))))) - (LocInfoE loc_500 (i2v 1 i32)) (LocInfoE loc_501 (i2v 3 i32))))) ; - locinfo: loc_489 ; - if: LocInfoE loc_489 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_489 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_491 ((LocInfoE loc_492 (use{it_layout u32} (LocInfoE loc_493 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_494 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_494 (i2v 4 i32))))))))) + (LocInfoE loc_508 ((LocInfoE loc_509 (use{it_layout u32} (LocInfoE loc_510 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_511 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_511 (i2v 2 i32)))))) + (LocInfoE loc_512 (i2v 1 i32)) (LocInfoE loc_513 (i2v 3 i32))))) ; + locinfo: loc_501 ; + if: LocInfoE loc_501 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_501 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_503 ((LocInfoE loc_504 (use{it_layout u32} (LocInfoE loc_505 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_506 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_506 (i2v 4 i32))))))))) then - locinfo: loc_485 ; + locinfo: loc_497 ; Goto "#10" else - locinfo: loc_481 ; + locinfo: loc_493 ; Goto "#11" ]> $ <[ "#1" := - locinfo: loc_481 ; - if: LocInfoE loc_481 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_481 ((LocInfoE loc_482 (use{it_layout u32} (LocInfoE loc_483 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_484 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_484 (i2v 1 i32))))))) + locinfo: loc_493 ; + if: LocInfoE loc_493 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_493 ((LocInfoE loc_494 (use{it_layout u32} (LocInfoE loc_495 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_496 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_496 (i2v 1 i32))))))) then - locinfo: loc_468 ; + locinfo: loc_480 ; Goto "#3" else - locinfo: loc_473 ; + locinfo: loc_485 ; Goto "#9" ]> $ <[ "#10" := - locinfo: loc_485 ; - Return (LocInfoE loc_486 (UnOp NegOp (IntOp i32) (LocInfoE loc_487 (i2v 22 i32)))) + locinfo: loc_497 ; + Return (LocInfoE loc_498 (UnOp NegOp (IntOp i32) (LocInfoE loc_499 (i2v 22 i32)))) ]> $ <[ "#11" := - locinfo: loc_481 ; + locinfo: loc_493 ; Goto "#1" ]> $ <[ "#2" := - locinfo: loc_335 ; - LocInfoE loc_404 ("attr") <-{ it_layout u64 } - LocInfoE loc_405 ((LocInfoE loc_406 (use{it_layout u64} (LocInfoE loc_407 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_408 ((LocInfoE loc_409 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_409 ((LocInfoE loc_410 (use{it_layout u32} (LocInfoE loc_411 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_412 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_412 ((LocInfoE loc_413 (Call (LocInfoE loc_415 (global___builtin_ffsll)) [@{expr} LocInfoE loc_416 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_416 ((LocInfoE loc_417 ((LocInfoE loc_418 ((LocInfoE loc_419 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_420 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_421 ((LocInfoE loc_422 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_423 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_423 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_424 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_424 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_425 ((LocInfoE loc_426 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_427 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_428 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_428 ((LocInfoE loc_429 ((LocInfoE loc_430 ((LocInfoE loc_431 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_432 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_432 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_433 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_433 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_434 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_434 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_435 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_436 ((LocInfoE loc_437 ((LocInfoE loc_438 ((LocInfoE loc_439 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_440 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_441 ((LocInfoE loc_442 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_443 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_443 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_444 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_444 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_445 ((LocInfoE loc_446 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_447 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_448 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_448 ((LocInfoE loc_449 ((LocInfoE loc_450 ((LocInfoE loc_451 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_452 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_452 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_453 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_453 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_454 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_454 (i2v 7 i32))))))))))))))) ; - locinfo: loc_336 ; - LocInfoE loc_353 ("attr") <-{ it_layout u64 } - LocInfoE loc_354 ((LocInfoE loc_355 (use{it_layout u64} (LocInfoE loc_356 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_357 ((LocInfoE loc_358 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_358 ((LocInfoE loc_359 (use{it_layout u32} (LocInfoE loc_360 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_361 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_361 ((LocInfoE loc_362 (Call (LocInfoE loc_364 (global___builtin_ffsll)) [@{expr} LocInfoE loc_365 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_365 ((LocInfoE loc_366 ((LocInfoE loc_367 ((LocInfoE loc_368 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_369 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_370 ((LocInfoE loc_371 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_372 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_372 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_373 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_373 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_374 ((LocInfoE loc_375 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_376 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_377 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_377 ((LocInfoE loc_378 ((LocInfoE loc_379 ((LocInfoE loc_380 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_381 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_381 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_382 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_382 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_383 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_383 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_384 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_385 ((LocInfoE loc_386 ((LocInfoE loc_387 ((LocInfoE loc_388 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_389 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_390 ((LocInfoE loc_391 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_392 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_392 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_393 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_393 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_394 ((LocInfoE loc_395 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_396 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_397 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_397 ((LocInfoE loc_398 ((LocInfoE loc_399 ((LocInfoE loc_400 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_401 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_401 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_402 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_402 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_403 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_403 (i2v 9 i32))))))))))))))) ; - locinfo: loc_337 ; - LocInfoE loc_346 ("attr") <-{ it_layout u64 } - LocInfoE loc_347 ((LocInfoE loc_348 (use{it_layout u64} (LocInfoE loc_349 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_350 ((LocInfoE loc_351 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_352 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_352 (i2v 10 i32))))))) ; - locinfo: loc_338 ; - LocInfoE loc_341 ((LocInfoE loc_342 (!{void*} (LocInfoE loc_343 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } - LocInfoE loc_344 (use{it_layout u64} (LocInfoE loc_345 ("attr"))) ; - locinfo: loc_339 ; - Return (LocInfoE loc_340 (i2v 0 i32)) + locinfo: loc_347 ; + LocInfoE loc_416 ("attr") <-{ it_layout u64 } + LocInfoE loc_417 ((LocInfoE loc_418 (use{it_layout u64} (LocInfoE loc_419 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_420 ((LocInfoE loc_421 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_421 ((LocInfoE loc_422 (use{it_layout u32} (LocInfoE loc_423 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_424 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_424 ((LocInfoE loc_425 (Call (LocInfoE loc_427 (global___builtin_ffsll)) [@{expr} LocInfoE loc_428 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_428 ((LocInfoE loc_429 ((LocInfoE loc_430 ((LocInfoE loc_431 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_432 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_433 ((LocInfoE loc_434 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_435 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_435 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_436 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_436 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_437 ((LocInfoE loc_438 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_439 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_440 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_440 ((LocInfoE loc_441 ((LocInfoE loc_442 ((LocInfoE loc_443 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_444 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_444 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_445 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_445 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_446 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_446 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_447 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_448 ((LocInfoE loc_449 ((LocInfoE loc_450 ((LocInfoE loc_451 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_452 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_453 ((LocInfoE loc_454 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_455 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_455 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_456 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_456 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_457 ((LocInfoE loc_458 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_459 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_460 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_460 ((LocInfoE loc_461 ((LocInfoE loc_462 ((LocInfoE loc_463 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_464 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_464 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_465 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_465 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_466 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_466 (i2v 7 i32))))))))))))))) ; + locinfo: loc_348 ; + LocInfoE loc_365 ("attr") <-{ it_layout u64 } + LocInfoE loc_366 ((LocInfoE loc_367 (use{it_layout u64} (LocInfoE loc_368 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_369 ((LocInfoE loc_370 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_370 ((LocInfoE loc_371 (use{it_layout u32} (LocInfoE loc_372 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_373 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_373 ((LocInfoE loc_374 (Call (LocInfoE loc_376 (global___builtin_ffsll)) [@{expr} LocInfoE loc_377 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_377 ((LocInfoE loc_378 ((LocInfoE loc_379 ((LocInfoE loc_380 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_381 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_382 ((LocInfoE loc_383 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_384 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_384 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_385 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_385 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_386 ((LocInfoE loc_387 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_388 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_389 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_389 ((LocInfoE loc_390 ((LocInfoE loc_391 ((LocInfoE loc_392 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_393 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_393 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_394 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_394 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_395 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_395 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_396 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_397 ((LocInfoE loc_398 ((LocInfoE loc_399 ((LocInfoE loc_400 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_401 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_402 ((LocInfoE loc_403 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_404 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_404 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_405 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_405 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_406 ((LocInfoE loc_407 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_408 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_409 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_409 ((LocInfoE loc_410 ((LocInfoE loc_411 ((LocInfoE loc_412 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_413 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_413 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_414 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_414 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_415 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_415 (i2v 9 i32))))))))))))))) ; + locinfo: loc_349 ; + LocInfoE loc_358 ("attr") <-{ it_layout u64 } + LocInfoE loc_359 ((LocInfoE loc_360 (use{it_layout u64} (LocInfoE loc_361 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_362 ((LocInfoE loc_363 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_364 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_364 (i2v 10 i32))))))) ; + locinfo: loc_350 ; + LocInfoE loc_353 ((LocInfoE loc_354 (!{void*} (LocInfoE loc_355 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } + LocInfoE loc_356 (use{it_layout u64} (LocInfoE loc_357 ("attr"))) ; + locinfo: loc_351 ; + Return (LocInfoE loc_352 (i2v 0 i32)) ]> $ <[ "#3" := - locinfo: loc_468 ; - if: LocInfoE loc_468 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_468 ((LocInfoE loc_469 (use{it_layout u32} (LocInfoE loc_470 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_471 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_471 (i2v 2 i32))))))) + locinfo: loc_480 ; + if: LocInfoE loc_480 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_480 ((LocInfoE loc_481 (use{it_layout u32} (LocInfoE loc_482 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_483 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_483 (i2v 2 i32))))))) then - locinfo: loc_464 ; + locinfo: loc_476 ; Goto "#7" else - locinfo: loc_462 ; + locinfo: loc_474 ; Goto "#8" ]> $ <[ "#4" := - locinfo: loc_462 ; - if: LocInfoE loc_462 (use{it_layout bool_it} (LocInfoE loc_463 ("device"))) + locinfo: loc_474 ; + if: LocInfoE loc_474 (use{it_layout bool_it} (LocInfoE loc_475 ("device"))) then - locinfo: loc_458 ; + locinfo: loc_470 ; Goto "#5" else - locinfo: loc_335 ; + locinfo: loc_347 ; Goto "#6" ]> $ <[ "#5" := - locinfo: loc_458 ; - Return (LocInfoE loc_459 (UnOp NegOp (IntOp i32) (LocInfoE loc_460 (i2v 22 i32)))) + locinfo: loc_470 ; + Return (LocInfoE loc_471 (UnOp NegOp (IntOp i32) (LocInfoE loc_472 (i2v 22 i32)))) ]> $ <[ "#6" := - locinfo: loc_335 ; + locinfo: loc_347 ; Goto "#2" ]> $ <[ "#7" := - locinfo: loc_464 ; - Return (LocInfoE loc_465 (UnOp NegOp (IntOp i32) (LocInfoE loc_466 (i2v 22 i32)))) + locinfo: loc_476 ; + Return (LocInfoE loc_477 (UnOp NegOp (IntOp i32) (LocInfoE loc_478 (i2v 22 i32)))) ]> $ <[ "#8" := - locinfo: loc_462 ; + locinfo: loc_474 ; Goto "#4" ]> $ <[ "#9" := - locinfo: loc_473 ; - LocInfoE loc_474 ("attr") <-{ it_layout u64 } - LocInfoE loc_475 ((LocInfoE loc_476 (use{it_layout u64} (LocInfoE loc_477 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_478 ((LocInfoE loc_479 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_480 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_480 (i2v 54 i32))))))) ; - locinfo: loc_335 ; + locinfo: loc_485 ; + LocInfoE loc_486 ("attr") <-{ it_layout u64 } + LocInfoE loc_487 ((LocInfoE loc_488 (use{it_layout u64} (LocInfoE loc_489 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_490 ((LocInfoE loc_491 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_492 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_492 (i2v 54 i32))))))) ; + locinfo: loc_347 ; Goto "#2" ]> $∅ )%E diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index a88ce7f7..06aff26f 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -17,22 +17,22 @@ Section spec. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := fn(∀ pte : Z; (pte @ (int (u64))); True) - → ∃ () : (), ((valid pte) @ (boolean (bool_it))); True. + → ∃ () : (), ((get_field pte_valid pte) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : Z * nat; (pte @ (int (u64))), (level @ (int (u32))); True) - → ∃ () : (), ((negb (level =? 3) && valid pte && table pte) @ (boolean (bool_it))); True. + → ∃ () : (), ((bool_decide (level <> 3%nat) && get_field pte_valid pte && get_field pte_table pte) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := - fn(∀ (pte_old, p) : Z * loc; (p @ (&own (pte_old @ (int (u64))))); True) - → ∃ pte_new : Z, (void); (p ◁ₗ (pte_new @ (int (u64)))) ∗ ⌜valid pte_new = false⌝. + fn(∀ (pte, p) : Z * loc; (p @ (&own (pte @ (int (u64))))); True) + → ∃ () : (), (void); (p ◁ₗ ((put_field pte_valid false pte) @ (int (u64)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ pte : Z, (pte @ (int (u64))); ⌜pa_pte pa pte⌝. + → ∃ () : (), ((mask_field pte_addr pa) @ (int (u64))); True. (* Function [kvm_set_table_pte] has been skipped. *) diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 911a2663..c6e78dbc 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -1,14 +1,78 @@ From refinedc.typing Require Import typing. -(* TODO: pte as record *) +(* TODO: Z (infinite vector) <-> list|vec bool *) -Definition valid (pte : Z) : bool := - Z.testbit pte 0. +Record field_desc := { + field_offset : nat; + field_len : nat; + field_value_t : Type; + field_encode : field_value_t -> list bool; (* array bool field_len; vec *) + field_decode : list bool -> field_value_t; +}. -Definition table (pte : Z) : bool := - Z.testbit pte 1. +Fixpoint read_bits (offset len : nat) (bv : Z) : list bool := + match len with + | O => [] + | S n => (Z.testbit offset bv) :: read_bits (S offset) n bv + end. -(* Definition invalidate (pte : Z) : Z := . *) +Definition get_field (fd : field_desc) (bv : Z) : field_value_t fd := + field_decode fd $ read_bits (field_offset fd) (field_len fd) bv. -Definition pa_pte (pa pte : Z) : Prop := - ∀ i, 12 ≤ i ≤ 47 -> Z.testbit pa i = Z.testbit pte i. +Fixpoint write_bits (offset : nat) (v : list bool) (bv : Z) : Z := + match v with + | [] => bv + | true :: bs => Z.setbit offset $ write_bits (S offset) bs bv + | false :: bs => Z.clearbit offset $ write_bits (S offset) bs bv + end. + +Definition put_field (fd : field_desc) (v : field_value_t fd) (bv : Z) : Z := + write_bits (field_offset fd) (field_encode fd v) bv. + +Definition mask_field (fd : field_desc) (bv : Z) : Z := + put_field fd (get_field fd bv) 0. + +Definition bool_field_desc (offset : nat) := {| + field_offset := offset; + field_len := 1; + field_value_t := bool; + field_encode := λ b, [b]; + field_decode := λ l, match l with [b] => b | _ => false (* impossible *) end; +|}. + +Definition enum_field_desc (offset len : nat) (K : Type) `{EqDecision K} + (items : list (K * list bool)) (def : K) := {| + field_offset := offset; + field_len := len; + field_value_t := K; + field_encode := λ k, + let fix f l := + match l with + | [] => [] + | (x, v) :: l' => if bool_decide (x = k) then v else f l' + end + in f items; + field_decode := λ v, + let fix f l := + match l with + | [] => def + | (k, x) :: l' => if bool_decide (x = v) then k else f l' + end + in f items; +|}. + +Definition data_field_desc (offset len : nat) := {| + field_offset := offset; + field_len := len; + field_value_t := list bool; + field_encode := id; + field_decode := id; +|}. + +(* pte *) + +Definition pte_valid := bool_field_desc 0. + +Definition pte_table := bool_field_desc 1. + +Definition pte_addr := data_field_desc 12 (47 - 12 + 1). -- GitLab From 12e725e7514ce14552677872ab98f0801880666a Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 10 Mar 2021 16:58:27 +0800 Subject: [PATCH 04/71] helper types --- theories/typing/bitvec.v | 95 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 theories/typing/bitvec.v diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v new file mode 100644 index 00000000..713ebc55 --- /dev/null +++ b/theories/typing/bitvec.v @@ -0,0 +1,95 @@ +From refinedc.typing Require Export type. +From refinedc.typing Require Import programs. +Set Default Proof Using "Type". + +Record field_desc := { + fd_len : nat; + fd_type : Type; + fd_encode : fd_type → vec bool fd_len; + fd_decode : vec bool fd_len → fd_type; + encode_decode : ∀ x, fd_decode (fd_encode x) = x; +}. + +Program Definition bool_field_desc := {| + fd_len := 1; + fd_type := bool; + fd_encode b := [# b]; + fd_decode v := v !!! 0%fin; +|}. +Next Obligation. done. Qed. + +Program Definition data_field_desc (len : nat) := {| + fd_len := len; + fd_type := vec bool len; + fd_encode := id; + fd_decode := id; +|}. +Next Obligation. done. Qed. + +(* Record field := { + fd : field_desc; + data : vec bool (fd_len fd); +}. *) + +Definition field_vec {n : nat} (fdv : vec field_desc n) := + ∀ i, vec bool (fd_len (fdv !!! i)). + +Fixpoint extract_bits (start len : nat) (data : Z) : vec bool len := + match len with + | O => [#] + | S k => Z.testbit data start ::: extract_bits (S start) k data + end. + +Definition mk_fv {n : nat} (fdv : vec field_desc n) (data : Z) : field_vec fdv := + let offset i := foldr (λ fd acc, (fd_len fd + acc)%nat) 0%nat $ + vec_to_list $ vtake i fdv + in λ i, extract_bits (offset i) (fd_len (fdv !!! i)) data. + +Definition fv_get {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) (i : fin n) : fd_type (fdv !!! i) := + fd_decode (fdv !!! i) (fv i). + +Notation "fv .[ i ]" := (fv_get fv i) (at level 5, format "fv .[ i ]"). + +Definition fv_put {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) (i : fin n) (x : fd_type (fdv !!! i)) : field_vec fdv. + (* λ j, if bool_decide (i = j) then (fd_encode (fdv !!! i) x) *) + (* else fv j. *) +Proof. + move => j. + destruct (decide (i = j)) as [<-|]. + - refine (fd_encode (fdv !!! i) x). + - refine (fv j). +Defined. + +Notation "fv .[ i := x ]" := (fv_put fv i x) (at level 5, format "fv .[ i := x ]"). + +Lemma fv_get_put {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) i x : + fv.[i := x].[i] = x. +Proof. + by rewrite /fv_get /fv_put decide_left encode_decode. +Qed. + +Lemma fv_get_put_ne {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) i j x : + i ≠ j → fv.[i := x].[j] = fv.[j]. +Proof. + rewrite /fv_get /fv_put. case_match => //. +Qed. + +(* test *) +Section pte_test. + + Definition pte_fds := [# bool_field_desc; bool_field_desc; data_field_desc 2]. + + Definition valid : fin 3 := 0%fin. + Definition type : fin 3 := 1%fin. + Definition attr : fin 3 := 2%fin. + + Definition Pte := field_vec pte_fds. + Definition pte : Pte := mk_fv pte_fds 9. + + Example test_pte_get : pte.[attr] = [# false; true]. + Proof. done. Qed. + + Example test_pte_put : pte.[valid := true].[type := false].[valid] = true. + Proof. rewrite fv_get_put_ne; last done. rewrite fv_get_put. done. Qed. + +End pte_test. -- GitLab From d21e6389529febcbd1622ac66a94b31c181286f4 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 15 Mar 2021 16:17:18 +0800 Subject: [PATCH 05/71] define bitvec type --- linux/casestudies/pgtable.c | 56 +- .../proofs/pgtable/generated_code.v | 1250 +++++++++-------- .../proofs/pgtable/generated_spec.v | 14 +- .../proofs/pgtable/pgtable_lemmas.v | 96 +- theories/typing/bitvec.v | 152 +- 5 files changed, 794 insertions(+), 774 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 7b0a5d15..7dfbb03f 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -7,12 +7,11 @@ typedef uint64_t u64; typedef uint32_t u32; -/* ??? */ - #define PAGE_SHIFT 12 #define WRITE_ONCE(a, b) ((a) = (b)) #define BITS_PER_LONG (sizeof(long) * 8) #define EINVAL 22 /* Invalid argument */ +#define WARN_ON(b) (assert(b)) /* linux/bits.h */ @@ -159,27 +158,19 @@ struct kvm_pgtable_mm_ops { #define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) // #define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) -// TODO: typing rule for `NotIntOp` is missing? -// [[rc::parameters("x : Z")]] -// [[rc::args("x @ int")]] -// [[rc::returns("{Z.lnot x} @ int")]] -// static int not_int(int x) -// { -// return ~x; -// } - -[[rc::parameters("pte : Z")]] -[[rc::args("pte @ int")]] -[[rc::returns("{get_field pte_valid pte} @ boolean")]] +[[rc::parameters("pte : {bvec Pte}")]] +[[rc::args("pte @ bitvec")]] +[[rc::returns("{pte.[valid]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; } -[[rc::parameters("pte : Z", "level : nat")]] -[[rc::args("pte @ int", "level @ int")]] -[[rc::returns("{bool_decide (level <> 3%nat) && get_field pte_valid pte && get_field pte_table pte} @ boolean")]] +[[rc::parameters("pte : {bvec Pte}", "level : Z")]] +[[rc::args("pte @ bitvec", "level @ int")]] +[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && \ + bool_decide (pte.[page_or_table])} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -190,9 +181,9 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) return FIELD_GET(KVM_PTE_TYPE, pte) == KVM_PTE_TYPE_TABLE; } -[[rc::parameters("pte : Z", "p : loc")]] -[[rc::args("p @ &own>")]] -[[rc::ensures("own p : {put_field pte_valid false pte} @ int")]] +[[rc::parameters("pte : {bvec Pte}", "p : loc")]] +[[rc::args("p @ &own>")]] +[[rc::ensures("own p : {pte.[valid := false]} @ bitvec")]] [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -202,29 +193,48 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] -[[rc::returns("{mask_field pte_addr pa} @ int")]] +[[rc::returns("{(empty_bvec Pte).[addr := (as_bvec Pte pa).[addr]]} @ bitvec")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; - if (PAGE_SHIFT == 16) // false if PAGE_SHIFT == 12 + if (PAGE_SHIFT == 16) // always false given PAGE_SHIFT == 12 pte |= FIELD_PREP(KVM_PTE_ADDR_51_48, pa >> 48); return pte; } +// [[rc::parameters("p : loc", "q : loc", "o : ???", "pte : Pte", "va : Z", "ops : mm_ops")]] +// [[rc::args("p @ &own>", "q @ &own>", "o @ &own")]] +// [[rc::requires("{pte.[valid] = true}")]] +// [[rc::exists("pa : Z")]] +// [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] +// [[rc::ensures("own p : {pte.[addr := pa.addr; page_or_table := true; valid := true]} @ bitvec")]] +// [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) { kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp)); pte |= FIELD_PREP(KVM_PTE_TYPE, KVM_PTE_TYPE_TABLE); pte |= KVM_PTE_VALID; - // WARN_ON(kvm_pte_valid(old)); TODO: assert + WARN_ON(kvm_pte_valid(old)); // ??? // smp_store_release(ptep, pte); *ptep = pte; } +// [[rc::parameters("p : loc", "pte : Pte", "pa : Z", "attr : Pte", "level : nat")]] +// [[rc::args("p @ &own>", "pa @ int", "attr @ bitvec", "level @ int")]] +// [[rc::exists("is_page : bool")]] +// [[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] +// [[rc::exists("pa' : Pte")]] +// [[rc::ensures("pa' = mk_fv pte_fds pa")]] +// [[rc::exists("pte' : Pte")]] +// [[rc::ensures("{pte' = empty.[addr := pa'.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; \ +// leaf_attr_hi := attr.[leaf_attr_hi]; page_or_table := is_page; valid := true]}")]] +// [[rc::ensures("own p : {if pte.[valid] then pte else pte'} @ bitvec")]] +// [[rc::returns("{if pte.[valid] then bool_decide (pte = pte') else true}")]] +// [[rc::trust_me]] static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, u32 level) { diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index d0230459..3345281a 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,540 +6,546 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 177 4 177 30. - Definition loc_3 : location_info := LocationInfo file_0 177 11 177 29. - Definition loc_4 : location_info := LocationInfo file_0 177 11 177 14. - Definition loc_5 : location_info := LocationInfo file_0 177 11 177 14. - Definition loc_6 : location_info := LocationInfo file_0 177 17 177 29. - Definition loc_7 : location_info := LocationInfo file_0 177 18 177 21. - Definition loc_8 : location_info := LocationInfo file_0 177 25 177 28. - Definition loc_11 : location_info := LocationInfo file_0 186 4 187 17. - Definition loc_12 : location_info := LocationInfo file_0 188 4 189 17. - Definition loc_13 : location_info := LocationInfo file_0 190 4 190 82. - Definition loc_14 : location_info := LocationInfo file_0 190 11 190 81. - Definition loc_15 : location_info := LocationInfo file_0 190 11 190 76. - Definition loc_16 : location_info := LocationInfo file_0 190 12 190 36. - Definition loc_17 : location_info := LocationInfo file_0 190 13 190 18. - Definition loc_18 : location_info := LocationInfo file_0 190 13 190 18. - Definition loc_19 : location_info := LocationInfo file_0 190 21 190 35. - Definition loc_20 : location_info := LocationInfo file_0 190 23 190 26. - Definition loc_21 : location_info := LocationInfo file_0 190 30 190 33. - Definition loc_22 : location_info := LocationInfo file_0 190 40 190 75. - Definition loc_23 : location_info := LocationInfo file_0 190 41 190 70. - Definition loc_24 : location_info := LocationInfo file_0 190 41 190 56. - Definition loc_25 : location_info := LocationInfo file_0 190 41 190 56. - Definition loc_26 : location_info := LocationInfo file_0 190 57 190 69. - Definition loc_27 : location_info := LocationInfo file_0 190 58 190 61. - Definition loc_28 : location_info := LocationInfo file_0 190 65 190 68. - Definition loc_29 : location_info := LocationInfo file_0 190 73 190 74. - Definition loc_30 : location_info := LocationInfo file_0 190 80 190 81. - Definition loc_31 : location_info := LocationInfo file_0 189 8 189 17. - Definition loc_32 : location_info := LocationInfo file_0 189 15 189 16. - Definition loc_34 : location_info := LocationInfo file_0 188 8 188 27. - Definition loc_36 : location_info := LocationInfo file_0 188 9 188 27. - Definition loc_37 : location_info := LocationInfo file_0 188 9 188 22. - Definition loc_38 : location_info := LocationInfo file_0 188 9 188 22. - Definition loc_39 : location_info := LocationInfo file_0 188 23 188 26. - Definition loc_40 : location_info := LocationInfo file_0 188 23 188 26. - Definition loc_41 : location_info := LocationInfo file_0 187 8 187 17. - Definition loc_42 : location_info := LocationInfo file_0 187 15 187 16. - Definition loc_44 : location_info := LocationInfo file_0 186 8 186 23. - Definition loc_45 : location_info := LocationInfo file_0 186 8 186 13. - Definition loc_46 : location_info := LocationInfo file_0 186 8 186 13. - Definition loc_47 : location_info := LocationInfo file_0 186 17 186 23. - Definition loc_48 : location_info := LocationInfo file_0 186 17 186 19. - Definition loc_49 : location_info := LocationInfo file_0 186 22 186 23. - Definition loc_52 : location_info := LocationInfo file_0 199 4 199 26. - Definition loc_53 : location_info := LocationInfo file_0 200 4 200 38. - Definition loc_54 : location_info := LocationInfo file_0 200 5 200 12. - Definition loc_55 : location_info := LocationInfo file_0 200 7 200 11. - Definition loc_56 : location_info := LocationInfo file_0 200 7 200 11. - Definition loc_57 : location_info := LocationInfo file_0 200 15 200 36. - Definition loc_58 : location_info := LocationInfo file_0 200 16 200 19. - Definition loc_59 : location_info := LocationInfo file_0 200 16 200 19. - Definition loc_60 : location_info := LocationInfo file_0 200 22 200 35. - Definition loc_61 : location_info := LocationInfo file_0 200 23 200 35. - Definition loc_62 : location_info := LocationInfo file_0 200 24 200 27. - Definition loc_63 : location_info := LocationInfo file_0 200 31 200 34. - Definition loc_64 : location_info := LocationInfo file_0 199 20 199 25. - Definition loc_65 : location_info := LocationInfo file_0 199 20 199 25. - Definition loc_66 : location_info := LocationInfo file_0 199 21 199 25. - Definition loc_67 : location_info := LocationInfo file_0 199 21 199 25. - Definition loc_72 : location_info := LocationInfo file_0 209 4 209 100. - Definition loc_73 : location_info := LocationInfo file_0 211 4 212 210. - Definition loc_74 : location_info := LocationInfo file_0 214 4 214 15. - Definition loc_75 : location_info := LocationInfo file_0 214 11 214 14. - Definition loc_76 : location_info := LocationInfo file_0 214 11 214 14. - Definition loc_77 : location_info := LocationInfo file_0 212 8 212 210. - Definition loc_78 : location_info := LocationInfo file_0 212 8 212 11. - Definition loc_79 : location_info := LocationInfo file_0 212 8 212 209. - Definition loc_80 : location_info := LocationInfo file_0 212 8 212 11. - Definition loc_81 : location_info := LocationInfo file_0 212 8 212 11. - Definition loc_82 : location_info := LocationInfo file_0 212 15 212 209. - Definition loc_83 : location_info := LocationInfo file_0 212 16 212 129. - Definition loc_84 : location_info := LocationInfo file_0 212 17 212 27. - Definition loc_85 : location_info := LocationInfo file_0 212 18 212 20. - Definition loc_86 : location_info := LocationInfo file_0 212 18 212 20. - Definition loc_87 : location_info := LocationInfo file_0 212 24 212 26. - Definition loc_88 : location_info := LocationInfo file_0 212 31 212 128. - Definition loc_89 : location_info := LocationInfo file_0 212 32 212 123. - Definition loc_90 : location_info := LocationInfo file_0 212 32 212 47. - Definition loc_91 : location_info := LocationInfo file_0 212 32 212 47. - Definition loc_92 : location_info := LocationInfo file_0 212 48 212 122. - Definition loc_93 : location_info := LocationInfo file_0 212 49 212 77. - Definition loc_94 : location_info := LocationInfo file_0 212 50 212 72. - Definition loc_95 : location_info := LocationInfo file_0 212 50 212 56. - Definition loc_96 : location_info := LocationInfo file_0 212 52 212 55. - Definition loc_97 : location_info := LocationInfo file_0 212 59 212 72. - Definition loc_98 : location_info := LocationInfo file_0 212 60 212 63. - Definition loc_99 : location_info := LocationInfo file_0 212 67 212 71. - Definition loc_100 : location_info := LocationInfo file_0 212 75 212 76. - Definition loc_101 : location_info := LocationInfo file_0 212 80 212 121. - Definition loc_102 : location_info := LocationInfo file_0 212 81 212 85. - Definition loc_103 : location_info := LocationInfo file_0 212 82 212 85. - Definition loc_104 : location_info := LocationInfo file_0 212 89 212 120. - Definition loc_105 : location_info := LocationInfo file_0 212 90 212 112. - Definition loc_106 : location_info := LocationInfo file_0 212 90 212 108. - Definition loc_107 : location_info := LocationInfo file_0 212 91 212 103. - Definition loc_108 : location_info := LocationInfo file_0 212 106 212 107. - Definition loc_109 : location_info := LocationInfo file_0 212 111 212 112. - Definition loc_110 : location_info := LocationInfo file_0 212 115 212 119. - Definition loc_111 : location_info := LocationInfo file_0 212 126 212 127. - Definition loc_112 : location_info := LocationInfo file_0 212 132 212 208. - Definition loc_113 : location_info := LocationInfo file_0 212 134 212 162. - Definition loc_114 : location_info := LocationInfo file_0 212 135 212 157. - Definition loc_115 : location_info := LocationInfo file_0 212 135 212 141. - Definition loc_116 : location_info := LocationInfo file_0 212 137 212 140. - Definition loc_117 : location_info := LocationInfo file_0 212 144 212 157. - Definition loc_118 : location_info := LocationInfo file_0 212 145 212 148. - Definition loc_119 : location_info := LocationInfo file_0 212 152 212 156. - Definition loc_120 : location_info := LocationInfo file_0 212 160 212 161. - Definition loc_121 : location_info := LocationInfo file_0 212 165 212 206. - Definition loc_122 : location_info := LocationInfo file_0 212 166 212 170. - Definition loc_123 : location_info := LocationInfo file_0 212 167 212 170. - Definition loc_124 : location_info := LocationInfo file_0 212 174 212 205. - Definition loc_125 : location_info := LocationInfo file_0 212 175 212 197. - Definition loc_126 : location_info := LocationInfo file_0 212 175 212 193. - Definition loc_127 : location_info := LocationInfo file_0 212 176 212 188. - Definition loc_128 : location_info := LocationInfo file_0 212 191 212 192. - Definition loc_129 : location_info := LocationInfo file_0 212 196 212 197. - Definition loc_130 : location_info := LocationInfo file_0 212 200 212 204. - Definition loc_132 : location_info := LocationInfo file_0 211 8 211 16. - Definition loc_133 : location_info := LocationInfo file_0 211 8 211 10. - Definition loc_134 : location_info := LocationInfo file_0 211 14 211 16. - Definition loc_135 : location_info := LocationInfo file_0 209 20 209 99. - Definition loc_136 : location_info := LocationInfo file_0 209 20 209 22. - Definition loc_137 : location_info := LocationInfo file_0 209 20 209 22. - Definition loc_138 : location_info := LocationInfo file_0 209 25 209 99. - Definition loc_139 : location_info := LocationInfo file_0 209 26 209 54. - Definition loc_140 : location_info := LocationInfo file_0 209 27 209 49. - Definition loc_141 : location_info := LocationInfo file_0 209 27 209 33. - Definition loc_142 : location_info := LocationInfo file_0 209 29 209 32. - Definition loc_143 : location_info := LocationInfo file_0 209 36 209 49. - Definition loc_144 : location_info := LocationInfo file_0 209 37 209 40. - Definition loc_145 : location_info := LocationInfo file_0 209 44 209 48. - Definition loc_146 : location_info := LocationInfo file_0 209 52 209 53. - Definition loc_147 : location_info := LocationInfo file_0 209 57 209 98. - Definition loc_148 : location_info := LocationInfo file_0 209 58 209 62. - Definition loc_149 : location_info := LocationInfo file_0 209 59 209 62. - Definition loc_150 : location_info := LocationInfo file_0 209 66 209 97. - Definition loc_151 : location_info := LocationInfo file_0 209 67 209 89. - Definition loc_152 : location_info := LocationInfo file_0 209 67 209 85. - Definition loc_153 : location_info := LocationInfo file_0 209 68 209 80. - Definition loc_154 : location_info := LocationInfo file_0 209 83 209 84. - Definition loc_155 : location_info := LocationInfo file_0 209 88 209 89. - Definition loc_156 : location_info := LocationInfo file_0 209 92 209 96. - Definition loc_161 : location_info := LocationInfo file_0 220 4 220 79. - Definition loc_162 : location_info := LocationInfo file_0 221 4 221 75. - Definition loc_163 : location_info := LocationInfo file_0 222 4 222 24. - Definition loc_164 : location_info := LocationInfo file_0 225 1 225 13. - Definition loc_165 : location_info := LocationInfo file_0 225 1 225 6. - Definition loc_166 : location_info := LocationInfo file_0 225 2 225 6. - Definition loc_167 : location_info := LocationInfo file_0 225 2 225 6. - Definition loc_168 : location_info := LocationInfo file_0 225 9 225 12. - Definition loc_169 : location_info := LocationInfo file_0 225 9 225 12. - Definition loc_170 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_171 : location_info := LocationInfo file_0 222 4 222 23. - Definition loc_172 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_173 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_174 : location_info := LocationInfo file_0 222 11 222 23. - Definition loc_175 : location_info := LocationInfo file_0 222 12 222 15. - Definition loc_176 : location_info := LocationInfo file_0 222 19 222 22. - Definition loc_177 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_178 : location_info := LocationInfo file_0 221 4 221 74. - Definition loc_179 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_180 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_181 : location_info := LocationInfo file_0 221 11 221 74. - Definition loc_182 : location_info := LocationInfo file_0 221 12 221 56. - Definition loc_183 : location_info := LocationInfo file_0 221 13 221 16. - Definition loc_184 : location_info := LocationInfo file_0 221 20 221 55. - Definition loc_185 : location_info := LocationInfo file_0 221 21 221 50. - Definition loc_186 : location_info := LocationInfo file_0 221 21 221 36. - Definition loc_187 : location_info := LocationInfo file_0 221 21 221 36. - Definition loc_188 : location_info := LocationInfo file_0 221 37 221 49. - Definition loc_189 : location_info := LocationInfo file_0 221 38 221 41. - Definition loc_190 : location_info := LocationInfo file_0 221 45 221 48. - Definition loc_191 : location_info := LocationInfo file_0 221 53 221 54. - Definition loc_192 : location_info := LocationInfo file_0 221 59 221 73. - Definition loc_193 : location_info := LocationInfo file_0 221 61 221 64. - Definition loc_194 : location_info := LocationInfo file_0 221 68 221 71. - Definition loc_195 : location_info := LocationInfo file_0 220 33 220 78. - Definition loc_196 : location_info := LocationInfo file_0 220 33 220 48. - Definition loc_197 : location_info := LocationInfo file_0 220 33 220 48. - Definition loc_198 : location_info := LocationInfo file_0 220 49 220 77. - Definition loc_199 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_200 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_201 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_202 : location_info := LocationInfo file_0 220 49 220 55. - Definition loc_203 : location_info := LocationInfo file_0 220 49 220 55. - Definition loc_204 : location_info := LocationInfo file_0 220 70 220 76. - Definition loc_205 : location_info := LocationInfo file_0 220 70 220 76. - Definition loc_208 : location_info := LocationInfo file_0 220 20 220 25. - Definition loc_209 : location_info := LocationInfo file_0 220 20 220 25. - Definition loc_210 : location_info := LocationInfo file_0 220 21 220 25. - Definition loc_211 : location_info := LocationInfo file_0 220 21 220 25. - Definition loc_216 : location_info := LocationInfo file_0 231 4 231 53. - Definition loc_217 : location_info := LocationInfo file_0 232 4 233 33. - Definition loc_218 : location_info := LocationInfo file_0 234 4 234 171. - Definition loc_219 : location_info := LocationInfo file_0 235 4 235 78. - Definition loc_220 : location_info := LocationInfo file_0 236 4 236 24. - Definition loc_221 : location_info := LocationInfo file_0 238 4 239 26. - Definition loc_222 : location_info := LocationInfo file_0 241 1 241 13. - Definition loc_223 : location_info := LocationInfo file_0 242 4 242 13. - Definition loc_224 : location_info := LocationInfo file_0 242 11 242 12. - Definition loc_225 : location_info := LocationInfo file_0 241 1 241 6. - Definition loc_226 : location_info := LocationInfo file_0 241 2 241 6. - Definition loc_227 : location_info := LocationInfo file_0 241 2 241 6. - Definition loc_228 : location_info := LocationInfo file_0 241 9 241 12. - Definition loc_229 : location_info := LocationInfo file_0 241 9 241 12. - Definition loc_230 : location_info := LocationInfo file_0 239 8 239 26. - Definition loc_231 : location_info := LocationInfo file_0 239 15 239 25. - Definition loc_232 : location_info := LocationInfo file_0 239 15 239 18. - Definition loc_233 : location_info := LocationInfo file_0 239 15 239 18. - Definition loc_234 : location_info := LocationInfo file_0 239 22 239 25. - Definition loc_235 : location_info := LocationInfo file_0 239 22 239 25. - Definition loc_237 : location_info := LocationInfo file_0 238 8 238 26. - Definition loc_238 : location_info := LocationInfo file_0 238 8 238 21. - Definition loc_239 : location_info := LocationInfo file_0 238 8 238 21. - Definition loc_240 : location_info := LocationInfo file_0 238 22 238 25. - Definition loc_241 : location_info := LocationInfo file_0 238 22 238 25. - Definition loc_242 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_243 : location_info := LocationInfo file_0 236 4 236 23. - Definition loc_244 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_245 : location_info := LocationInfo file_0 236 4 236 7. - Definition loc_246 : location_info := LocationInfo file_0 236 11 236 23. - Definition loc_247 : location_info := LocationInfo file_0 236 12 236 15. - Definition loc_248 : location_info := LocationInfo file_0 236 19 236 22. - Definition loc_249 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_250 : location_info := LocationInfo file_0 235 4 235 77. - Definition loc_251 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_252 : location_info := LocationInfo file_0 235 4 235 7. - Definition loc_253 : location_info := LocationInfo file_0 235 11 235 77. - Definition loc_254 : location_info := LocationInfo file_0 235 12 235 59. - Definition loc_255 : location_info := LocationInfo file_0 235 13 235 19. - Definition loc_256 : location_info := LocationInfo file_0 235 13 235 19. - Definition loc_257 : location_info := LocationInfo file_0 235 23 235 58. - Definition loc_258 : location_info := LocationInfo file_0 235 24 235 53. - Definition loc_259 : location_info := LocationInfo file_0 235 24 235 39. - Definition loc_260 : location_info := LocationInfo file_0 235 24 235 39. - Definition loc_261 : location_info := LocationInfo file_0 235 40 235 52. - Definition loc_262 : location_info := LocationInfo file_0 235 41 235 44. - Definition loc_263 : location_info := LocationInfo file_0 235 48 235 51. - Definition loc_264 : location_info := LocationInfo file_0 235 56 235 57. - Definition loc_265 : location_info := LocationInfo file_0 235 62 235 76. - Definition loc_266 : location_info := LocationInfo file_0 235 64 235 67. - Definition loc_267 : location_info := LocationInfo file_0 235 71 235 74. - Definition loc_268 : location_info := LocationInfo file_0 234 4 234 7. - Definition loc_269 : location_info := LocationInfo file_0 234 4 234 170. - Definition loc_270 : location_info := LocationInfo file_0 234 4 234 7. - Definition loc_271 : location_info := LocationInfo file_0 234 4 234 7. - Definition loc_272 : location_info := LocationInfo file_0 234 11 234 170. - Definition loc_273 : location_info := LocationInfo file_0 234 11 234 15. - Definition loc_274 : location_info := LocationInfo file_0 234 11 234 15. - Definition loc_275 : location_info := LocationInfo file_0 234 18 234 170. - Definition loc_276 : location_info := LocationInfo file_0 234 19 234 92. - Definition loc_277 : location_info := LocationInfo file_0 234 20 234 47. - Definition loc_278 : location_info := LocationInfo file_0 234 21 234 42. - Definition loc_279 : location_info := LocationInfo file_0 234 21 234 27. - Definition loc_280 : location_info := LocationInfo file_0 234 23 234 26. - Definition loc_281 : location_info := LocationInfo file_0 234 30 234 42. - Definition loc_282 : location_info := LocationInfo file_0 234 31 234 34. - Definition loc_283 : location_info := LocationInfo file_0 234 38 234 41. - Definition loc_284 : location_info := LocationInfo file_0 234 45 234 46. - Definition loc_285 : location_info := LocationInfo file_0 234 50 234 91. - Definition loc_286 : location_info := LocationInfo file_0 234 51 234 55. - Definition loc_287 : location_info := LocationInfo file_0 234 52 234 55. - Definition loc_288 : location_info := LocationInfo file_0 234 59 234 90. - Definition loc_289 : location_info := LocationInfo file_0 234 60 234 82. - Definition loc_290 : location_info := LocationInfo file_0 234 60 234 78. - Definition loc_291 : location_info := LocationInfo file_0 234 61 234 73. - Definition loc_292 : location_info := LocationInfo file_0 234 76 234 77. - Definition loc_293 : location_info := LocationInfo file_0 234 81 234 82. - Definition loc_294 : location_info := LocationInfo file_0 234 85 234 89. - Definition loc_295 : location_info := LocationInfo file_0 234 95 234 169. - Definition loc_296 : location_info := LocationInfo file_0 234 96 234 124. - Definition loc_297 : location_info := LocationInfo file_0 234 97 234 119. - Definition loc_298 : location_info := LocationInfo file_0 234 97 234 103. - Definition loc_299 : location_info := LocationInfo file_0 234 99 234 102. - Definition loc_300 : location_info := LocationInfo file_0 234 106 234 119. - Definition loc_301 : location_info := LocationInfo file_0 234 107 234 110. - Definition loc_302 : location_info := LocationInfo file_0 234 114 234 118. - Definition loc_303 : location_info := LocationInfo file_0 234 122 234 123. - Definition loc_304 : location_info := LocationInfo file_0 234 127 234 168. - Definition loc_305 : location_info := LocationInfo file_0 234 128 234 132. - Definition loc_306 : location_info := LocationInfo file_0 234 129 234 132. - Definition loc_307 : location_info := LocationInfo file_0 234 136 234 167. - Definition loc_308 : location_info := LocationInfo file_0 234 137 234 159. - Definition loc_309 : location_info := LocationInfo file_0 234 137 234 155. - Definition loc_310 : location_info := LocationInfo file_0 234 138 234 150. - Definition loc_311 : location_info := LocationInfo file_0 234 153 234 154. - Definition loc_312 : location_info := LocationInfo file_0 234 158 234 159. - Definition loc_313 : location_info := LocationInfo file_0 234 162 234 166. - Definition loc_314 : location_info := LocationInfo file_0 232 15 233 32. - Definition loc_315 : location_info := LocationInfo file_0 232 15 232 32. - Definition loc_316 : location_info := LocationInfo file_0 232 16 232 21. - Definition loc_317 : location_info := LocationInfo file_0 232 16 232 21. - Definition loc_318 : location_info := LocationInfo file_0 232 25 232 31. - Definition loc_319 : location_info := LocationInfo file_0 232 25 232 27. - Definition loc_320 : location_info := LocationInfo file_0 232 30 232 31. - Definition loc_321 : location_info := LocationInfo file_0 232 35 232 36. - Definition loc_322 : location_info := LocationInfo file_0 233 31 233 32. - Definition loc_325 : location_info := LocationInfo file_0 231 33 231 52. - Definition loc_326 : location_info := LocationInfo file_0 231 33 231 48. - Definition loc_327 : location_info := LocationInfo file_0 231 33 231 48. - Definition loc_328 : location_info := LocationInfo file_0 231 49 231 51. - Definition loc_329 : location_info := LocationInfo file_0 231 49 231 51. - Definition loc_332 : location_info := LocationInfo file_0 231 20 231 25. - Definition loc_333 : location_info := LocationInfo file_0 231 20 231 25. - Definition loc_334 : location_info := LocationInfo file_0 231 21 231 25. - Definition loc_335 : location_info := LocationInfo file_0 231 21 231 25. - Definition loc_340 : location_info := LocationInfo file_0 254 4 254 50. - Definition loc_341 : location_info := LocationInfo file_0 255 4 255 31. - Definition loc_342 : location_info := LocationInfo file_0 256 4 256 209. - Definition loc_343 : location_info := LocationInfo file_0 257 4 257 15. - Definition loc_344 : location_info := LocationInfo file_0 258 4 259 29. - Definition loc_345 : location_info := LocationInfo file_0 260 4 261 19. - Definition loc_346 : location_info := LocationInfo file_0 262 4 269 5. - Definition loc_347 : location_info := LocationInfo file_0 270 4 270 197. - Definition loc_348 : location_info := LocationInfo file_0 271 4 271 197. - Definition loc_349 : location_info := LocationInfo file_0 272 4 272 26. - Definition loc_350 : location_info := LocationInfo file_0 273 4 273 22. - Definition loc_351 : location_info := LocationInfo file_0 274 4 274 13. - Definition loc_352 : location_info := LocationInfo file_0 274 11 274 12. - Definition loc_353 : location_info := LocationInfo file_0 273 4 273 14. - Definition loc_354 : location_info := LocationInfo file_0 273 4 273 8. - Definition loc_355 : location_info := LocationInfo file_0 273 4 273 8. - Definition loc_356 : location_info := LocationInfo file_0 273 17 273 21. - Definition loc_357 : location_info := LocationInfo file_0 273 17 273 21. - Definition loc_358 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_359 : location_info := LocationInfo file_0 272 4 272 25. - Definition loc_360 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_361 : location_info := LocationInfo file_0 272 4 272 8. - Definition loc_362 : location_info := LocationInfo file_0 272 12 272 25. - Definition loc_363 : location_info := LocationInfo file_0 272 13 272 16. - Definition loc_364 : location_info := LocationInfo file_0 272 20 272 24. - Definition loc_365 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_366 : location_info := LocationInfo file_0 271 4 271 196. - Definition loc_367 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_368 : location_info := LocationInfo file_0 271 4 271 8. - Definition loc_369 : location_info := LocationInfo file_0 271 12 271 196. - Definition loc_370 : location_info := LocationInfo file_0 271 13 271 118. - Definition loc_371 : location_info := LocationInfo file_0 271 14 271 18. - Definition loc_372 : location_info := LocationInfo file_0 271 14 271 18. - Definition loc_373 : location_info := LocationInfo file_0 271 22 271 117. - Definition loc_374 : location_info := LocationInfo file_0 271 23 271 112. - Definition loc_375 : location_info := LocationInfo file_0 271 23 271 38. - Definition loc_376 : location_info := LocationInfo file_0 271 23 271 38. - Definition loc_377 : location_info := LocationInfo file_0 271 39 271 111. - Definition loc_378 : location_info := LocationInfo file_0 271 40 271 67. - Definition loc_379 : location_info := LocationInfo file_0 271 41 271 62. - Definition loc_380 : location_info := LocationInfo file_0 271 41 271 47. - Definition loc_381 : location_info := LocationInfo file_0 271 43 271 46. - Definition loc_382 : location_info := LocationInfo file_0 271 50 271 62. - Definition loc_383 : location_info := LocationInfo file_0 271 51 271 54. - Definition loc_384 : location_info := LocationInfo file_0 271 58 271 61. - Definition loc_385 : location_info := LocationInfo file_0 271 65 271 66. - Definition loc_386 : location_info := LocationInfo file_0 271 70 271 110. - Definition loc_387 : location_info := LocationInfo file_0 271 71 271 75. - Definition loc_388 : location_info := LocationInfo file_0 271 72 271 75. - Definition loc_389 : location_info := LocationInfo file_0 271 79 271 109. - Definition loc_390 : location_info := LocationInfo file_0 271 80 271 102. - Definition loc_391 : location_info := LocationInfo file_0 271 80 271 98. - Definition loc_392 : location_info := LocationInfo file_0 271 81 271 93. - Definition loc_393 : location_info := LocationInfo file_0 271 96 271 97. - Definition loc_394 : location_info := LocationInfo file_0 271 101 271 102. - Definition loc_395 : location_info := LocationInfo file_0 271 105 271 108. - Definition loc_396 : location_info := LocationInfo file_0 271 115 271 116. - Definition loc_397 : location_info := LocationInfo file_0 271 121 271 195. - Definition loc_398 : location_info := LocationInfo file_0 271 123 271 150. - Definition loc_399 : location_info := LocationInfo file_0 271 124 271 145. - Definition loc_400 : location_info := LocationInfo file_0 271 124 271 130. - Definition loc_401 : location_info := LocationInfo file_0 271 126 271 129. - Definition loc_402 : location_info := LocationInfo file_0 271 133 271 145. - Definition loc_403 : location_info := LocationInfo file_0 271 134 271 137. - Definition loc_404 : location_info := LocationInfo file_0 271 141 271 144. - Definition loc_405 : location_info := LocationInfo file_0 271 148 271 149. - Definition loc_406 : location_info := LocationInfo file_0 271 153 271 193. - Definition loc_407 : location_info := LocationInfo file_0 271 154 271 158. - Definition loc_408 : location_info := LocationInfo file_0 271 155 271 158. - Definition loc_409 : location_info := LocationInfo file_0 271 162 271 192. - Definition loc_410 : location_info := LocationInfo file_0 271 163 271 185. - Definition loc_411 : location_info := LocationInfo file_0 271 163 271 181. - Definition loc_412 : location_info := LocationInfo file_0 271 164 271 176. - Definition loc_413 : location_info := LocationInfo file_0 271 179 271 180. - Definition loc_414 : location_info := LocationInfo file_0 271 184 271 185. - Definition loc_415 : location_info := LocationInfo file_0 271 188 271 191. - Definition loc_416 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_417 : location_info := LocationInfo file_0 270 4 270 196. - Definition loc_418 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_419 : location_info := LocationInfo file_0 270 4 270 8. - Definition loc_420 : location_info := LocationInfo file_0 270 12 270 196. - Definition loc_421 : location_info := LocationInfo file_0 270 13 270 118. - Definition loc_422 : location_info := LocationInfo file_0 270 14 270 18. - Definition loc_423 : location_info := LocationInfo file_0 270 14 270 18. - Definition loc_424 : location_info := LocationInfo file_0 270 22 270 117. - Definition loc_425 : location_info := LocationInfo file_0 270 23 270 112. - Definition loc_426 : location_info := LocationInfo file_0 270 23 270 38. - Definition loc_427 : location_info := LocationInfo file_0 270 23 270 38. - Definition loc_428 : location_info := LocationInfo file_0 270 39 270 111. - Definition loc_429 : location_info := LocationInfo file_0 270 40 270 67. - Definition loc_430 : location_info := LocationInfo file_0 270 41 270 62. - Definition loc_431 : location_info := LocationInfo file_0 270 41 270 47. - Definition loc_432 : location_info := LocationInfo file_0 270 43 270 46. - Definition loc_433 : location_info := LocationInfo file_0 270 50 270 62. - Definition loc_434 : location_info := LocationInfo file_0 270 51 270 54. - Definition loc_435 : location_info := LocationInfo file_0 270 58 270 61. - Definition loc_436 : location_info := LocationInfo file_0 270 65 270 66. - Definition loc_437 : location_info := LocationInfo file_0 270 70 270 110. - Definition loc_438 : location_info := LocationInfo file_0 270 71 270 75. - Definition loc_439 : location_info := LocationInfo file_0 270 72 270 75. - Definition loc_440 : location_info := LocationInfo file_0 270 79 270 109. - Definition loc_441 : location_info := LocationInfo file_0 270 80 270 102. - Definition loc_442 : location_info := LocationInfo file_0 270 80 270 98. - Definition loc_443 : location_info := LocationInfo file_0 270 81 270 93. - Definition loc_444 : location_info := LocationInfo file_0 270 96 270 97. - Definition loc_445 : location_info := LocationInfo file_0 270 101 270 102. - Definition loc_446 : location_info := LocationInfo file_0 270 105 270 108. - Definition loc_447 : location_info := LocationInfo file_0 270 115 270 116. - Definition loc_448 : location_info := LocationInfo file_0 270 121 270 195. - Definition loc_449 : location_info := LocationInfo file_0 270 123 270 150. - Definition loc_450 : location_info := LocationInfo file_0 270 124 270 145. - Definition loc_451 : location_info := LocationInfo file_0 270 124 270 130. - Definition loc_452 : location_info := LocationInfo file_0 270 126 270 129. - Definition loc_453 : location_info := LocationInfo file_0 270 133 270 145. - Definition loc_454 : location_info := LocationInfo file_0 270 134 270 137. - Definition loc_455 : location_info := LocationInfo file_0 270 141 270 144. - Definition loc_456 : location_info := LocationInfo file_0 270 148 270 149. - Definition loc_457 : location_info := LocationInfo file_0 270 153 270 193. - Definition loc_458 : location_info := LocationInfo file_0 270 154 270 158. - Definition loc_459 : location_info := LocationInfo file_0 270 155 270 158. - Definition loc_460 : location_info := LocationInfo file_0 270 162 270 192. - Definition loc_461 : location_info := LocationInfo file_0 270 163 270 185. - Definition loc_462 : location_info := LocationInfo file_0 270 163 270 181. - Definition loc_463 : location_info := LocationInfo file_0 270 164 270 176. - Definition loc_464 : location_info := LocationInfo file_0 270 179 270 180. - Definition loc_465 : location_info := LocationInfo file_0 270 184 270 185. - Definition loc_466 : location_info := LocationInfo file_0 270 188 270 191. - Definition loc_467 : location_info := LocationInfo file_0 262 35 267 5. - Definition loc_468 : location_info := LocationInfo file_0 263 8 264 23. - Definition loc_469 : location_info := LocationInfo file_0 265 8 266 23. - Definition loc_470 : location_info := LocationInfo file_0 266 12 266 23. - Definition loc_471 : location_info := LocationInfo file_0 266 19 266 22. - Definition loc_472 : location_info := LocationInfo file_0 266 20 266 22. - Definition loc_474 : location_info := LocationInfo file_0 265 12 265 18. - Definition loc_475 : location_info := LocationInfo file_0 265 12 265 18. - Definition loc_476 : location_info := LocationInfo file_0 264 12 264 23. - Definition loc_477 : location_info := LocationInfo file_0 264 19 264 22. - Definition loc_478 : location_info := LocationInfo file_0 264 20 264 22. - Definition loc_480 : location_info := LocationInfo file_0 263 12 263 37. - Definition loc_481 : location_info := LocationInfo file_0 263 12 263 16. - Definition loc_482 : location_info := LocationInfo file_0 263 12 263 16. - Definition loc_483 : location_info := LocationInfo file_0 263 19 263 37. - Definition loc_484 : location_info := LocationInfo file_0 267 11 269 5. - Definition loc_485 : location_info := LocationInfo file_0 268 8 268 30. - Definition loc_486 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_487 : location_info := LocationInfo file_0 268 8 268 29. - Definition loc_488 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_489 : location_info := LocationInfo file_0 268 8 268 12. - Definition loc_490 : location_info := LocationInfo file_0 268 16 268 29. - Definition loc_491 : location_info := LocationInfo file_0 268 17 268 20. - Definition loc_492 : location_info := LocationInfo file_0 268 24 268 28. - Definition loc_493 : location_info := LocationInfo file_0 262 8 262 33. - Definition loc_494 : location_info := LocationInfo file_0 262 8 262 12. - Definition loc_495 : location_info := LocationInfo file_0 262 8 262 12. - Definition loc_496 : location_info := LocationInfo file_0 262 15 262 33. - Definition loc_497 : location_info := LocationInfo file_0 261 8 261 19. - Definition loc_498 : location_info := LocationInfo file_0 261 15 261 18. - Definition loc_499 : location_info := LocationInfo file_0 261 16 261 18. - Definition loc_501 : location_info := LocationInfo file_0 260 8 260 36. - Definition loc_503 : location_info := LocationInfo file_0 260 9 260 36. - Definition loc_504 : location_info := LocationInfo file_0 260 10 260 14. - Definition loc_505 : location_info := LocationInfo file_0 260 10 260 14. - Definition loc_506 : location_info := LocationInfo file_0 260 17 260 35. - Definition loc_507 : location_info := LocationInfo file_0 258 13 259 28. - Definition loc_508 : location_info := LocationInfo file_0 258 13 258 40. - Definition loc_509 : location_info := LocationInfo file_0 258 14 258 18. - Definition loc_510 : location_info := LocationInfo file_0 258 14 258 18. - Definition loc_511 : location_info := LocationInfo file_0 258 21 258 39. - Definition loc_512 : location_info := LocationInfo file_0 258 43 258 44. - Definition loc_513 : location_info := LocationInfo file_0 259 27 259 28. - Definition loc_516 : location_info := LocationInfo file_0 257 13 257 14. - Definition loc_519 : location_info := LocationInfo file_0 256 21 256 208. - Definition loc_520 : location_info := LocationInfo file_0 256 22 256 130. - Definition loc_521 : location_info := LocationInfo file_0 256 23 256 30. - Definition loc_522 : location_info := LocationInfo file_0 256 23 256 30. - Definition loc_523 : location_info := LocationInfo file_0 256 34 256 129. - Definition loc_524 : location_info := LocationInfo file_0 256 35 256 124. - Definition loc_525 : location_info := LocationInfo file_0 256 35 256 50. - Definition loc_526 : location_info := LocationInfo file_0 256 35 256 50. - Definition loc_527 : location_info := LocationInfo file_0 256 51 256 123. - Definition loc_528 : location_info := LocationInfo file_0 256 52 256 79. - Definition loc_529 : location_info := LocationInfo file_0 256 53 256 74. - Definition loc_530 : location_info := LocationInfo file_0 256 53 256 59. - Definition loc_531 : location_info := LocationInfo file_0 256 55 256 58. - Definition loc_532 : location_info := LocationInfo file_0 256 62 256 74. - Definition loc_533 : location_info := LocationInfo file_0 256 63 256 66. - Definition loc_534 : location_info := LocationInfo file_0 256 70 256 73. - Definition loc_535 : location_info := LocationInfo file_0 256 77 256 78. - Definition loc_536 : location_info := LocationInfo file_0 256 82 256 122. - Definition loc_537 : location_info := LocationInfo file_0 256 83 256 87. - Definition loc_538 : location_info := LocationInfo file_0 256 84 256 87. - Definition loc_539 : location_info := LocationInfo file_0 256 91 256 121. - Definition loc_540 : location_info := LocationInfo file_0 256 92 256 114. - Definition loc_541 : location_info := LocationInfo file_0 256 92 256 110. - Definition loc_542 : location_info := LocationInfo file_0 256 93 256 105. - Definition loc_543 : location_info := LocationInfo file_0 256 108 256 109. - Definition loc_544 : location_info := LocationInfo file_0 256 113 256 114. - Definition loc_545 : location_info := LocationInfo file_0 256 117 256 120. - Definition loc_546 : location_info := LocationInfo file_0 256 127 256 128. - Definition loc_547 : location_info := LocationInfo file_0 256 133 256 207. - Definition loc_548 : location_info := LocationInfo file_0 256 135 256 162. - Definition loc_549 : location_info := LocationInfo file_0 256 136 256 157. - Definition loc_550 : location_info := LocationInfo file_0 256 136 256 142. - Definition loc_551 : location_info := LocationInfo file_0 256 138 256 141. - Definition loc_552 : location_info := LocationInfo file_0 256 145 256 157. - Definition loc_553 : location_info := LocationInfo file_0 256 146 256 149. - Definition loc_554 : location_info := LocationInfo file_0 256 153 256 156. - Definition loc_555 : location_info := LocationInfo file_0 256 160 256 161. - Definition loc_556 : location_info := LocationInfo file_0 256 165 256 205. - Definition loc_557 : location_info := LocationInfo file_0 256 166 256 170. - Definition loc_558 : location_info := LocationInfo file_0 256 167 256 170. - Definition loc_559 : location_info := LocationInfo file_0 256 174 256 204. - Definition loc_560 : location_info := LocationInfo file_0 256 175 256 197. - Definition loc_561 : location_info := LocationInfo file_0 256 175 256 193. - Definition loc_562 : location_info := LocationInfo file_0 256 176 256 188. - Definition loc_563 : location_info := LocationInfo file_0 256 191 256 192. - Definition loc_564 : location_info := LocationInfo file_0 256 196 256 197. - Definition loc_565 : location_info := LocationInfo file_0 256 200 256 203. - Definition loc_568 : location_info := LocationInfo file_0 255 16 255 30. - Definition loc_569 : location_info := LocationInfo file_0 255 16 255 22. - Definition loc_570 : location_info := LocationInfo file_0 255 16 255 22. - Definition loc_571 : location_info := LocationInfo file_0 255 25 255 26. - Definition loc_572 : location_info := LocationInfo file_0 255 29 255 30. - Definition loc_575 : location_info := LocationInfo file_0 254 19 254 49. - Definition loc_576 : location_info := LocationInfo file_0 254 19 254 23. - Definition loc_577 : location_info := LocationInfo file_0 254 19 254 23. - Definition loc_578 : location_info := LocationInfo file_0 254 26 254 49. + Definition loc_2 : location_info := LocationInfo file_0 167 4 167 30. + Definition loc_3 : location_info := LocationInfo file_0 167 11 167 29. + Definition loc_4 : location_info := LocationInfo file_0 167 11 167 14. + Definition loc_5 : location_info := LocationInfo file_0 167 11 167 14. + Definition loc_6 : location_info := LocationInfo file_0 167 17 167 29. + Definition loc_7 : location_info := LocationInfo file_0 167 18 167 21. + Definition loc_8 : location_info := LocationInfo file_0 167 25 167 28. + Definition loc_11 : location_info := LocationInfo file_0 177 4 178 17. + Definition loc_12 : location_info := LocationInfo file_0 179 4 180 17. + Definition loc_13 : location_info := LocationInfo file_0 181 4 181 82. + Definition loc_14 : location_info := LocationInfo file_0 181 11 181 81. + Definition loc_15 : location_info := LocationInfo file_0 181 11 181 76. + Definition loc_16 : location_info := LocationInfo file_0 181 12 181 36. + Definition loc_17 : location_info := LocationInfo file_0 181 13 181 18. + Definition loc_18 : location_info := LocationInfo file_0 181 13 181 18. + Definition loc_19 : location_info := LocationInfo file_0 181 21 181 35. + Definition loc_20 : location_info := LocationInfo file_0 181 23 181 26. + Definition loc_21 : location_info := LocationInfo file_0 181 30 181 33. + Definition loc_22 : location_info := LocationInfo file_0 181 40 181 75. + Definition loc_23 : location_info := LocationInfo file_0 181 41 181 70. + Definition loc_24 : location_info := LocationInfo file_0 181 41 181 56. + Definition loc_25 : location_info := LocationInfo file_0 181 41 181 56. + Definition loc_26 : location_info := LocationInfo file_0 181 57 181 69. + Definition loc_27 : location_info := LocationInfo file_0 181 58 181 61. + Definition loc_28 : location_info := LocationInfo file_0 181 65 181 68. + Definition loc_29 : location_info := LocationInfo file_0 181 73 181 74. + Definition loc_30 : location_info := LocationInfo file_0 181 80 181 81. + Definition loc_31 : location_info := LocationInfo file_0 180 8 180 17. + Definition loc_32 : location_info := LocationInfo file_0 180 15 180 16. + Definition loc_34 : location_info := LocationInfo file_0 179 8 179 27. + Definition loc_36 : location_info := LocationInfo file_0 179 9 179 27. + Definition loc_37 : location_info := LocationInfo file_0 179 9 179 22. + Definition loc_38 : location_info := LocationInfo file_0 179 9 179 22. + Definition loc_39 : location_info := LocationInfo file_0 179 23 179 26. + Definition loc_40 : location_info := LocationInfo file_0 179 23 179 26. + Definition loc_41 : location_info := LocationInfo file_0 178 8 178 17. + Definition loc_42 : location_info := LocationInfo file_0 178 15 178 16. + Definition loc_44 : location_info := LocationInfo file_0 177 8 177 23. + Definition loc_45 : location_info := LocationInfo file_0 177 8 177 13. + Definition loc_46 : location_info := LocationInfo file_0 177 8 177 13. + Definition loc_47 : location_info := LocationInfo file_0 177 17 177 23. + Definition loc_48 : location_info := LocationInfo file_0 177 17 177 19. + Definition loc_49 : location_info := LocationInfo file_0 177 22 177 23. + Definition loc_52 : location_info := LocationInfo file_0 190 4 190 26. + Definition loc_53 : location_info := LocationInfo file_0 191 4 191 38. + Definition loc_54 : location_info := LocationInfo file_0 191 5 191 12. + Definition loc_55 : location_info := LocationInfo file_0 191 7 191 11. + Definition loc_56 : location_info := LocationInfo file_0 191 7 191 11. + Definition loc_57 : location_info := LocationInfo file_0 191 15 191 36. + Definition loc_58 : location_info := LocationInfo file_0 191 16 191 19. + Definition loc_59 : location_info := LocationInfo file_0 191 16 191 19. + Definition loc_60 : location_info := LocationInfo file_0 191 22 191 35. + Definition loc_61 : location_info := LocationInfo file_0 191 23 191 35. + Definition loc_62 : location_info := LocationInfo file_0 191 24 191 27. + Definition loc_63 : location_info := LocationInfo file_0 191 31 191 34. + Definition loc_64 : location_info := LocationInfo file_0 190 20 190 25. + Definition loc_65 : location_info := LocationInfo file_0 190 20 190 25. + Definition loc_66 : location_info := LocationInfo file_0 190 21 190 25. + Definition loc_67 : location_info := LocationInfo file_0 190 21 190 25. + Definition loc_72 : location_info := LocationInfo file_0 200 4 200 100. + Definition loc_73 : location_info := LocationInfo file_0 202 4 203 210. + Definition loc_74 : location_info := LocationInfo file_0 205 4 205 15. + Definition loc_75 : location_info := LocationInfo file_0 205 11 205 14. + Definition loc_76 : location_info := LocationInfo file_0 205 11 205 14. + Definition loc_77 : location_info := LocationInfo file_0 203 8 203 210. + Definition loc_78 : location_info := LocationInfo file_0 203 8 203 11. + Definition loc_79 : location_info := LocationInfo file_0 203 8 203 209. + Definition loc_80 : location_info := LocationInfo file_0 203 8 203 11. + Definition loc_81 : location_info := LocationInfo file_0 203 8 203 11. + Definition loc_82 : location_info := LocationInfo file_0 203 15 203 209. + Definition loc_83 : location_info := LocationInfo file_0 203 16 203 129. + Definition loc_84 : location_info := LocationInfo file_0 203 17 203 27. + Definition loc_85 : location_info := LocationInfo file_0 203 18 203 20. + Definition loc_86 : location_info := LocationInfo file_0 203 18 203 20. + Definition loc_87 : location_info := LocationInfo file_0 203 24 203 26. + Definition loc_88 : location_info := LocationInfo file_0 203 31 203 128. + Definition loc_89 : location_info := LocationInfo file_0 203 32 203 123. + Definition loc_90 : location_info := LocationInfo file_0 203 32 203 47. + Definition loc_91 : location_info := LocationInfo file_0 203 32 203 47. + Definition loc_92 : location_info := LocationInfo file_0 203 48 203 122. + Definition loc_93 : location_info := LocationInfo file_0 203 49 203 77. + Definition loc_94 : location_info := LocationInfo file_0 203 50 203 72. + Definition loc_95 : location_info := LocationInfo file_0 203 50 203 56. + Definition loc_96 : location_info := LocationInfo file_0 203 52 203 55. + Definition loc_97 : location_info := LocationInfo file_0 203 59 203 72. + Definition loc_98 : location_info := LocationInfo file_0 203 60 203 63. + Definition loc_99 : location_info := LocationInfo file_0 203 67 203 71. + Definition loc_100 : location_info := LocationInfo file_0 203 75 203 76. + Definition loc_101 : location_info := LocationInfo file_0 203 80 203 121. + Definition loc_102 : location_info := LocationInfo file_0 203 81 203 85. + Definition loc_103 : location_info := LocationInfo file_0 203 82 203 85. + Definition loc_104 : location_info := LocationInfo file_0 203 89 203 120. + Definition loc_105 : location_info := LocationInfo file_0 203 90 203 112. + Definition loc_106 : location_info := LocationInfo file_0 203 90 203 108. + Definition loc_107 : location_info := LocationInfo file_0 203 91 203 103. + Definition loc_108 : location_info := LocationInfo file_0 203 106 203 107. + Definition loc_109 : location_info := LocationInfo file_0 203 111 203 112. + Definition loc_110 : location_info := LocationInfo file_0 203 115 203 119. + Definition loc_111 : location_info := LocationInfo file_0 203 126 203 127. + Definition loc_112 : location_info := LocationInfo file_0 203 132 203 208. + Definition loc_113 : location_info := LocationInfo file_0 203 134 203 162. + Definition loc_114 : location_info := LocationInfo file_0 203 135 203 157. + Definition loc_115 : location_info := LocationInfo file_0 203 135 203 141. + Definition loc_116 : location_info := LocationInfo file_0 203 137 203 140. + Definition loc_117 : location_info := LocationInfo file_0 203 144 203 157. + Definition loc_118 : location_info := LocationInfo file_0 203 145 203 148. + Definition loc_119 : location_info := LocationInfo file_0 203 152 203 156. + Definition loc_120 : location_info := LocationInfo file_0 203 160 203 161. + Definition loc_121 : location_info := LocationInfo file_0 203 165 203 206. + Definition loc_122 : location_info := LocationInfo file_0 203 166 203 170. + Definition loc_123 : location_info := LocationInfo file_0 203 167 203 170. + Definition loc_124 : location_info := LocationInfo file_0 203 174 203 205. + Definition loc_125 : location_info := LocationInfo file_0 203 175 203 197. + Definition loc_126 : location_info := LocationInfo file_0 203 175 203 193. + Definition loc_127 : location_info := LocationInfo file_0 203 176 203 188. + Definition loc_128 : location_info := LocationInfo file_0 203 191 203 192. + Definition loc_129 : location_info := LocationInfo file_0 203 196 203 197. + Definition loc_130 : location_info := LocationInfo file_0 203 200 203 204. + Definition loc_132 : location_info := LocationInfo file_0 202 8 202 16. + Definition loc_133 : location_info := LocationInfo file_0 202 8 202 10. + Definition loc_134 : location_info := LocationInfo file_0 202 14 202 16. + Definition loc_135 : location_info := LocationInfo file_0 200 20 200 99. + Definition loc_136 : location_info := LocationInfo file_0 200 20 200 22. + Definition loc_137 : location_info := LocationInfo file_0 200 20 200 22. + Definition loc_138 : location_info := LocationInfo file_0 200 25 200 99. + Definition loc_139 : location_info := LocationInfo file_0 200 26 200 54. + Definition loc_140 : location_info := LocationInfo file_0 200 27 200 49. + Definition loc_141 : location_info := LocationInfo file_0 200 27 200 33. + Definition loc_142 : location_info := LocationInfo file_0 200 29 200 32. + Definition loc_143 : location_info := LocationInfo file_0 200 36 200 49. + Definition loc_144 : location_info := LocationInfo file_0 200 37 200 40. + Definition loc_145 : location_info := LocationInfo file_0 200 44 200 48. + Definition loc_146 : location_info := LocationInfo file_0 200 52 200 53. + Definition loc_147 : location_info := LocationInfo file_0 200 57 200 98. + Definition loc_148 : location_info := LocationInfo file_0 200 58 200 62. + Definition loc_149 : location_info := LocationInfo file_0 200 59 200 62. + Definition loc_150 : location_info := LocationInfo file_0 200 66 200 97. + Definition loc_151 : location_info := LocationInfo file_0 200 67 200 89. + Definition loc_152 : location_info := LocationInfo file_0 200 67 200 85. + Definition loc_153 : location_info := LocationInfo file_0 200 68 200 80. + Definition loc_154 : location_info := LocationInfo file_0 200 83 200 84. + Definition loc_155 : location_info := LocationInfo file_0 200 88 200 89. + Definition loc_156 : location_info := LocationInfo file_0 200 92 200 96. + Definition loc_161 : location_info := LocationInfo file_0 218 4 218 79. + Definition loc_162 : location_info := LocationInfo file_0 219 4 219 75. + Definition loc_163 : location_info := LocationInfo file_0 220 4 220 24. + Definition loc_164 : location_info := LocationInfo file_0 221 4 221 33. + Definition loc_165 : location_info := LocationInfo file_0 223 1 223 13. + Definition loc_166 : location_info := LocationInfo file_0 223 1 223 6. + Definition loc_167 : location_info := LocationInfo file_0 223 2 223 6. + Definition loc_168 : location_info := LocationInfo file_0 223 2 223 6. + Definition loc_169 : location_info := LocationInfo file_0 223 9 223 12. + Definition loc_170 : location_info := LocationInfo file_0 223 9 223 12. + Definition loc_171 : location_info := LocationInfo file_0 221 12 221 30. + Definition loc_172 : location_info := LocationInfo file_0 221 12 221 25. + Definition loc_173 : location_info := LocationInfo file_0 221 12 221 25. + Definition loc_174 : location_info := LocationInfo file_0 221 26 221 29. + Definition loc_175 : location_info := LocationInfo file_0 221 26 221 29. + Definition loc_176 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_177 : location_info := LocationInfo file_0 220 4 220 23. + Definition loc_178 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_179 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_180 : location_info := LocationInfo file_0 220 11 220 23. + Definition loc_181 : location_info := LocationInfo file_0 220 12 220 15. + Definition loc_182 : location_info := LocationInfo file_0 220 19 220 22. + Definition loc_183 : location_info := LocationInfo file_0 219 4 219 7. + Definition loc_184 : location_info := LocationInfo file_0 219 4 219 74. + Definition loc_185 : location_info := LocationInfo file_0 219 4 219 7. + Definition loc_186 : location_info := LocationInfo file_0 219 4 219 7. + Definition loc_187 : location_info := LocationInfo file_0 219 11 219 74. + Definition loc_188 : location_info := LocationInfo file_0 219 12 219 56. + Definition loc_189 : location_info := LocationInfo file_0 219 13 219 16. + Definition loc_190 : location_info := LocationInfo file_0 219 20 219 55. + Definition loc_191 : location_info := LocationInfo file_0 219 21 219 50. + Definition loc_192 : location_info := LocationInfo file_0 219 21 219 36. + Definition loc_193 : location_info := LocationInfo file_0 219 21 219 36. + Definition loc_194 : location_info := LocationInfo file_0 219 37 219 49. + Definition loc_195 : location_info := LocationInfo file_0 219 38 219 41. + Definition loc_196 : location_info := LocationInfo file_0 219 45 219 48. + Definition loc_197 : location_info := LocationInfo file_0 219 53 219 54. + Definition loc_198 : location_info := LocationInfo file_0 219 59 219 73. + Definition loc_199 : location_info := LocationInfo file_0 219 61 219 64. + Definition loc_200 : location_info := LocationInfo file_0 219 68 219 71. + Definition loc_201 : location_info := LocationInfo file_0 218 33 218 78. + Definition loc_202 : location_info := LocationInfo file_0 218 33 218 48. + Definition loc_203 : location_info := LocationInfo file_0 218 33 218 48. + Definition loc_204 : location_info := LocationInfo file_0 218 49 218 77. + Definition loc_205 : location_info := LocationInfo file_0 218 49 218 69. + Definition loc_206 : location_info := LocationInfo file_0 218 49 218 69. + Definition loc_207 : location_info := LocationInfo file_0 218 49 218 69. + Definition loc_208 : location_info := LocationInfo file_0 218 49 218 55. + Definition loc_209 : location_info := LocationInfo file_0 218 49 218 55. + Definition loc_210 : location_info := LocationInfo file_0 218 70 218 76. + Definition loc_211 : location_info := LocationInfo file_0 218 70 218 76. + Definition loc_214 : location_info := LocationInfo file_0 218 20 218 25. + Definition loc_215 : location_info := LocationInfo file_0 218 20 218 25. + Definition loc_216 : location_info := LocationInfo file_0 218 21 218 25. + Definition loc_217 : location_info := LocationInfo file_0 218 21 218 25. + Definition loc_222 : location_info := LocationInfo file_0 241 4 241 53. + Definition loc_223 : location_info := LocationInfo file_0 242 4 243 33. + Definition loc_224 : location_info := LocationInfo file_0 244 4 244 171. + Definition loc_225 : location_info := LocationInfo file_0 245 4 245 78. + Definition loc_226 : location_info := LocationInfo file_0 246 4 246 24. + Definition loc_227 : location_info := LocationInfo file_0 248 4 249 26. + Definition loc_228 : location_info := LocationInfo file_0 251 1 251 13. + Definition loc_229 : location_info := LocationInfo file_0 252 4 252 13. + Definition loc_230 : location_info := LocationInfo file_0 252 11 252 12. + Definition loc_231 : location_info := LocationInfo file_0 251 1 251 6. + Definition loc_232 : location_info := LocationInfo file_0 251 2 251 6. + Definition loc_233 : location_info := LocationInfo file_0 251 2 251 6. + Definition loc_234 : location_info := LocationInfo file_0 251 9 251 12. + Definition loc_235 : location_info := LocationInfo file_0 251 9 251 12. + Definition loc_236 : location_info := LocationInfo file_0 249 8 249 26. + Definition loc_237 : location_info := LocationInfo file_0 249 15 249 25. + Definition loc_238 : location_info := LocationInfo file_0 249 15 249 18. + Definition loc_239 : location_info := LocationInfo file_0 249 15 249 18. + Definition loc_240 : location_info := LocationInfo file_0 249 22 249 25. + Definition loc_241 : location_info := LocationInfo file_0 249 22 249 25. + Definition loc_243 : location_info := LocationInfo file_0 248 8 248 26. + Definition loc_244 : location_info := LocationInfo file_0 248 8 248 21. + Definition loc_245 : location_info := LocationInfo file_0 248 8 248 21. + Definition loc_246 : location_info := LocationInfo file_0 248 22 248 25. + Definition loc_247 : location_info := LocationInfo file_0 248 22 248 25. + Definition loc_248 : location_info := LocationInfo file_0 246 4 246 7. + Definition loc_249 : location_info := LocationInfo file_0 246 4 246 23. + Definition loc_250 : location_info := LocationInfo file_0 246 4 246 7. + Definition loc_251 : location_info := LocationInfo file_0 246 4 246 7. + Definition loc_252 : location_info := LocationInfo file_0 246 11 246 23. + Definition loc_253 : location_info := LocationInfo file_0 246 12 246 15. + Definition loc_254 : location_info := LocationInfo file_0 246 19 246 22. + Definition loc_255 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_256 : location_info := LocationInfo file_0 245 4 245 77. + Definition loc_257 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_258 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_259 : location_info := LocationInfo file_0 245 11 245 77. + Definition loc_260 : location_info := LocationInfo file_0 245 12 245 59. + Definition loc_261 : location_info := LocationInfo file_0 245 13 245 19. + Definition loc_262 : location_info := LocationInfo file_0 245 13 245 19. + Definition loc_263 : location_info := LocationInfo file_0 245 23 245 58. + Definition loc_264 : location_info := LocationInfo file_0 245 24 245 53. + Definition loc_265 : location_info := LocationInfo file_0 245 24 245 39. + Definition loc_266 : location_info := LocationInfo file_0 245 24 245 39. + Definition loc_267 : location_info := LocationInfo file_0 245 40 245 52. + Definition loc_268 : location_info := LocationInfo file_0 245 41 245 44. + Definition loc_269 : location_info := LocationInfo file_0 245 48 245 51. + Definition loc_270 : location_info := LocationInfo file_0 245 56 245 57. + Definition loc_271 : location_info := LocationInfo file_0 245 62 245 76. + Definition loc_272 : location_info := LocationInfo file_0 245 64 245 67. + Definition loc_273 : location_info := LocationInfo file_0 245 71 245 74. + Definition loc_274 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_275 : location_info := LocationInfo file_0 244 4 244 170. + Definition loc_276 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_277 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_278 : location_info := LocationInfo file_0 244 11 244 170. + Definition loc_279 : location_info := LocationInfo file_0 244 11 244 15. + Definition loc_280 : location_info := LocationInfo file_0 244 11 244 15. + Definition loc_281 : location_info := LocationInfo file_0 244 18 244 170. + Definition loc_282 : location_info := LocationInfo file_0 244 19 244 92. + Definition loc_283 : location_info := LocationInfo file_0 244 20 244 47. + Definition loc_284 : location_info := LocationInfo file_0 244 21 244 42. + Definition loc_285 : location_info := LocationInfo file_0 244 21 244 27. + Definition loc_286 : location_info := LocationInfo file_0 244 23 244 26. + Definition loc_287 : location_info := LocationInfo file_0 244 30 244 42. + Definition loc_288 : location_info := LocationInfo file_0 244 31 244 34. + Definition loc_289 : location_info := LocationInfo file_0 244 38 244 41. + Definition loc_290 : location_info := LocationInfo file_0 244 45 244 46. + Definition loc_291 : location_info := LocationInfo file_0 244 50 244 91. + Definition loc_292 : location_info := LocationInfo file_0 244 51 244 55. + Definition loc_293 : location_info := LocationInfo file_0 244 52 244 55. + Definition loc_294 : location_info := LocationInfo file_0 244 59 244 90. + Definition loc_295 : location_info := LocationInfo file_0 244 60 244 82. + Definition loc_296 : location_info := LocationInfo file_0 244 60 244 78. + Definition loc_297 : location_info := LocationInfo file_0 244 61 244 73. + Definition loc_298 : location_info := LocationInfo file_0 244 76 244 77. + Definition loc_299 : location_info := LocationInfo file_0 244 81 244 82. + Definition loc_300 : location_info := LocationInfo file_0 244 85 244 89. + Definition loc_301 : location_info := LocationInfo file_0 244 95 244 169. + Definition loc_302 : location_info := LocationInfo file_0 244 96 244 124. + Definition loc_303 : location_info := LocationInfo file_0 244 97 244 119. + Definition loc_304 : location_info := LocationInfo file_0 244 97 244 103. + Definition loc_305 : location_info := LocationInfo file_0 244 99 244 102. + Definition loc_306 : location_info := LocationInfo file_0 244 106 244 119. + Definition loc_307 : location_info := LocationInfo file_0 244 107 244 110. + Definition loc_308 : location_info := LocationInfo file_0 244 114 244 118. + Definition loc_309 : location_info := LocationInfo file_0 244 122 244 123. + Definition loc_310 : location_info := LocationInfo file_0 244 127 244 168. + Definition loc_311 : location_info := LocationInfo file_0 244 128 244 132. + Definition loc_312 : location_info := LocationInfo file_0 244 129 244 132. + Definition loc_313 : location_info := LocationInfo file_0 244 136 244 167. + Definition loc_314 : location_info := LocationInfo file_0 244 137 244 159. + Definition loc_315 : location_info := LocationInfo file_0 244 137 244 155. + Definition loc_316 : location_info := LocationInfo file_0 244 138 244 150. + Definition loc_317 : location_info := LocationInfo file_0 244 153 244 154. + Definition loc_318 : location_info := LocationInfo file_0 244 158 244 159. + Definition loc_319 : location_info := LocationInfo file_0 244 162 244 166. + Definition loc_320 : location_info := LocationInfo file_0 242 15 243 32. + Definition loc_321 : location_info := LocationInfo file_0 242 15 242 32. + Definition loc_322 : location_info := LocationInfo file_0 242 16 242 21. + Definition loc_323 : location_info := LocationInfo file_0 242 16 242 21. + Definition loc_324 : location_info := LocationInfo file_0 242 25 242 31. + Definition loc_325 : location_info := LocationInfo file_0 242 25 242 27. + Definition loc_326 : location_info := LocationInfo file_0 242 30 242 31. + Definition loc_327 : location_info := LocationInfo file_0 242 35 242 36. + Definition loc_328 : location_info := LocationInfo file_0 243 31 243 32. + Definition loc_331 : location_info := LocationInfo file_0 241 33 241 52. + Definition loc_332 : location_info := LocationInfo file_0 241 33 241 48. + Definition loc_333 : location_info := LocationInfo file_0 241 33 241 48. + Definition loc_334 : location_info := LocationInfo file_0 241 49 241 51. + Definition loc_335 : location_info := LocationInfo file_0 241 49 241 51. + Definition loc_338 : location_info := LocationInfo file_0 241 20 241 25. + Definition loc_339 : location_info := LocationInfo file_0 241 20 241 25. + Definition loc_340 : location_info := LocationInfo file_0 241 21 241 25. + Definition loc_341 : location_info := LocationInfo file_0 241 21 241 25. + Definition loc_346 : location_info := LocationInfo file_0 264 4 264 50. + Definition loc_347 : location_info := LocationInfo file_0 265 4 265 31. + Definition loc_348 : location_info := LocationInfo file_0 266 4 266 209. + Definition loc_349 : location_info := LocationInfo file_0 267 4 267 15. + Definition loc_350 : location_info := LocationInfo file_0 268 4 269 29. + Definition loc_351 : location_info := LocationInfo file_0 270 4 271 19. + Definition loc_352 : location_info := LocationInfo file_0 272 4 279 5. + Definition loc_353 : location_info := LocationInfo file_0 280 4 280 197. + Definition loc_354 : location_info := LocationInfo file_0 281 4 281 197. + Definition loc_355 : location_info := LocationInfo file_0 282 4 282 26. + Definition loc_356 : location_info := LocationInfo file_0 283 4 283 22. + Definition loc_357 : location_info := LocationInfo file_0 284 4 284 13. + Definition loc_358 : location_info := LocationInfo file_0 284 11 284 12. + Definition loc_359 : location_info := LocationInfo file_0 283 4 283 14. + Definition loc_360 : location_info := LocationInfo file_0 283 4 283 8. + Definition loc_361 : location_info := LocationInfo file_0 283 4 283 8. + Definition loc_362 : location_info := LocationInfo file_0 283 17 283 21. + Definition loc_363 : location_info := LocationInfo file_0 283 17 283 21. + Definition loc_364 : location_info := LocationInfo file_0 282 4 282 8. + Definition loc_365 : location_info := LocationInfo file_0 282 4 282 25. + Definition loc_366 : location_info := LocationInfo file_0 282 4 282 8. + Definition loc_367 : location_info := LocationInfo file_0 282 4 282 8. + Definition loc_368 : location_info := LocationInfo file_0 282 12 282 25. + Definition loc_369 : location_info := LocationInfo file_0 282 13 282 16. + Definition loc_370 : location_info := LocationInfo file_0 282 20 282 24. + Definition loc_371 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_372 : location_info := LocationInfo file_0 281 4 281 196. + Definition loc_373 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_374 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_375 : location_info := LocationInfo file_0 281 12 281 196. + Definition loc_376 : location_info := LocationInfo file_0 281 13 281 118. + Definition loc_377 : location_info := LocationInfo file_0 281 14 281 18. + Definition loc_378 : location_info := LocationInfo file_0 281 14 281 18. + Definition loc_379 : location_info := LocationInfo file_0 281 22 281 117. + Definition loc_380 : location_info := LocationInfo file_0 281 23 281 112. + Definition loc_381 : location_info := LocationInfo file_0 281 23 281 38. + Definition loc_382 : location_info := LocationInfo file_0 281 23 281 38. + Definition loc_383 : location_info := LocationInfo file_0 281 39 281 111. + Definition loc_384 : location_info := LocationInfo file_0 281 40 281 67. + Definition loc_385 : location_info := LocationInfo file_0 281 41 281 62. + Definition loc_386 : location_info := LocationInfo file_0 281 41 281 47. + Definition loc_387 : location_info := LocationInfo file_0 281 43 281 46. + Definition loc_388 : location_info := LocationInfo file_0 281 50 281 62. + Definition loc_389 : location_info := LocationInfo file_0 281 51 281 54. + Definition loc_390 : location_info := LocationInfo file_0 281 58 281 61. + Definition loc_391 : location_info := LocationInfo file_0 281 65 281 66. + Definition loc_392 : location_info := LocationInfo file_0 281 70 281 110. + Definition loc_393 : location_info := LocationInfo file_0 281 71 281 75. + Definition loc_394 : location_info := LocationInfo file_0 281 72 281 75. + Definition loc_395 : location_info := LocationInfo file_0 281 79 281 109. + Definition loc_396 : location_info := LocationInfo file_0 281 80 281 102. + Definition loc_397 : location_info := LocationInfo file_0 281 80 281 98. + Definition loc_398 : location_info := LocationInfo file_0 281 81 281 93. + Definition loc_399 : location_info := LocationInfo file_0 281 96 281 97. + Definition loc_400 : location_info := LocationInfo file_0 281 101 281 102. + Definition loc_401 : location_info := LocationInfo file_0 281 105 281 108. + Definition loc_402 : location_info := LocationInfo file_0 281 115 281 116. + Definition loc_403 : location_info := LocationInfo file_0 281 121 281 195. + Definition loc_404 : location_info := LocationInfo file_0 281 123 281 150. + Definition loc_405 : location_info := LocationInfo file_0 281 124 281 145. + Definition loc_406 : location_info := LocationInfo file_0 281 124 281 130. + Definition loc_407 : location_info := LocationInfo file_0 281 126 281 129. + Definition loc_408 : location_info := LocationInfo file_0 281 133 281 145. + Definition loc_409 : location_info := LocationInfo file_0 281 134 281 137. + Definition loc_410 : location_info := LocationInfo file_0 281 141 281 144. + Definition loc_411 : location_info := LocationInfo file_0 281 148 281 149. + Definition loc_412 : location_info := LocationInfo file_0 281 153 281 193. + Definition loc_413 : location_info := LocationInfo file_0 281 154 281 158. + Definition loc_414 : location_info := LocationInfo file_0 281 155 281 158. + Definition loc_415 : location_info := LocationInfo file_0 281 162 281 192. + Definition loc_416 : location_info := LocationInfo file_0 281 163 281 185. + Definition loc_417 : location_info := LocationInfo file_0 281 163 281 181. + Definition loc_418 : location_info := LocationInfo file_0 281 164 281 176. + Definition loc_419 : location_info := LocationInfo file_0 281 179 281 180. + Definition loc_420 : location_info := LocationInfo file_0 281 184 281 185. + Definition loc_421 : location_info := LocationInfo file_0 281 188 281 191. + Definition loc_422 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_423 : location_info := LocationInfo file_0 280 4 280 196. + Definition loc_424 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_425 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_426 : location_info := LocationInfo file_0 280 12 280 196. + Definition loc_427 : location_info := LocationInfo file_0 280 13 280 118. + Definition loc_428 : location_info := LocationInfo file_0 280 14 280 18. + Definition loc_429 : location_info := LocationInfo file_0 280 14 280 18. + Definition loc_430 : location_info := LocationInfo file_0 280 22 280 117. + Definition loc_431 : location_info := LocationInfo file_0 280 23 280 112. + Definition loc_432 : location_info := LocationInfo file_0 280 23 280 38. + Definition loc_433 : location_info := LocationInfo file_0 280 23 280 38. + Definition loc_434 : location_info := LocationInfo file_0 280 39 280 111. + Definition loc_435 : location_info := LocationInfo file_0 280 40 280 67. + Definition loc_436 : location_info := LocationInfo file_0 280 41 280 62. + Definition loc_437 : location_info := LocationInfo file_0 280 41 280 47. + Definition loc_438 : location_info := LocationInfo file_0 280 43 280 46. + Definition loc_439 : location_info := LocationInfo file_0 280 50 280 62. + Definition loc_440 : location_info := LocationInfo file_0 280 51 280 54. + Definition loc_441 : location_info := LocationInfo file_0 280 58 280 61. + Definition loc_442 : location_info := LocationInfo file_0 280 65 280 66. + Definition loc_443 : location_info := LocationInfo file_0 280 70 280 110. + Definition loc_444 : location_info := LocationInfo file_0 280 71 280 75. + Definition loc_445 : location_info := LocationInfo file_0 280 72 280 75. + Definition loc_446 : location_info := LocationInfo file_0 280 79 280 109. + Definition loc_447 : location_info := LocationInfo file_0 280 80 280 102. + Definition loc_448 : location_info := LocationInfo file_0 280 80 280 98. + Definition loc_449 : location_info := LocationInfo file_0 280 81 280 93. + Definition loc_450 : location_info := LocationInfo file_0 280 96 280 97. + Definition loc_451 : location_info := LocationInfo file_0 280 101 280 102. + Definition loc_452 : location_info := LocationInfo file_0 280 105 280 108. + Definition loc_453 : location_info := LocationInfo file_0 280 115 280 116. + Definition loc_454 : location_info := LocationInfo file_0 280 121 280 195. + Definition loc_455 : location_info := LocationInfo file_0 280 123 280 150. + Definition loc_456 : location_info := LocationInfo file_0 280 124 280 145. + Definition loc_457 : location_info := LocationInfo file_0 280 124 280 130. + Definition loc_458 : location_info := LocationInfo file_0 280 126 280 129. + Definition loc_459 : location_info := LocationInfo file_0 280 133 280 145. + Definition loc_460 : location_info := LocationInfo file_0 280 134 280 137. + Definition loc_461 : location_info := LocationInfo file_0 280 141 280 144. + Definition loc_462 : location_info := LocationInfo file_0 280 148 280 149. + Definition loc_463 : location_info := LocationInfo file_0 280 153 280 193. + Definition loc_464 : location_info := LocationInfo file_0 280 154 280 158. + Definition loc_465 : location_info := LocationInfo file_0 280 155 280 158. + Definition loc_466 : location_info := LocationInfo file_0 280 162 280 192. + Definition loc_467 : location_info := LocationInfo file_0 280 163 280 185. + Definition loc_468 : location_info := LocationInfo file_0 280 163 280 181. + Definition loc_469 : location_info := LocationInfo file_0 280 164 280 176. + Definition loc_470 : location_info := LocationInfo file_0 280 179 280 180. + Definition loc_471 : location_info := LocationInfo file_0 280 184 280 185. + Definition loc_472 : location_info := LocationInfo file_0 280 188 280 191. + Definition loc_473 : location_info := LocationInfo file_0 272 35 277 5. + Definition loc_474 : location_info := LocationInfo file_0 273 8 274 23. + Definition loc_475 : location_info := LocationInfo file_0 275 8 276 23. + Definition loc_476 : location_info := LocationInfo file_0 276 12 276 23. + Definition loc_477 : location_info := LocationInfo file_0 276 19 276 22. + Definition loc_478 : location_info := LocationInfo file_0 276 20 276 22. + Definition loc_480 : location_info := LocationInfo file_0 275 12 275 18. + Definition loc_481 : location_info := LocationInfo file_0 275 12 275 18. + Definition loc_482 : location_info := LocationInfo file_0 274 12 274 23. + Definition loc_483 : location_info := LocationInfo file_0 274 19 274 22. + Definition loc_484 : location_info := LocationInfo file_0 274 20 274 22. + Definition loc_486 : location_info := LocationInfo file_0 273 12 273 37. + Definition loc_487 : location_info := LocationInfo file_0 273 12 273 16. + Definition loc_488 : location_info := LocationInfo file_0 273 12 273 16. + Definition loc_489 : location_info := LocationInfo file_0 273 19 273 37. + Definition loc_490 : location_info := LocationInfo file_0 277 11 279 5. + Definition loc_491 : location_info := LocationInfo file_0 278 8 278 30. + Definition loc_492 : location_info := LocationInfo file_0 278 8 278 12. + Definition loc_493 : location_info := LocationInfo file_0 278 8 278 29. + Definition loc_494 : location_info := LocationInfo file_0 278 8 278 12. + Definition loc_495 : location_info := LocationInfo file_0 278 8 278 12. + Definition loc_496 : location_info := LocationInfo file_0 278 16 278 29. + Definition loc_497 : location_info := LocationInfo file_0 278 17 278 20. + Definition loc_498 : location_info := LocationInfo file_0 278 24 278 28. + Definition loc_499 : location_info := LocationInfo file_0 272 8 272 33. + Definition loc_500 : location_info := LocationInfo file_0 272 8 272 12. + Definition loc_501 : location_info := LocationInfo file_0 272 8 272 12. + Definition loc_502 : location_info := LocationInfo file_0 272 15 272 33. + Definition loc_503 : location_info := LocationInfo file_0 271 8 271 19. + Definition loc_504 : location_info := LocationInfo file_0 271 15 271 18. + Definition loc_505 : location_info := LocationInfo file_0 271 16 271 18. + Definition loc_507 : location_info := LocationInfo file_0 270 8 270 36. + Definition loc_509 : location_info := LocationInfo file_0 270 9 270 36. + Definition loc_510 : location_info := LocationInfo file_0 270 10 270 14. + Definition loc_511 : location_info := LocationInfo file_0 270 10 270 14. + Definition loc_512 : location_info := LocationInfo file_0 270 17 270 35. + Definition loc_513 : location_info := LocationInfo file_0 268 13 269 28. + Definition loc_514 : location_info := LocationInfo file_0 268 13 268 40. + Definition loc_515 : location_info := LocationInfo file_0 268 14 268 18. + Definition loc_516 : location_info := LocationInfo file_0 268 14 268 18. + Definition loc_517 : location_info := LocationInfo file_0 268 21 268 39. + Definition loc_518 : location_info := LocationInfo file_0 268 43 268 44. + Definition loc_519 : location_info := LocationInfo file_0 269 27 269 28. + Definition loc_522 : location_info := LocationInfo file_0 267 13 267 14. + Definition loc_525 : location_info := LocationInfo file_0 266 21 266 208. + Definition loc_526 : location_info := LocationInfo file_0 266 22 266 130. + Definition loc_527 : location_info := LocationInfo file_0 266 23 266 30. + Definition loc_528 : location_info := LocationInfo file_0 266 23 266 30. + Definition loc_529 : location_info := LocationInfo file_0 266 34 266 129. + Definition loc_530 : location_info := LocationInfo file_0 266 35 266 124. + Definition loc_531 : location_info := LocationInfo file_0 266 35 266 50. + Definition loc_532 : location_info := LocationInfo file_0 266 35 266 50. + Definition loc_533 : location_info := LocationInfo file_0 266 51 266 123. + Definition loc_534 : location_info := LocationInfo file_0 266 52 266 79. + Definition loc_535 : location_info := LocationInfo file_0 266 53 266 74. + Definition loc_536 : location_info := LocationInfo file_0 266 53 266 59. + Definition loc_537 : location_info := LocationInfo file_0 266 55 266 58. + Definition loc_538 : location_info := LocationInfo file_0 266 62 266 74. + Definition loc_539 : location_info := LocationInfo file_0 266 63 266 66. + Definition loc_540 : location_info := LocationInfo file_0 266 70 266 73. + Definition loc_541 : location_info := LocationInfo file_0 266 77 266 78. + Definition loc_542 : location_info := LocationInfo file_0 266 82 266 122. + Definition loc_543 : location_info := LocationInfo file_0 266 83 266 87. + Definition loc_544 : location_info := LocationInfo file_0 266 84 266 87. + Definition loc_545 : location_info := LocationInfo file_0 266 91 266 121. + Definition loc_546 : location_info := LocationInfo file_0 266 92 266 114. + Definition loc_547 : location_info := LocationInfo file_0 266 92 266 110. + Definition loc_548 : location_info := LocationInfo file_0 266 93 266 105. + Definition loc_549 : location_info := LocationInfo file_0 266 108 266 109. + Definition loc_550 : location_info := LocationInfo file_0 266 113 266 114. + Definition loc_551 : location_info := LocationInfo file_0 266 117 266 120. + Definition loc_552 : location_info := LocationInfo file_0 266 127 266 128. + Definition loc_553 : location_info := LocationInfo file_0 266 133 266 207. + Definition loc_554 : location_info := LocationInfo file_0 266 135 266 162. + Definition loc_555 : location_info := LocationInfo file_0 266 136 266 157. + Definition loc_556 : location_info := LocationInfo file_0 266 136 266 142. + Definition loc_557 : location_info := LocationInfo file_0 266 138 266 141. + Definition loc_558 : location_info := LocationInfo file_0 266 145 266 157. + Definition loc_559 : location_info := LocationInfo file_0 266 146 266 149. + Definition loc_560 : location_info := LocationInfo file_0 266 153 266 156. + Definition loc_561 : location_info := LocationInfo file_0 266 160 266 161. + Definition loc_562 : location_info := LocationInfo file_0 266 165 266 205. + Definition loc_563 : location_info := LocationInfo file_0 266 166 266 170. + Definition loc_564 : location_info := LocationInfo file_0 266 167 266 170. + Definition loc_565 : location_info := LocationInfo file_0 266 174 266 204. + Definition loc_566 : location_info := LocationInfo file_0 266 175 266 197. + Definition loc_567 : location_info := LocationInfo file_0 266 175 266 193. + Definition loc_568 : location_info := LocationInfo file_0 266 176 266 188. + Definition loc_569 : location_info := LocationInfo file_0 266 191 266 192. + Definition loc_570 : location_info := LocationInfo file_0 266 196 266 197. + Definition loc_571 : location_info := LocationInfo file_0 266 200 266 203. + Definition loc_574 : location_info := LocationInfo file_0 265 16 265 30. + Definition loc_575 : location_info := LocationInfo file_0 265 16 265 22. + Definition loc_576 : location_info := LocationInfo file_0 265 16 265 22. + Definition loc_577 : location_info := LocationInfo file_0 265 25 265 26. + Definition loc_578 : location_info := LocationInfo file_0 265 29 265 30. + Definition loc_581 : location_info := LocationInfo file_0 264 19 264 49. + Definition loc_582 : location_info := LocationInfo file_0 264 19 264 23. + Definition loc_583 : location_info := LocationInfo file_0 264 19 264 23. + Definition loc_584 : location_info := LocationInfo file_0 264 26 264 49. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| @@ -697,7 +703,7 @@ Section code. |}. (* Definition of function [kvm_set_table_pte]. *) - Definition impl_kvm_set_table_pte (global___builtin_ffsll global_kvm_phys_to_pte : loc): function := {| + Definition impl_kvm_set_table_pte (global___builtin_ffsll global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| f_args := [ ("ptep", void*); ("childp", void*); @@ -711,18 +717,20 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_208 (use{it_layout u64} (LocInfoE loc_210 (!{void*} (LocInfoE loc_211 ("ptep"))))) ; + LocInfoE loc_214 (use{it_layout u64} (LocInfoE loc_216 (!{void*} (LocInfoE loc_217 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_195 (Call (LocInfoE loc_197 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_198 (Call (LocInfoE loc_200 (use{void*} (LocInfoE loc_201 ((LocInfoE loc_202 (!{void*} (LocInfoE loc_203 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_204 (use{void*} (LocInfoE loc_205 ("childp"))) ]) ]) ; + LocInfoE loc_201 (Call (LocInfoE loc_203 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_204 (Call (LocInfoE loc_206 (use{void*} (LocInfoE loc_207 ((LocInfoE loc_208 (!{void*} (LocInfoE loc_209 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_210 (use{void*} (LocInfoE loc_211 ("childp"))) ]) ]) ; locinfo: loc_162 ; - LocInfoE loc_177 ("pte") <-{ it_layout u64 } - LocInfoE loc_178 ((LocInfoE loc_179 (use{it_layout u64} (LocInfoE loc_180 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_181 ((LocInfoE loc_182 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_182 ((LocInfoE loc_183 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_184 ((LocInfoE loc_185 (Call (LocInfoE loc_187 (global___builtin_ffsll)) [@{expr} LocInfoE loc_188 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_188 ((LocInfoE loc_189 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_190 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_190 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_191 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_192 ((LocInfoE loc_193 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_194 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_194 (i2v 1 i32))))))))) ; + LocInfoE loc_183 ("pte") <-{ it_layout u64 } + LocInfoE loc_184 ((LocInfoE loc_185 (use{it_layout u64} (LocInfoE loc_186 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_187 ((LocInfoE loc_188 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_188 ((LocInfoE loc_189 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_190 ((LocInfoE loc_191 (Call (LocInfoE loc_193 (global___builtin_ffsll)) [@{expr} LocInfoE loc_194 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_194 ((LocInfoE loc_195 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_196 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_196 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_197 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_198 ((LocInfoE loc_199 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_200 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_200 (i2v 1 i32))))))))) ; locinfo: loc_163 ; - LocInfoE loc_170 ("pte") <-{ it_layout u64 } - LocInfoE loc_171 ((LocInfoE loc_172 (use{it_layout u64} (LocInfoE loc_173 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_174 ((LocInfoE loc_175 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_176 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_176 (i2v 0 i32))))))) ; + LocInfoE loc_176 ("pte") <-{ it_layout u64 } + LocInfoE loc_177 ((LocInfoE loc_178 (use{it_layout u64} (LocInfoE loc_179 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_180 ((LocInfoE loc_181 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_182 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_182 (i2v 0 i32))))))) ; locinfo: loc_164 ; - LocInfoE loc_166 (!{void*} (LocInfoE loc_167 ("ptep"))) <-{ it_layout u64 } - LocInfoE loc_168 (use{it_layout u64} (LocInfoE loc_169 ("pte"))) ; + assert: (LocInfoE loc_171 (Call (LocInfoE loc_173 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_174 (use{it_layout u64} (LocInfoE loc_175 ("old"))) ])) ; + locinfo: loc_165 ; + LocInfoE loc_167 (!{void*} (LocInfoE loc_168 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_169 (use{it_layout u64} (LocInfoE loc_170 ("pte"))) ; Return (VOID) ]> $∅ )%E @@ -745,45 +753,45 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_332 (use{it_layout u64} (LocInfoE loc_334 (!{void*} (LocInfoE loc_335 ("ptep"))))) ; + LocInfoE loc_338 (use{it_layout u64} (LocInfoE loc_340 (!{void*} (LocInfoE loc_341 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_325 (Call (LocInfoE loc_327 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_328 (use{it_layout u64} (LocInfoE loc_329 ("pa"))) ]) ; + LocInfoE loc_331 (Call (LocInfoE loc_333 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_334 (use{it_layout u64} (LocInfoE loc_335 ("pa"))) ]) ; "type" <-{ it_layout u64 } - LocInfoE loc_314 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_314 (IfE + LocInfoE loc_320 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_320 (IfE (IntOp i32) - (LocInfoE loc_315 ((LocInfoE loc_316 (use{it_layout u32} (LocInfoE loc_317 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_318 ((LocInfoE loc_319 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_320 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_320 (i2v 1 i32)))))))) - (LocInfoE loc_321 (i2v 1 i32)) (LocInfoE loc_322 (i2v 0 i32))))) ; - locinfo: loc_218 ; - LocInfoE loc_268 ("pte") <-{ it_layout u64 } - LocInfoE loc_269 ((LocInfoE loc_270 (use{it_layout u64} (LocInfoE loc_271 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_272 ((LocInfoE loc_273 (use{it_layout u64} (LocInfoE loc_274 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_275 ((LocInfoE loc_276 ((LocInfoE loc_277 ((LocInfoE loc_278 ((LocInfoE loc_279 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_280 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_281 ((LocInfoE loc_282 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_283 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_283 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_284 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_284 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_285 ((LocInfoE loc_286 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_287 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_288 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_288 ((LocInfoE loc_289 ((LocInfoE loc_290 ((LocInfoE loc_291 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_292 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_292 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_293 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_293 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_294 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_294 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 ((LocInfoE loc_298 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_299 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_300 ((LocInfoE loc_301 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_302 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_302 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_303 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_303 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_304 ((LocInfoE loc_305 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_306 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_307 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_307 ((LocInfoE loc_308 ((LocInfoE loc_309 ((LocInfoE loc_310 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_311 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_311 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_312 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_312 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_313 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_313 (i2v 63 i32))))))))))))))))) ; - locinfo: loc_219 ; - LocInfoE loc_249 ("pte") <-{ it_layout u64 } - LocInfoE loc_250 ((LocInfoE loc_251 (use{it_layout u64} (LocInfoE loc_252 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_253 ((LocInfoE loc_254 ((LocInfoE loc_255 (use{it_layout u64} (LocInfoE loc_256 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_257 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_257 ((LocInfoE loc_258 (Call (LocInfoE loc_260 (global___builtin_ffsll)) [@{expr} LocInfoE loc_261 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_261 ((LocInfoE loc_262 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_263 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_263 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_264 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_265 ((LocInfoE loc_266 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_267 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_267 (i2v 1 i32))))))))) ; - locinfo: loc_220 ; - LocInfoE loc_242 ("pte") <-{ it_layout u64 } - LocInfoE loc_243 ((LocInfoE loc_244 (use{it_layout u64} (LocInfoE loc_245 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_246 ((LocInfoE loc_247 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_248 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_248 (i2v 0 i32))))))) ; - locinfo: loc_237 ; - if: LocInfoE loc_237 (Call (LocInfoE loc_239 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_240 (use{it_layout u64} (LocInfoE loc_241 ("old"))) ]) + (LocInfoE loc_321 ((LocInfoE loc_322 (use{it_layout u32} (LocInfoE loc_323 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_324 ((LocInfoE loc_325 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_326 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_326 (i2v 1 i32)))))))) + (LocInfoE loc_327 (i2v 1 i32)) (LocInfoE loc_328 (i2v 0 i32))))) ; + locinfo: loc_224 ; + LocInfoE loc_274 ("pte") <-{ it_layout u64 } + LocInfoE loc_275 ((LocInfoE loc_276 (use{it_layout u64} (LocInfoE loc_277 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_278 ((LocInfoE loc_279 (use{it_layout u64} (LocInfoE loc_280 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_281 ((LocInfoE loc_282 ((LocInfoE loc_283 ((LocInfoE loc_284 ((LocInfoE loc_285 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_286 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_287 ((LocInfoE loc_288 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_289 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_289 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_290 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_290 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_291 ((LocInfoE loc_292 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_293 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_294 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_294 ((LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_298 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_298 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_299 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_299 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_300 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_300 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_301 ((LocInfoE loc_302 ((LocInfoE loc_303 ((LocInfoE loc_304 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_305 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_306 ((LocInfoE loc_307 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_308 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_308 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_309 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_309 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_310 ((LocInfoE loc_311 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_312 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_313 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_313 ((LocInfoE loc_314 ((LocInfoE loc_315 ((LocInfoE loc_316 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_317 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_317 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_318 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_318 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_319 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_319 (i2v 63 i32))))))))))))))))) ; + locinfo: loc_225 ; + LocInfoE loc_255 ("pte") <-{ it_layout u64 } + LocInfoE loc_256 ((LocInfoE loc_257 (use{it_layout u64} (LocInfoE loc_258 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_259 ((LocInfoE loc_260 ((LocInfoE loc_261 (use{it_layout u64} (LocInfoE loc_262 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_263 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_263 ((LocInfoE loc_264 (Call (LocInfoE loc_266 (global___builtin_ffsll)) [@{expr} LocInfoE loc_267 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_267 ((LocInfoE loc_268 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_269 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_269 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_270 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_271 ((LocInfoE loc_272 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_273 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_273 (i2v 1 i32))))))))) ; + locinfo: loc_226 ; + LocInfoE loc_248 ("pte") <-{ it_layout u64 } + LocInfoE loc_249 ((LocInfoE loc_250 (use{it_layout u64} (LocInfoE loc_251 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_252 ((LocInfoE loc_253 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_254 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_254 (i2v 0 i32))))))) ; + locinfo: loc_243 ; + if: LocInfoE loc_243 (Call (LocInfoE loc_245 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_246 (use{it_layout u64} (LocInfoE loc_247 ("old"))) ]) then - locinfo: loc_230 ; + locinfo: loc_236 ; Goto "#2" else - locinfo: loc_222 ; + locinfo: loc_228 ; Goto "#3" ]> $ <[ "#1" := - locinfo: loc_222 ; - LocInfoE loc_226 (!{void*} (LocInfoE loc_227 ("ptep"))) <-{ it_layout u64 } - LocInfoE loc_228 (use{it_layout u64} (LocInfoE loc_229 ("pte"))) ; - locinfo: loc_223 ; - Return (LocInfoE loc_224 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_224 (i2v 1 i32)))) + locinfo: loc_228 ; + LocInfoE loc_232 (!{void*} (LocInfoE loc_233 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_234 (use{it_layout u64} (LocInfoE loc_235 ("pte"))) ; + locinfo: loc_229 ; + Return (LocInfoE loc_230 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_230 (i2v 1 i32)))) ]> $ <[ "#2" := - locinfo: loc_230 ; - Return (LocInfoE loc_231 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_231 ((LocInfoE loc_232 (use{it_layout u64} (LocInfoE loc_233 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_234 (use{it_layout u64} (LocInfoE loc_235 ("pte")))))))) + locinfo: loc_236 ; + Return (LocInfoE loc_237 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_237 ((LocInfoE loc_238 (use{it_layout u64} (LocInfoE loc_239 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_240 (use{it_layout u64} (LocInfoE loc_241 ("pte")))))))) ]> $ <[ "#3" := - locinfo: loc_222 ; + locinfo: loc_228 ; Goto "#1" ]> $∅ )%E @@ -806,105 +814,105 @@ Section code. f_code := ( <[ "#0" := "device" <-{ it_layout bool_it } - LocInfoE loc_575 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_575 ((LocInfoE loc_576 (use{it_layout u32} (LocInfoE loc_577 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_578 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_578 (i2v 8 i32))))))) ; + LocInfoE loc_581 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_581 ((LocInfoE loc_582 (use{it_layout u32} (LocInfoE loc_583 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_584 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_584 (i2v 8 i32))))))) ; "mtype" <-{ it_layout u32 } - LocInfoE loc_568 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_568 (IfE + LocInfoE loc_574 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_574 (IfE (IntOp bool_it) - (LocInfoE loc_569 (use{it_layout bool_it} (LocInfoE loc_570 ("device")))) - (LocInfoE loc_571 (i2v 5 i32)) (LocInfoE loc_572 (i2v 0 i32))))) ; + (LocInfoE loc_575 (use{it_layout bool_it} (LocInfoE loc_576 ("device")))) + (LocInfoE loc_577 (i2v 5 i32)) (LocInfoE loc_578 (i2v 0 i32))))) ; "attr" <-{ it_layout u64 } - LocInfoE loc_519 ((LocInfoE loc_520 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_520 ((LocInfoE loc_521 (use{it_layout u32} (LocInfoE loc_522 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_523 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_523 ((LocInfoE loc_524 (Call (LocInfoE loc_526 (global___builtin_ffsll)) [@{expr} LocInfoE loc_527 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_527 ((LocInfoE loc_528 ((LocInfoE loc_529 ((LocInfoE loc_530 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_531 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_532 ((LocInfoE loc_533 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_534 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_534 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_535 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_535 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_536 ((LocInfoE loc_537 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_538 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_539 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_539 ((LocInfoE loc_540 ((LocInfoE loc_541 ((LocInfoE loc_542 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_543 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_543 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_544 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_544 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_545 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_545 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_546 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_547 ((LocInfoE loc_548 ((LocInfoE loc_549 ((LocInfoE loc_550 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_551 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_552 ((LocInfoE loc_553 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_554 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_554 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_555 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_555 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_556 ((LocInfoE loc_557 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_558 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_559 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_559 ((LocInfoE loc_560 ((LocInfoE loc_561 ((LocInfoE loc_562 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_563 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_563 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_564 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_564 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_565 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_565 (i2v 4 i32))))))))))))) ; + LocInfoE loc_525 ((LocInfoE loc_526 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_526 ((LocInfoE loc_527 (use{it_layout u32} (LocInfoE loc_528 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_529 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_529 ((LocInfoE loc_530 (Call (LocInfoE loc_532 (global___builtin_ffsll)) [@{expr} LocInfoE loc_533 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_533 ((LocInfoE loc_534 ((LocInfoE loc_535 ((LocInfoE loc_536 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_537 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_538 ((LocInfoE loc_539 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_540 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_540 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_541 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_541 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_542 ((LocInfoE loc_543 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_544 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_545 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_545 ((LocInfoE loc_546 ((LocInfoE loc_547 ((LocInfoE loc_548 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_549 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_549 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_550 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_550 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_551 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_551 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_552 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_553 ((LocInfoE loc_554 ((LocInfoE loc_555 ((LocInfoE loc_556 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_557 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_558 ((LocInfoE loc_559 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_560 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_560 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_561 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_561 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_562 ((LocInfoE loc_563 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_564 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_565 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_565 ((LocInfoE loc_566 ((LocInfoE loc_567 ((LocInfoE loc_568 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_569 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_569 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_570 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_570 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_571 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_571 (i2v 4 i32))))))))))))) ; "sh" <-{ it_layout u32 } - LocInfoE loc_516 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_516 (i2v 3 i32))) ; + LocInfoE loc_522 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_522 (i2v 3 i32))) ; "ap" <-{ it_layout u32 } - LocInfoE loc_507 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_507 (IfE + LocInfoE loc_513 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_513 (IfE (IntOp u32) - (LocInfoE loc_508 ((LocInfoE loc_509 (use{it_layout u32} (LocInfoE loc_510 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_511 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_511 (i2v 2 i32)))))) - (LocInfoE loc_512 (i2v 1 i32)) (LocInfoE loc_513 (i2v 3 i32))))) ; - locinfo: loc_501 ; - if: LocInfoE loc_501 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_501 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_503 ((LocInfoE loc_504 (use{it_layout u32} (LocInfoE loc_505 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_506 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_506 (i2v 4 i32))))))))) + (LocInfoE loc_514 ((LocInfoE loc_515 (use{it_layout u32} (LocInfoE loc_516 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_517 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_517 (i2v 2 i32)))))) + (LocInfoE loc_518 (i2v 1 i32)) (LocInfoE loc_519 (i2v 3 i32))))) ; + locinfo: loc_507 ; + if: LocInfoE loc_507 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_507 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_509 ((LocInfoE loc_510 (use{it_layout u32} (LocInfoE loc_511 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_512 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_512 (i2v 4 i32))))))))) then - locinfo: loc_497 ; + locinfo: loc_503 ; Goto "#10" else - locinfo: loc_493 ; + locinfo: loc_499 ; Goto "#11" ]> $ <[ "#1" := - locinfo: loc_493 ; - if: LocInfoE loc_493 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_493 ((LocInfoE loc_494 (use{it_layout u32} (LocInfoE loc_495 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_496 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_496 (i2v 1 i32))))))) + locinfo: loc_499 ; + if: LocInfoE loc_499 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_499 ((LocInfoE loc_500 (use{it_layout u32} (LocInfoE loc_501 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_502 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_502 (i2v 1 i32))))))) then - locinfo: loc_480 ; + locinfo: loc_486 ; Goto "#3" else - locinfo: loc_485 ; + locinfo: loc_491 ; Goto "#9" ]> $ <[ "#10" := - locinfo: loc_497 ; - Return (LocInfoE loc_498 (UnOp NegOp (IntOp i32) (LocInfoE loc_499 (i2v 22 i32)))) + locinfo: loc_503 ; + Return (LocInfoE loc_504 (UnOp NegOp (IntOp i32) (LocInfoE loc_505 (i2v 22 i32)))) ]> $ <[ "#11" := - locinfo: loc_493 ; + locinfo: loc_499 ; Goto "#1" ]> $ <[ "#2" := - locinfo: loc_347 ; - LocInfoE loc_416 ("attr") <-{ it_layout u64 } - LocInfoE loc_417 ((LocInfoE loc_418 (use{it_layout u64} (LocInfoE loc_419 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_420 ((LocInfoE loc_421 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_421 ((LocInfoE loc_422 (use{it_layout u32} (LocInfoE loc_423 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_424 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_424 ((LocInfoE loc_425 (Call (LocInfoE loc_427 (global___builtin_ffsll)) [@{expr} LocInfoE loc_428 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_428 ((LocInfoE loc_429 ((LocInfoE loc_430 ((LocInfoE loc_431 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_432 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_433 ((LocInfoE loc_434 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_435 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_435 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_436 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_436 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_437 ((LocInfoE loc_438 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_439 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_440 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_440 ((LocInfoE loc_441 ((LocInfoE loc_442 ((LocInfoE loc_443 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_444 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_444 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_445 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_445 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_446 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_446 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_447 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_448 ((LocInfoE loc_449 ((LocInfoE loc_450 ((LocInfoE loc_451 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_452 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_453 ((LocInfoE loc_454 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_455 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_455 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_456 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_456 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_457 ((LocInfoE loc_458 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_459 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_460 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_460 ((LocInfoE loc_461 ((LocInfoE loc_462 ((LocInfoE loc_463 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_464 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_464 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_465 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_465 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_466 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_466 (i2v 7 i32))))))))))))))) ; - locinfo: loc_348 ; - LocInfoE loc_365 ("attr") <-{ it_layout u64 } - LocInfoE loc_366 ((LocInfoE loc_367 (use{it_layout u64} (LocInfoE loc_368 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_369 ((LocInfoE loc_370 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_370 ((LocInfoE loc_371 (use{it_layout u32} (LocInfoE loc_372 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_373 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_373 ((LocInfoE loc_374 (Call (LocInfoE loc_376 (global___builtin_ffsll)) [@{expr} LocInfoE loc_377 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_377 ((LocInfoE loc_378 ((LocInfoE loc_379 ((LocInfoE loc_380 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_381 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_382 ((LocInfoE loc_383 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_384 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_384 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_385 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_385 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_386 ((LocInfoE loc_387 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_388 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_389 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_389 ((LocInfoE loc_390 ((LocInfoE loc_391 ((LocInfoE loc_392 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_393 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_393 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_394 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_394 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_395 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_395 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_396 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_397 ((LocInfoE loc_398 ((LocInfoE loc_399 ((LocInfoE loc_400 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_401 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_402 ((LocInfoE loc_403 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_404 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_404 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_405 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_405 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_406 ((LocInfoE loc_407 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_408 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_409 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_409 ((LocInfoE loc_410 ((LocInfoE loc_411 ((LocInfoE loc_412 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_413 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_413 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_414 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_414 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_415 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_415 (i2v 9 i32))))))))))))))) ; - locinfo: loc_349 ; - LocInfoE loc_358 ("attr") <-{ it_layout u64 } - LocInfoE loc_359 ((LocInfoE loc_360 (use{it_layout u64} (LocInfoE loc_361 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_362 ((LocInfoE loc_363 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_364 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_364 (i2v 10 i32))))))) ; - locinfo: loc_350 ; - LocInfoE loc_353 ((LocInfoE loc_354 (!{void*} (LocInfoE loc_355 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } - LocInfoE loc_356 (use{it_layout u64} (LocInfoE loc_357 ("attr"))) ; - locinfo: loc_351 ; - Return (LocInfoE loc_352 (i2v 0 i32)) + locinfo: loc_353 ; + LocInfoE loc_422 ("attr") <-{ it_layout u64 } + LocInfoE loc_423 ((LocInfoE loc_424 (use{it_layout u64} (LocInfoE loc_425 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_426 ((LocInfoE loc_427 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_427 ((LocInfoE loc_428 (use{it_layout u32} (LocInfoE loc_429 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_430 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_430 ((LocInfoE loc_431 (Call (LocInfoE loc_433 (global___builtin_ffsll)) [@{expr} LocInfoE loc_434 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_434 ((LocInfoE loc_435 ((LocInfoE loc_436 ((LocInfoE loc_437 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_438 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_439 ((LocInfoE loc_440 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_441 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_441 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_442 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_442 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_443 ((LocInfoE loc_444 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_445 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_446 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_446 ((LocInfoE loc_447 ((LocInfoE loc_448 ((LocInfoE loc_449 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_450 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_450 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_451 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_451 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_452 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_452 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_453 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_454 ((LocInfoE loc_455 ((LocInfoE loc_456 ((LocInfoE loc_457 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_458 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_459 ((LocInfoE loc_460 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_461 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_461 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_462 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_462 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_463 ((LocInfoE loc_464 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_465 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_466 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_466 ((LocInfoE loc_467 ((LocInfoE loc_468 ((LocInfoE loc_469 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_470 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_470 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_471 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_471 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_472 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_472 (i2v 7 i32))))))))))))))) ; + locinfo: loc_354 ; + LocInfoE loc_371 ("attr") <-{ it_layout u64 } + LocInfoE loc_372 ((LocInfoE loc_373 (use{it_layout u64} (LocInfoE loc_374 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_375 ((LocInfoE loc_376 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_376 ((LocInfoE loc_377 (use{it_layout u32} (LocInfoE loc_378 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_379 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_379 ((LocInfoE loc_380 (Call (LocInfoE loc_382 (global___builtin_ffsll)) [@{expr} LocInfoE loc_383 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_383 ((LocInfoE loc_384 ((LocInfoE loc_385 ((LocInfoE loc_386 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_387 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_388 ((LocInfoE loc_389 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_390 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_390 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_391 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_391 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_392 ((LocInfoE loc_393 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_394 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_395 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_395 ((LocInfoE loc_396 ((LocInfoE loc_397 ((LocInfoE loc_398 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_399 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_399 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_400 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_400 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_401 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_401 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_402 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_403 ((LocInfoE loc_404 ((LocInfoE loc_405 ((LocInfoE loc_406 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_407 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_408 ((LocInfoE loc_409 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_410 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_410 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_411 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_411 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_412 ((LocInfoE loc_413 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_414 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_415 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_415 ((LocInfoE loc_416 ((LocInfoE loc_417 ((LocInfoE loc_418 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_419 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_419 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_420 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_420 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_421 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_421 (i2v 9 i32))))))))))))))) ; + locinfo: loc_355 ; + LocInfoE loc_364 ("attr") <-{ it_layout u64 } + LocInfoE loc_365 ((LocInfoE loc_366 (use{it_layout u64} (LocInfoE loc_367 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_368 ((LocInfoE loc_369 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_370 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_370 (i2v 10 i32))))))) ; + locinfo: loc_356 ; + LocInfoE loc_359 ((LocInfoE loc_360 (!{void*} (LocInfoE loc_361 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } + LocInfoE loc_362 (use{it_layout u64} (LocInfoE loc_363 ("attr"))) ; + locinfo: loc_357 ; + Return (LocInfoE loc_358 (i2v 0 i32)) ]> $ <[ "#3" := - locinfo: loc_480 ; - if: LocInfoE loc_480 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_480 ((LocInfoE loc_481 (use{it_layout u32} (LocInfoE loc_482 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_483 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_483 (i2v 2 i32))))))) + locinfo: loc_486 ; + if: LocInfoE loc_486 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_486 ((LocInfoE loc_487 (use{it_layout u32} (LocInfoE loc_488 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_489 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_489 (i2v 2 i32))))))) then - locinfo: loc_476 ; + locinfo: loc_482 ; Goto "#7" else - locinfo: loc_474 ; + locinfo: loc_480 ; Goto "#8" ]> $ <[ "#4" := - locinfo: loc_474 ; - if: LocInfoE loc_474 (use{it_layout bool_it} (LocInfoE loc_475 ("device"))) + locinfo: loc_480 ; + if: LocInfoE loc_480 (use{it_layout bool_it} (LocInfoE loc_481 ("device"))) then - locinfo: loc_470 ; + locinfo: loc_476 ; Goto "#5" else - locinfo: loc_347 ; + locinfo: loc_353 ; Goto "#6" ]> $ <[ "#5" := - locinfo: loc_470 ; - Return (LocInfoE loc_471 (UnOp NegOp (IntOp i32) (LocInfoE loc_472 (i2v 22 i32)))) + locinfo: loc_476 ; + Return (LocInfoE loc_477 (UnOp NegOp (IntOp i32) (LocInfoE loc_478 (i2v 22 i32)))) ]> $ <[ "#6" := - locinfo: loc_347 ; + locinfo: loc_353 ; Goto "#2" ]> $ <[ "#7" := - locinfo: loc_476 ; - Return (LocInfoE loc_477 (UnOp NegOp (IntOp i32) (LocInfoE loc_478 (i2v 22 i32)))) + locinfo: loc_482 ; + Return (LocInfoE loc_483 (UnOp NegOp (IntOp i32) (LocInfoE loc_484 (i2v 22 i32)))) ]> $ <[ "#8" := - locinfo: loc_474 ; + locinfo: loc_480 ; Goto "#4" ]> $ <[ "#9" := - locinfo: loc_485 ; - LocInfoE loc_486 ("attr") <-{ it_layout u64 } - LocInfoE loc_487 ((LocInfoE loc_488 (use{it_layout u64} (LocInfoE loc_489 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_490 ((LocInfoE loc_491 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_492 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_492 (i2v 54 i32))))))) ; - locinfo: loc_347 ; + locinfo: loc_491 ; + LocInfoE loc_492 ("attr") <-{ it_layout u64 } + LocInfoE loc_493 ((LocInfoE loc_494 (use{it_layout u64} (LocInfoE loc_495 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_496 ((LocInfoE loc_497 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_498 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_498 (i2v 54 i32))))))) ; + locinfo: loc_353 ; Goto "#2" ]> $∅ )%E diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 06aff26f..87435c28 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -16,23 +16,23 @@ Section spec. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := - fn(∀ pte : Z; (pte @ (int (u64))); True) - → ∃ () : (), ((get_field pte_valid pte) @ (boolean (bool_it))); True. + fn(∀ pte : (bvec Pte); (pte @ (bitvec (Pte))); True) + → ∃ () : (), ((pte.[valid]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := - fn(∀ (pte, level) : Z * nat; (pte @ (int (u64))), (level @ (int (u32))); True) - → ∃ () : (), ((bool_decide (level <> 3%nat) && get_field pte_valid pte && get_field pte_table pte) @ (boolean (bool_it))); True. + fn(∀ (pte, level) : (bvec Pte) * Z; (pte @ (bitvec (Pte))), (level @ (int (u32))); True) + → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && bool_decide (pte.[page_or_table])) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := - fn(∀ (pte, p) : Z * loc; (p @ (&own (pte @ (int (u64))))); True) - → ∃ () : (), (void); (p ◁ₗ ((put_field pte_valid false pte) @ (int (u64)))). + fn(∀ (pte, p) : (bvec Pte) * loc; (p @ (&own (pte @ (bitvec (Pte))))); True) + → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (bitvec (Pte)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ () : (), ((mask_field pte_addr pa) @ (int (u64))); True. + → ∃ () : (), (((empty_bvec Pte).[addr := (as_bvec Pte pa).[addr]]) @ (bitvec (Pte))); True. (* Function [kvm_set_table_pte] has been skipped. *) diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index c6e78dbc..60d3b2f5 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -1,78 +1,30 @@ From refinedc.typing Require Import typing. -(* TODO: Z (infinite vector) <-> list|vec bool *) - -Record field_desc := { - field_offset : nat; - field_len : nat; - field_value_t : Type; - field_encode : field_value_t -> list bool; (* array bool field_len; vec *) - field_decode : list bool -> field_value_t; -}. - -Fixpoint read_bits (offset len : nat) (bv : Z) : list bool := - match len with - | O => [] - | S n => (Z.testbit offset bv) :: read_bits (S offset) n bv - end. - -Definition get_field (fd : field_desc) (bv : Z) : field_value_t fd := - field_decode fd $ read_bits (field_offset fd) (field_len fd) bv. - -Fixpoint write_bits (offset : nat) (v : list bool) (bv : Z) : Z := - match v with - | [] => bv - | true :: bs => Z.setbit offset $ write_bits (S offset) bs bv - | false :: bs => Z.clearbit offset $ write_bits (S offset) bs bv - end. - -Definition put_field (fd : field_desc) (v : field_value_t fd) (bv : Z) : Z := - write_bits (field_offset fd) (field_encode fd v) bv. - -Definition mask_field (fd : field_desc) (bv : Z) : Z := - put_field fd (get_field fd bv) 0. - -Definition bool_field_desc (offset : nat) := {| - field_offset := offset; - field_len := 1; - field_value_t := bool; - field_encode := λ b, [b]; - field_decode := λ l, match l with [b] => b | _ => false (* impossible *) end; -|}. - -Definition enum_field_desc (offset len : nat) (K : Type) `{EqDecision K} - (items : list (K * list bool)) (def : K) := {| - field_offset := offset; - field_len := len; - field_value_t := K; - field_encode := λ k, - let fix f l := - match l with - | [] => [] - | (x, v) :: l' => if bool_decide (x = k) then v else f l' - end - in f items; - field_decode := λ v, - let fix f l := - match l with - | [] => def - | (k, x) :: l' => if bool_decide (x = v) then k else f l' - end - in f items; -|}. - -Definition data_field_desc (offset len : nat) := {| - field_offset := offset; - field_len := len; - field_value_t := list bool; - field_encode := id; - field_decode := id; -|}. +(* Record mm_ops := { + zalloc_page : ∀ A, A → unit; + zalloc_pages_exact : Z → unit; + free_pages_exact : Z → Z → unit; + get_page : Z -> unit; + put_page : Z -> unit; + page_count : Z -> Z; + phys_to_virt : Z → Z; + virt_to_phys : Z → Z; +}. *) + +Definition KVM_PGTABLE_MAX_LEVELS := 4. (* pte *) -Definition pte_valid := bool_field_desc 0. - -Definition pte_table := bool_field_desc 1. +Definition Pte : bitvec_type := {| + bt_byte_size_log := 3; (* 2^3 * 8 = 64 *) + bt_fields := 6; + bt_spec := [# bool_field; bool_field; data_field 10; data_field 36; undef_field 3; data_field 13]; +|}. -Definition pte_addr := data_field_desc 12 (47 - 12 + 1). +(* interesting fields *) +Definition valid : fin 6 := 0%fin. (* 0 *) +Definition page_or_table : fin 6 := 1%fin. (* 1 *) +Definition leaf_attr_lo : fin 6 := 2%fin. (* 2..11 *) +Definition addr : fin 6 := 3%fin. (* 12..47 *) +(* 48..50 : undef *) +Definition leaf_attr_hi : fin 6 := 5%fin. (* 51..63 *) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 713ebc55..98874fa4 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -2,15 +2,18 @@ From refinedc.typing Require Export type. From refinedc.typing Require Import programs. Set Default Proof Using "Type". -Record field_desc := { - fd_len : nat; - fd_type : Type; - fd_encode : fd_type → vec bool fd_len; - fd_decode : vec bool fd_len → fd_type; - encode_decode : ∀ x, fd_decode (fd_encode x) = x; -}. - -Program Definition bool_field_desc := {| +(** Representation of a bit vector type (specification of fields). *) + +Record field_desc := + FieldDesc { + fd_len : nat; + fd_type : Type; + fd_encode : fd_type → vec bool fd_len; + fd_decode : vec bool fd_len → fd_type; + encode_decode : ∀ x, fd_decode (fd_encode x) = x; + }. + +Program Definition bool_field := {| fd_len := 1; fd_type := bool; fd_encode b := [# b]; @@ -18,7 +21,7 @@ Program Definition bool_field_desc := {| |}. Next Obligation. done. Qed. -Program Definition data_field_desc (len : nat) := {| +Program Definition data_field (len : nat) := {| fd_len := len; fd_type := vec bool len; fd_encode := id; @@ -26,13 +29,36 @@ Program Definition data_field_desc (len : nat) := {| |}. Next Obligation. done. Qed. -(* Record field := { - fd : field_desc; - data : vec bool (fd_len fd); -}. *) +Program Definition undef_field := data_field. -Definition field_vec {n : nat} (fdv : vec field_desc n) := - ∀ i, vec bool (fd_len (fdv !!! i)). +Record bitvec_type := + BitvecType { + bt_byte_size_log : nat; + bt_fields : nat; + bt_spec : vec field_desc bt_fields; + (* TODO: total length of `bt_spec` = 8 * `bt_bytes` *) + }. + +Definition bt_layout (bt : bitvec_type) : layout := {| + ly_size := 2 ^ bt_byte_size_log bt; + ly_align_log := bt_byte_size_log bt; +|}. + +Definition bvec (bt : bitvec_type) : Type := + ∀ i, vec bool (fd_len (bt_spec bt !!! i)). + +Definition bvec_to_list_go {bt : bitvec_type} (bv : bvec bt) (n : nat) : + (n ≤ bt_fields bt)%nat → list bool. +Proof. + move => ?. induction n as [|n IHn]. + - refine []. + - have Hlt : (n < bt_fields bt)%nat by lia. + have Hle : (n ≤ bt_fields bt)%nat by lia. + refine (IHn Hle ++ vec_to_list (bv (nat_to_fin Hlt))). +Defined. + +Definition bvec_to_list {bt : bitvec_type} (bv : bvec bt) : list bool := + bvec_to_list_go bv (bt_fields bt) (Nat.le_refl _). Fixpoint extract_bits (start len : nat) (data : Z) : vec bool len := match len with @@ -40,56 +66,80 @@ Fixpoint extract_bits (start len : nat) (data : Z) : vec bool len := | S k => Z.testbit data start ::: extract_bits (S start) k data end. -Definition mk_fv {n : nat} (fdv : vec field_desc n) (data : Z) : field_vec fdv := +Definition as_bvec (bt : bitvec_type) (data : Z) : bvec bt := let offset i := foldr (λ fd acc, (fd_len fd + acc)%nat) 0%nat $ - vec_to_list $ vtake i fdv - in λ i, extract_bits (offset i) (fd_len (fdv !!! i)) data. + vec_to_list $ vtake i (bt_spec bt) + in λ i, extract_bits (offset i) (fd_len (bt_spec bt !!! i)) data. + +Definition empty_bvec (bt : bitvec_type) : bvec bt := as_bvec bt 0. -Definition fv_get {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) (i : fin n) : fd_type (fdv !!! i) := - fd_decode (fdv !!! i) (fv i). +Definition val_of_bvec {bt : bitvec_type} (bv : bvec bt) : option val. +Admitted. -Notation "fv .[ i ]" := (fv_get fv i) (at level 5, format "fv .[ i ]"). +Lemma val_of_bvec_length (bt : bitvec_type) (bv : bvec bt) v : + val_of_bvec bv = Some v → length v = (2 ^ bt_byte_size_log bt)%nat. +Admitted. -Definition fv_put {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) (i : fin n) (x : fd_type (fdv !!! i)) : field_vec fdv. +Definition bvec_get {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) : fd_type (bt_spec bt !!! i) := + fd_decode (bt_spec bt !!! i) (bv i). + +Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]"). + +Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt. (* λ j, if bool_decide (i = j) then (fd_encode (fdv !!! i) x) *) (* else fv j. *) Proof. move => j. destruct (decide (i = j)) as [<-|]. - - refine (fd_encode (fdv !!! i) x). - - refine (fv j). + - refine (fd_encode (bt_spec bt !!! i) x). + - refine (bv j). Defined. -Notation "fv .[ i := x ]" := (fv_put fv i x) (at level 5, format "fv .[ i := x ]"). +Notation "bv .[ i := x ]" := (bvec_put bv i x) (at level 5, format "bv .[ i := x ]"). -Lemma fv_get_put {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) i x : - fv.[i := x].[i] = x. +Lemma bvec_get_put {bt : bitvec_type} (bv : bvec bt) i x : + bv.[i := x].[i] = x. Proof. - by rewrite /fv_get /fv_put decide_left encode_decode. + by rewrite /bvec_get /bvec_put decide_left encode_decode. Qed. -Lemma fv_get_put_ne {n : nat} {fdv : vec field_desc n} (fv : field_vec fdv) i j x : - i ≠ j → fv.[i := x].[j] = fv.[j]. +Lemma bvec_get_put_ne {bt : bitvec_type} (bv : bvec bt) i j x : + i ≠ j → bv.[i := x].[j] = bv.[j]. Proof. - rewrite /fv_get /fv_put. case_match => //. + rewrite /bvec_get /bvec_put. case_match => //. Qed. -(* test *) -Section pte_test. - - Definition pte_fds := [# bool_field_desc; bool_field_desc; data_field_desc 2]. - - Definition valid : fin 3 := 0%fin. - Definition type : fin 3 := 1%fin. - Definition attr : fin 3 := 2%fin. - - Definition Pte := field_vec pte_fds. - Definition pte : Pte := mk_fv pte_fds 9. - - Example test_pte_get : pte.[attr] = [# false; true]. - Proof. done. Qed. - - Example test_pte_put : pte.[valid := true].[type := false].[valid] = true. - Proof. rewrite fv_get_put_ne; last done. rewrite fv_get_put. done. Qed. - -End pte_test. +Section bitvec. + Context `{!typeG Σ}. + + Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bvec bt) : type := {| + ty_own β l := (∃ v, ⌜val_of_bvec bv = Some v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I + |}. + Next Obligation. + iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. + Qed. + + Program Definition bitvec (bt : bitvec_type) : rtype := {| + rty_type := bvec bt; + rty := bitvec_inner_type bt; + |}. + + Global Program Instance rmovable_bitvec bt : RMovable (bitvec bt) := {| + rmovable bv := {| + ty_layout := bt_layout bt; + ty_own_val v := ⌜val_of_bvec bv = Some v⌝%I; + |} + |}. + Next Obligation. iIntros (bt bv l). by iDestruct 1 as (???)"?". Qed. + Next Obligation. + by iIntros (bt bv v ?%val_of_bvec_length). Qed. + Next Obligation. + iIntros (bt bv l). iDestruct 1 as (v Hl Hv) "Hl". + iExists _. by iFrame. + Qed. + Next Obligation. iIntros (it bv l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. + Next Obligation. iIntros (bt x1 x2). done. Qed. + +End bitvec. + +Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. -- GitLab From cb3d7e3ab6f58ae0db590fe03e18bf1c099eeccb Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 18 Mar 2021 14:43:18 +0800 Subject: [PATCH 06/71] encode bvec as vec bool --- linux/casestudies/pgtable.c | 64 +- .../proofs/pgtable/generated_code.v | 815 +++++++++--------- .../generated_proof_kvm_set_table_pte.v | 2 +- .../generated_proof_kvm_set_valid_leaf_pte.v | 2 +- .../proofs/pgtable/generated_spec.v | 65 +- .../proofs/pgtable/pgtable_lemmas.v | 13 +- theories/typing/bitvec.v | 164 +++- 7 files changed, 620 insertions(+), 505 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 7dfbb03f..318dac0c 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -114,15 +114,16 @@ enum kvm_pgtable_prot { * @phys_to_virt: Convert a physical address into a virtual address. * @virt_to_phys: Convert a virtual address into a physical address. */ -struct kvm_pgtable_mm_ops { - void* (*zalloc_page)(void *arg); - void* (*zalloc_pages_exact)(size_t size); - void (*free_pages_exact)(void *addr, size_t size); - void (*get_page)(void *addr); - void (*put_page)(void *addr); - int (*page_count)(void *addr); - void* (*phys_to_virt)(phys_addr_t phys); - phys_addr_t (*virt_to_phys)(void *addr); +struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { + // void* (*zalloc_page)(void *arg); + // void* (*zalloc_pages_exact)(size_t size); + // void (*free_pages_exact)(void *addr, size_t size); + // void (*get_page)(void *addr); + // void (*put_page)(void *addr); + // int (*page_count)(void *addr); + // void* (*phys_to_virt)(phys_addr_t phys); + [[rc::field("function_ptr<{fn(∀ (p, a) : loc * Z; p @ &own (a @ int u64); True) → ∃ () : (), (ops.(virt_to_phys) a) @ int u64; True}>")]] + phys_addr_t (*virt_to_phys)(void *addr); }; /* asm/memory.h */ @@ -160,7 +161,7 @@ struct kvm_pgtable_mm_ops { [[rc::parameters("pte : {bvec Pte}")]] [[rc::args("pte @ bitvec")]] -[[rc::returns("{pte.[valid]} @ boolean")]] +[[rc::returns("{pte[valid]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { @@ -169,8 +170,7 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : {bvec Pte}", "level : Z")]] [[rc::args("pte @ bitvec", "level @ int")]] -[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && \ - bool_decide (pte.[page_or_table])} @ boolean")]] +[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte[valid] && pte[page_or_table]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -183,7 +183,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : {bvec Pte}", "p : loc")]] [[rc::args("p @ &own>")]] -[[rc::ensures("own p : {pte.[valid := false]} @ bitvec")]] +[[rc::ensures("own p : {pte[valid := false]} @ bitvec")]] [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -193,7 +193,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] -[[rc::returns("{(empty_bvec Pte).[addr := (as_bvec Pte pa).[addr]]} @ bitvec")]] +[[rc::returns("{0%%Pte[addr := pa%%Pte[addr]]} @ bitvec")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { @@ -205,13 +205,14 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) return pte; } -// [[rc::parameters("p : loc", "q : loc", "o : ???", "pte : Pte", "va : Z", "ops : mm_ops")]] -// [[rc::args("p @ &own>", "q @ &own>", "o @ &own")]] -// [[rc::requires("{pte.[valid] = true}")]] -// [[rc::exists("pa : Z")]] -// [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] -// [[rc::ensures("own p : {pte.[addr := pa.addr; page_or_table := true; valid := true]} @ bitvec")]] -// [[rc::trust_me]] +[[rc::parameters("p : loc", "q : loc", "o : loc", "pte : {bvec Pte}", "va : Z", "ops : mm_ops")]] +[[rc::args("p @ &own>", "q @ &own>", + "o @ &own")]] +[[rc::requires("{pte[valid] = true}")]] +[[rc::exists("pa : Z")]] +[[rc::ensures("{ops.(virt_to_phys) va = pa}")]] +[[rc::ensures("own p : {0%%Pte[addr := pa%%Pte[addr]; page_or_table := true; valid := true]} @ bitvec")]] +[[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) { @@ -223,18 +224,15 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, *ptep = pte; } -// [[rc::parameters("p : loc", "pte : Pte", "pa : Z", "attr : Pte", "level : nat")]] -// [[rc::args("p @ &own>", "pa @ int", "attr @ bitvec", "level @ int")]] -// [[rc::exists("is_page : bool")]] -// [[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] -// [[rc::exists("pa' : Pte")]] -// [[rc::ensures("pa' = mk_fv pte_fds pa")]] -// [[rc::exists("pte' : Pte")]] -// [[rc::ensures("{pte' = empty.[addr := pa'.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; \ -// leaf_attr_hi := attr.[leaf_attr_hi]; page_or_table := is_page; valid := true]}")]] -// [[rc::ensures("own p : {if pte.[valid] then pte else pte'} @ bitvec")]] -// [[rc::returns("{if pte.[valid] then bool_decide (pte = pte') else true}")]] -// [[rc::trust_me]] +[[rc::parameters("p : loc", "pte : {bvec Pte}", "pa : Z", "attr : {bvec Pte}", "level : Z")]] +[[rc::args("p @ &own>", "pa @ int", "attr @ bitvec", "level @ int")]] +[[rc::exists("is_page : bool")]] +[[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] +[[rc::exists("pte1 : {bvec Pte}")]] // TODO : `pte'` not parsed +[[rc::ensures("{pte1 = 0%%Pte[addr := pa%%Pte[addr]; leaf_attr_lo := attr[leaf_attr_lo]; leaf_attr_hi := attr[leaf_attr_hi]][page_or_table := is_page; valid := true]}")]] +[[rc::ensures("own p : {if pte[valid] then pte else pte1} @ bitvec")]] +[[rc::returns("{if pte[valid] then bool_decide (pte = pte1) else true} @ boolean")]] +[[rc::trust_me]] static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, u32 level) { diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 3345281a..6ba7294d 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,13 +6,13 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 167 4 167 30. - Definition loc_3 : location_info := LocationInfo file_0 167 11 167 29. - Definition loc_4 : location_info := LocationInfo file_0 167 11 167 14. - Definition loc_5 : location_info := LocationInfo file_0 167 11 167 14. - Definition loc_6 : location_info := LocationInfo file_0 167 17 167 29. - Definition loc_7 : location_info := LocationInfo file_0 167 18 167 21. - Definition loc_8 : location_info := LocationInfo file_0 167 25 167 28. + Definition loc_2 : location_info := LocationInfo file_0 168 4 168 30. + Definition loc_3 : location_info := LocationInfo file_0 168 11 168 29. + Definition loc_4 : location_info := LocationInfo file_0 168 11 168 14. + Definition loc_5 : location_info := LocationInfo file_0 168 11 168 14. + Definition loc_6 : location_info := LocationInfo file_0 168 17 168 29. + Definition loc_7 : location_info := LocationInfo file_0 168 18 168 21. + Definition loc_8 : location_info := LocationInfo file_0 168 25 168 28. Definition loc_11 : location_info := LocationInfo file_0 177 4 178 17. Definition loc_12 : location_info := LocationInfo file_0 179 4 180 17. Definition loc_13 : location_info := LocationInfo file_0 181 4 181 82. @@ -149,414 +149,407 @@ Section code. Definition loc_154 : location_info := LocationInfo file_0 200 83 200 84. Definition loc_155 : location_info := LocationInfo file_0 200 88 200 89. Definition loc_156 : location_info := LocationInfo file_0 200 92 200 96. - Definition loc_161 : location_info := LocationInfo file_0 218 4 218 79. - Definition loc_162 : location_info := LocationInfo file_0 219 4 219 75. - Definition loc_163 : location_info := LocationInfo file_0 220 4 220 24. - Definition loc_164 : location_info := LocationInfo file_0 221 4 221 33. - Definition loc_165 : location_info := LocationInfo file_0 223 1 223 13. - Definition loc_166 : location_info := LocationInfo file_0 223 1 223 6. - Definition loc_167 : location_info := LocationInfo file_0 223 2 223 6. - Definition loc_168 : location_info := LocationInfo file_0 223 2 223 6. - Definition loc_169 : location_info := LocationInfo file_0 223 9 223 12. - Definition loc_170 : location_info := LocationInfo file_0 223 9 223 12. - Definition loc_171 : location_info := LocationInfo file_0 221 12 221 30. - Definition loc_172 : location_info := LocationInfo file_0 221 12 221 25. - Definition loc_173 : location_info := LocationInfo file_0 221 12 221 25. - Definition loc_174 : location_info := LocationInfo file_0 221 26 221 29. - Definition loc_175 : location_info := LocationInfo file_0 221 26 221 29. - Definition loc_176 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_177 : location_info := LocationInfo file_0 220 4 220 23. - Definition loc_178 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_179 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_180 : location_info := LocationInfo file_0 220 11 220 23. - Definition loc_181 : location_info := LocationInfo file_0 220 12 220 15. - Definition loc_182 : location_info := LocationInfo file_0 220 19 220 22. - Definition loc_183 : location_info := LocationInfo file_0 219 4 219 7. - Definition loc_184 : location_info := LocationInfo file_0 219 4 219 74. - Definition loc_185 : location_info := LocationInfo file_0 219 4 219 7. - Definition loc_186 : location_info := LocationInfo file_0 219 4 219 7. - Definition loc_187 : location_info := LocationInfo file_0 219 11 219 74. - Definition loc_188 : location_info := LocationInfo file_0 219 12 219 56. - Definition loc_189 : location_info := LocationInfo file_0 219 13 219 16. - Definition loc_190 : location_info := LocationInfo file_0 219 20 219 55. - Definition loc_191 : location_info := LocationInfo file_0 219 21 219 50. - Definition loc_192 : location_info := LocationInfo file_0 219 21 219 36. - Definition loc_193 : location_info := LocationInfo file_0 219 21 219 36. - Definition loc_194 : location_info := LocationInfo file_0 219 37 219 49. - Definition loc_195 : location_info := LocationInfo file_0 219 38 219 41. - Definition loc_196 : location_info := LocationInfo file_0 219 45 219 48. - Definition loc_197 : location_info := LocationInfo file_0 219 53 219 54. - Definition loc_198 : location_info := LocationInfo file_0 219 59 219 73. - Definition loc_199 : location_info := LocationInfo file_0 219 61 219 64. - Definition loc_200 : location_info := LocationInfo file_0 219 68 219 71. - Definition loc_201 : location_info := LocationInfo file_0 218 33 218 78. - Definition loc_202 : location_info := LocationInfo file_0 218 33 218 48. - Definition loc_203 : location_info := LocationInfo file_0 218 33 218 48. - Definition loc_204 : location_info := LocationInfo file_0 218 49 218 77. - Definition loc_205 : location_info := LocationInfo file_0 218 49 218 69. - Definition loc_206 : location_info := LocationInfo file_0 218 49 218 69. - Definition loc_207 : location_info := LocationInfo file_0 218 49 218 69. - Definition loc_208 : location_info := LocationInfo file_0 218 49 218 55. - Definition loc_209 : location_info := LocationInfo file_0 218 49 218 55. - Definition loc_210 : location_info := LocationInfo file_0 218 70 218 76. - Definition loc_211 : location_info := LocationInfo file_0 218 70 218 76. - Definition loc_214 : location_info := LocationInfo file_0 218 20 218 25. - Definition loc_215 : location_info := LocationInfo file_0 218 20 218 25. - Definition loc_216 : location_info := LocationInfo file_0 218 21 218 25. - Definition loc_217 : location_info := LocationInfo file_0 218 21 218 25. - Definition loc_222 : location_info := LocationInfo file_0 241 4 241 53. - Definition loc_223 : location_info := LocationInfo file_0 242 4 243 33. - Definition loc_224 : location_info := LocationInfo file_0 244 4 244 171. - Definition loc_225 : location_info := LocationInfo file_0 245 4 245 78. - Definition loc_226 : location_info := LocationInfo file_0 246 4 246 24. - Definition loc_227 : location_info := LocationInfo file_0 248 4 249 26. - Definition loc_228 : location_info := LocationInfo file_0 251 1 251 13. - Definition loc_229 : location_info := LocationInfo file_0 252 4 252 13. - Definition loc_230 : location_info := LocationInfo file_0 252 11 252 12. - Definition loc_231 : location_info := LocationInfo file_0 251 1 251 6. - Definition loc_232 : location_info := LocationInfo file_0 251 2 251 6. - Definition loc_233 : location_info := LocationInfo file_0 251 2 251 6. - Definition loc_234 : location_info := LocationInfo file_0 251 9 251 12. - Definition loc_235 : location_info := LocationInfo file_0 251 9 251 12. - Definition loc_236 : location_info := LocationInfo file_0 249 8 249 26. - Definition loc_237 : location_info := LocationInfo file_0 249 15 249 25. - Definition loc_238 : location_info := LocationInfo file_0 249 15 249 18. - Definition loc_239 : location_info := LocationInfo file_0 249 15 249 18. - Definition loc_240 : location_info := LocationInfo file_0 249 22 249 25. - Definition loc_241 : location_info := LocationInfo file_0 249 22 249 25. - Definition loc_243 : location_info := LocationInfo file_0 248 8 248 26. - Definition loc_244 : location_info := LocationInfo file_0 248 8 248 21. - Definition loc_245 : location_info := LocationInfo file_0 248 8 248 21. - Definition loc_246 : location_info := LocationInfo file_0 248 22 248 25. - Definition loc_247 : location_info := LocationInfo file_0 248 22 248 25. - Definition loc_248 : location_info := LocationInfo file_0 246 4 246 7. - Definition loc_249 : location_info := LocationInfo file_0 246 4 246 23. - Definition loc_250 : location_info := LocationInfo file_0 246 4 246 7. - Definition loc_251 : location_info := LocationInfo file_0 246 4 246 7. - Definition loc_252 : location_info := LocationInfo file_0 246 11 246 23. - Definition loc_253 : location_info := LocationInfo file_0 246 12 246 15. - Definition loc_254 : location_info := LocationInfo file_0 246 19 246 22. - Definition loc_255 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_256 : location_info := LocationInfo file_0 245 4 245 77. - Definition loc_257 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_258 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_259 : location_info := LocationInfo file_0 245 11 245 77. - Definition loc_260 : location_info := LocationInfo file_0 245 12 245 59. - Definition loc_261 : location_info := LocationInfo file_0 245 13 245 19. - Definition loc_262 : location_info := LocationInfo file_0 245 13 245 19. - Definition loc_263 : location_info := LocationInfo file_0 245 23 245 58. - Definition loc_264 : location_info := LocationInfo file_0 245 24 245 53. - Definition loc_265 : location_info := LocationInfo file_0 245 24 245 39. - Definition loc_266 : location_info := LocationInfo file_0 245 24 245 39. - Definition loc_267 : location_info := LocationInfo file_0 245 40 245 52. - Definition loc_268 : location_info := LocationInfo file_0 245 41 245 44. - Definition loc_269 : location_info := LocationInfo file_0 245 48 245 51. - Definition loc_270 : location_info := LocationInfo file_0 245 56 245 57. - Definition loc_271 : location_info := LocationInfo file_0 245 62 245 76. - Definition loc_272 : location_info := LocationInfo file_0 245 64 245 67. - Definition loc_273 : location_info := LocationInfo file_0 245 71 245 74. - Definition loc_274 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_275 : location_info := LocationInfo file_0 244 4 244 170. - Definition loc_276 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_277 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_278 : location_info := LocationInfo file_0 244 11 244 170. - Definition loc_279 : location_info := LocationInfo file_0 244 11 244 15. - Definition loc_280 : location_info := LocationInfo file_0 244 11 244 15. - Definition loc_281 : location_info := LocationInfo file_0 244 18 244 170. - Definition loc_282 : location_info := LocationInfo file_0 244 19 244 92. - Definition loc_283 : location_info := LocationInfo file_0 244 20 244 47. - Definition loc_284 : location_info := LocationInfo file_0 244 21 244 42. - Definition loc_285 : location_info := LocationInfo file_0 244 21 244 27. - Definition loc_286 : location_info := LocationInfo file_0 244 23 244 26. - Definition loc_287 : location_info := LocationInfo file_0 244 30 244 42. - Definition loc_288 : location_info := LocationInfo file_0 244 31 244 34. - Definition loc_289 : location_info := LocationInfo file_0 244 38 244 41. - Definition loc_290 : location_info := LocationInfo file_0 244 45 244 46. - Definition loc_291 : location_info := LocationInfo file_0 244 50 244 91. - Definition loc_292 : location_info := LocationInfo file_0 244 51 244 55. - Definition loc_293 : location_info := LocationInfo file_0 244 52 244 55. - Definition loc_294 : location_info := LocationInfo file_0 244 59 244 90. - Definition loc_295 : location_info := LocationInfo file_0 244 60 244 82. - Definition loc_296 : location_info := LocationInfo file_0 244 60 244 78. - Definition loc_297 : location_info := LocationInfo file_0 244 61 244 73. - Definition loc_298 : location_info := LocationInfo file_0 244 76 244 77. - Definition loc_299 : location_info := LocationInfo file_0 244 81 244 82. - Definition loc_300 : location_info := LocationInfo file_0 244 85 244 89. - Definition loc_301 : location_info := LocationInfo file_0 244 95 244 169. - Definition loc_302 : location_info := LocationInfo file_0 244 96 244 124. - Definition loc_303 : location_info := LocationInfo file_0 244 97 244 119. - Definition loc_304 : location_info := LocationInfo file_0 244 97 244 103. - Definition loc_305 : location_info := LocationInfo file_0 244 99 244 102. - Definition loc_306 : location_info := LocationInfo file_0 244 106 244 119. - Definition loc_307 : location_info := LocationInfo file_0 244 107 244 110. - Definition loc_308 : location_info := LocationInfo file_0 244 114 244 118. - Definition loc_309 : location_info := LocationInfo file_0 244 122 244 123. - Definition loc_310 : location_info := LocationInfo file_0 244 127 244 168. - Definition loc_311 : location_info := LocationInfo file_0 244 128 244 132. - Definition loc_312 : location_info := LocationInfo file_0 244 129 244 132. - Definition loc_313 : location_info := LocationInfo file_0 244 136 244 167. - Definition loc_314 : location_info := LocationInfo file_0 244 137 244 159. - Definition loc_315 : location_info := LocationInfo file_0 244 137 244 155. - Definition loc_316 : location_info := LocationInfo file_0 244 138 244 150. - Definition loc_317 : location_info := LocationInfo file_0 244 153 244 154. - Definition loc_318 : location_info := LocationInfo file_0 244 158 244 159. - Definition loc_319 : location_info := LocationInfo file_0 244 162 244 166. - Definition loc_320 : location_info := LocationInfo file_0 242 15 243 32. - Definition loc_321 : location_info := LocationInfo file_0 242 15 242 32. - Definition loc_322 : location_info := LocationInfo file_0 242 16 242 21. - Definition loc_323 : location_info := LocationInfo file_0 242 16 242 21. - Definition loc_324 : location_info := LocationInfo file_0 242 25 242 31. - Definition loc_325 : location_info := LocationInfo file_0 242 25 242 27. - Definition loc_326 : location_info := LocationInfo file_0 242 30 242 31. - Definition loc_327 : location_info := LocationInfo file_0 242 35 242 36. - Definition loc_328 : location_info := LocationInfo file_0 243 31 243 32. - Definition loc_331 : location_info := LocationInfo file_0 241 33 241 52. - Definition loc_332 : location_info := LocationInfo file_0 241 33 241 48. - Definition loc_333 : location_info := LocationInfo file_0 241 33 241 48. - Definition loc_334 : location_info := LocationInfo file_0 241 49 241 51. - Definition loc_335 : location_info := LocationInfo file_0 241 49 241 51. - Definition loc_338 : location_info := LocationInfo file_0 241 20 241 25. - Definition loc_339 : location_info := LocationInfo file_0 241 20 241 25. - Definition loc_340 : location_info := LocationInfo file_0 241 21 241 25. - Definition loc_341 : location_info := LocationInfo file_0 241 21 241 25. - Definition loc_346 : location_info := LocationInfo file_0 264 4 264 50. - Definition loc_347 : location_info := LocationInfo file_0 265 4 265 31. - Definition loc_348 : location_info := LocationInfo file_0 266 4 266 209. - Definition loc_349 : location_info := LocationInfo file_0 267 4 267 15. - Definition loc_350 : location_info := LocationInfo file_0 268 4 269 29. - Definition loc_351 : location_info := LocationInfo file_0 270 4 271 19. - Definition loc_352 : location_info := LocationInfo file_0 272 4 279 5. - Definition loc_353 : location_info := LocationInfo file_0 280 4 280 197. - Definition loc_354 : location_info := LocationInfo file_0 281 4 281 197. - Definition loc_355 : location_info := LocationInfo file_0 282 4 282 26. - Definition loc_356 : location_info := LocationInfo file_0 283 4 283 22. - Definition loc_357 : location_info := LocationInfo file_0 284 4 284 13. - Definition loc_358 : location_info := LocationInfo file_0 284 11 284 12. - Definition loc_359 : location_info := LocationInfo file_0 283 4 283 14. - Definition loc_360 : location_info := LocationInfo file_0 283 4 283 8. - Definition loc_361 : location_info := LocationInfo file_0 283 4 283 8. - Definition loc_362 : location_info := LocationInfo file_0 283 17 283 21. - Definition loc_363 : location_info := LocationInfo file_0 283 17 283 21. - Definition loc_364 : location_info := LocationInfo file_0 282 4 282 8. - Definition loc_365 : location_info := LocationInfo file_0 282 4 282 25. - Definition loc_366 : location_info := LocationInfo file_0 282 4 282 8. - Definition loc_367 : location_info := LocationInfo file_0 282 4 282 8. - Definition loc_368 : location_info := LocationInfo file_0 282 12 282 25. - Definition loc_369 : location_info := LocationInfo file_0 282 13 282 16. - Definition loc_370 : location_info := LocationInfo file_0 282 20 282 24. - Definition loc_371 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_372 : location_info := LocationInfo file_0 281 4 281 196. - Definition loc_373 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_374 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_375 : location_info := LocationInfo file_0 281 12 281 196. - Definition loc_376 : location_info := LocationInfo file_0 281 13 281 118. - Definition loc_377 : location_info := LocationInfo file_0 281 14 281 18. - Definition loc_378 : location_info := LocationInfo file_0 281 14 281 18. - Definition loc_379 : location_info := LocationInfo file_0 281 22 281 117. - Definition loc_380 : location_info := LocationInfo file_0 281 23 281 112. - Definition loc_381 : location_info := LocationInfo file_0 281 23 281 38. - Definition loc_382 : location_info := LocationInfo file_0 281 23 281 38. - Definition loc_383 : location_info := LocationInfo file_0 281 39 281 111. - Definition loc_384 : location_info := LocationInfo file_0 281 40 281 67. - Definition loc_385 : location_info := LocationInfo file_0 281 41 281 62. - Definition loc_386 : location_info := LocationInfo file_0 281 41 281 47. - Definition loc_387 : location_info := LocationInfo file_0 281 43 281 46. - Definition loc_388 : location_info := LocationInfo file_0 281 50 281 62. - Definition loc_389 : location_info := LocationInfo file_0 281 51 281 54. - Definition loc_390 : location_info := LocationInfo file_0 281 58 281 61. - Definition loc_391 : location_info := LocationInfo file_0 281 65 281 66. - Definition loc_392 : location_info := LocationInfo file_0 281 70 281 110. - Definition loc_393 : location_info := LocationInfo file_0 281 71 281 75. - Definition loc_394 : location_info := LocationInfo file_0 281 72 281 75. - Definition loc_395 : location_info := LocationInfo file_0 281 79 281 109. - Definition loc_396 : location_info := LocationInfo file_0 281 80 281 102. - Definition loc_397 : location_info := LocationInfo file_0 281 80 281 98. - Definition loc_398 : location_info := LocationInfo file_0 281 81 281 93. - Definition loc_399 : location_info := LocationInfo file_0 281 96 281 97. - Definition loc_400 : location_info := LocationInfo file_0 281 101 281 102. - Definition loc_401 : location_info := LocationInfo file_0 281 105 281 108. - Definition loc_402 : location_info := LocationInfo file_0 281 115 281 116. - Definition loc_403 : location_info := LocationInfo file_0 281 121 281 195. - Definition loc_404 : location_info := LocationInfo file_0 281 123 281 150. - Definition loc_405 : location_info := LocationInfo file_0 281 124 281 145. - Definition loc_406 : location_info := LocationInfo file_0 281 124 281 130. - Definition loc_407 : location_info := LocationInfo file_0 281 126 281 129. - Definition loc_408 : location_info := LocationInfo file_0 281 133 281 145. - Definition loc_409 : location_info := LocationInfo file_0 281 134 281 137. - Definition loc_410 : location_info := LocationInfo file_0 281 141 281 144. - Definition loc_411 : location_info := LocationInfo file_0 281 148 281 149. - Definition loc_412 : location_info := LocationInfo file_0 281 153 281 193. - Definition loc_413 : location_info := LocationInfo file_0 281 154 281 158. - Definition loc_414 : location_info := LocationInfo file_0 281 155 281 158. - Definition loc_415 : location_info := LocationInfo file_0 281 162 281 192. - Definition loc_416 : location_info := LocationInfo file_0 281 163 281 185. - Definition loc_417 : location_info := LocationInfo file_0 281 163 281 181. - Definition loc_418 : location_info := LocationInfo file_0 281 164 281 176. - Definition loc_419 : location_info := LocationInfo file_0 281 179 281 180. - Definition loc_420 : location_info := LocationInfo file_0 281 184 281 185. - Definition loc_421 : location_info := LocationInfo file_0 281 188 281 191. - Definition loc_422 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_423 : location_info := LocationInfo file_0 280 4 280 196. - Definition loc_424 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_425 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_426 : location_info := LocationInfo file_0 280 12 280 196. - Definition loc_427 : location_info := LocationInfo file_0 280 13 280 118. - Definition loc_428 : location_info := LocationInfo file_0 280 14 280 18. - Definition loc_429 : location_info := LocationInfo file_0 280 14 280 18. - Definition loc_430 : location_info := LocationInfo file_0 280 22 280 117. - Definition loc_431 : location_info := LocationInfo file_0 280 23 280 112. - Definition loc_432 : location_info := LocationInfo file_0 280 23 280 38. - Definition loc_433 : location_info := LocationInfo file_0 280 23 280 38. - Definition loc_434 : location_info := LocationInfo file_0 280 39 280 111. - Definition loc_435 : location_info := LocationInfo file_0 280 40 280 67. - Definition loc_436 : location_info := LocationInfo file_0 280 41 280 62. - Definition loc_437 : location_info := LocationInfo file_0 280 41 280 47. - Definition loc_438 : location_info := LocationInfo file_0 280 43 280 46. - Definition loc_439 : location_info := LocationInfo file_0 280 50 280 62. - Definition loc_440 : location_info := LocationInfo file_0 280 51 280 54. - Definition loc_441 : location_info := LocationInfo file_0 280 58 280 61. - Definition loc_442 : location_info := LocationInfo file_0 280 65 280 66. - Definition loc_443 : location_info := LocationInfo file_0 280 70 280 110. - Definition loc_444 : location_info := LocationInfo file_0 280 71 280 75. - Definition loc_445 : location_info := LocationInfo file_0 280 72 280 75. - Definition loc_446 : location_info := LocationInfo file_0 280 79 280 109. - Definition loc_447 : location_info := LocationInfo file_0 280 80 280 102. - Definition loc_448 : location_info := LocationInfo file_0 280 80 280 98. - Definition loc_449 : location_info := LocationInfo file_0 280 81 280 93. - Definition loc_450 : location_info := LocationInfo file_0 280 96 280 97. - Definition loc_451 : location_info := LocationInfo file_0 280 101 280 102. - Definition loc_452 : location_info := LocationInfo file_0 280 105 280 108. - Definition loc_453 : location_info := LocationInfo file_0 280 115 280 116. - Definition loc_454 : location_info := LocationInfo file_0 280 121 280 195. - Definition loc_455 : location_info := LocationInfo file_0 280 123 280 150. - Definition loc_456 : location_info := LocationInfo file_0 280 124 280 145. - Definition loc_457 : location_info := LocationInfo file_0 280 124 280 130. - Definition loc_458 : location_info := LocationInfo file_0 280 126 280 129. - Definition loc_459 : location_info := LocationInfo file_0 280 133 280 145. - Definition loc_460 : location_info := LocationInfo file_0 280 134 280 137. - Definition loc_461 : location_info := LocationInfo file_0 280 141 280 144. - Definition loc_462 : location_info := LocationInfo file_0 280 148 280 149. - Definition loc_463 : location_info := LocationInfo file_0 280 153 280 193. - Definition loc_464 : location_info := LocationInfo file_0 280 154 280 158. - Definition loc_465 : location_info := LocationInfo file_0 280 155 280 158. - Definition loc_466 : location_info := LocationInfo file_0 280 162 280 192. - Definition loc_467 : location_info := LocationInfo file_0 280 163 280 185. - Definition loc_468 : location_info := LocationInfo file_0 280 163 280 181. - Definition loc_469 : location_info := LocationInfo file_0 280 164 280 176. - Definition loc_470 : location_info := LocationInfo file_0 280 179 280 180. - Definition loc_471 : location_info := LocationInfo file_0 280 184 280 185. - Definition loc_472 : location_info := LocationInfo file_0 280 188 280 191. - Definition loc_473 : location_info := LocationInfo file_0 272 35 277 5. - Definition loc_474 : location_info := LocationInfo file_0 273 8 274 23. - Definition loc_475 : location_info := LocationInfo file_0 275 8 276 23. - Definition loc_476 : location_info := LocationInfo file_0 276 12 276 23. - Definition loc_477 : location_info := LocationInfo file_0 276 19 276 22. - Definition loc_478 : location_info := LocationInfo file_0 276 20 276 22. - Definition loc_480 : location_info := LocationInfo file_0 275 12 275 18. - Definition loc_481 : location_info := LocationInfo file_0 275 12 275 18. - Definition loc_482 : location_info := LocationInfo file_0 274 12 274 23. - Definition loc_483 : location_info := LocationInfo file_0 274 19 274 22. - Definition loc_484 : location_info := LocationInfo file_0 274 20 274 22. - Definition loc_486 : location_info := LocationInfo file_0 273 12 273 37. - Definition loc_487 : location_info := LocationInfo file_0 273 12 273 16. - Definition loc_488 : location_info := LocationInfo file_0 273 12 273 16. - Definition loc_489 : location_info := LocationInfo file_0 273 19 273 37. - Definition loc_490 : location_info := LocationInfo file_0 277 11 279 5. - Definition loc_491 : location_info := LocationInfo file_0 278 8 278 30. - Definition loc_492 : location_info := LocationInfo file_0 278 8 278 12. - Definition loc_493 : location_info := LocationInfo file_0 278 8 278 29. - Definition loc_494 : location_info := LocationInfo file_0 278 8 278 12. - Definition loc_495 : location_info := LocationInfo file_0 278 8 278 12. - Definition loc_496 : location_info := LocationInfo file_0 278 16 278 29. - Definition loc_497 : location_info := LocationInfo file_0 278 17 278 20. - Definition loc_498 : location_info := LocationInfo file_0 278 24 278 28. - Definition loc_499 : location_info := LocationInfo file_0 272 8 272 33. - Definition loc_500 : location_info := LocationInfo file_0 272 8 272 12. - Definition loc_501 : location_info := LocationInfo file_0 272 8 272 12. - Definition loc_502 : location_info := LocationInfo file_0 272 15 272 33. - Definition loc_503 : location_info := LocationInfo file_0 271 8 271 19. - Definition loc_504 : location_info := LocationInfo file_0 271 15 271 18. - Definition loc_505 : location_info := LocationInfo file_0 271 16 271 18. - Definition loc_507 : location_info := LocationInfo file_0 270 8 270 36. - Definition loc_509 : location_info := LocationInfo file_0 270 9 270 36. - Definition loc_510 : location_info := LocationInfo file_0 270 10 270 14. - Definition loc_511 : location_info := LocationInfo file_0 270 10 270 14. - Definition loc_512 : location_info := LocationInfo file_0 270 17 270 35. - Definition loc_513 : location_info := LocationInfo file_0 268 13 269 28. - Definition loc_514 : location_info := LocationInfo file_0 268 13 268 40. - Definition loc_515 : location_info := LocationInfo file_0 268 14 268 18. - Definition loc_516 : location_info := LocationInfo file_0 268 14 268 18. - Definition loc_517 : location_info := LocationInfo file_0 268 21 268 39. - Definition loc_518 : location_info := LocationInfo file_0 268 43 268 44. - Definition loc_519 : location_info := LocationInfo file_0 269 27 269 28. - Definition loc_522 : location_info := LocationInfo file_0 267 13 267 14. - Definition loc_525 : location_info := LocationInfo file_0 266 21 266 208. - Definition loc_526 : location_info := LocationInfo file_0 266 22 266 130. - Definition loc_527 : location_info := LocationInfo file_0 266 23 266 30. - Definition loc_528 : location_info := LocationInfo file_0 266 23 266 30. - Definition loc_529 : location_info := LocationInfo file_0 266 34 266 129. - Definition loc_530 : location_info := LocationInfo file_0 266 35 266 124. - Definition loc_531 : location_info := LocationInfo file_0 266 35 266 50. - Definition loc_532 : location_info := LocationInfo file_0 266 35 266 50. - Definition loc_533 : location_info := LocationInfo file_0 266 51 266 123. - Definition loc_534 : location_info := LocationInfo file_0 266 52 266 79. - Definition loc_535 : location_info := LocationInfo file_0 266 53 266 74. - Definition loc_536 : location_info := LocationInfo file_0 266 53 266 59. - Definition loc_537 : location_info := LocationInfo file_0 266 55 266 58. - Definition loc_538 : location_info := LocationInfo file_0 266 62 266 74. - Definition loc_539 : location_info := LocationInfo file_0 266 63 266 66. - Definition loc_540 : location_info := LocationInfo file_0 266 70 266 73. - Definition loc_541 : location_info := LocationInfo file_0 266 77 266 78. - Definition loc_542 : location_info := LocationInfo file_0 266 82 266 122. - Definition loc_543 : location_info := LocationInfo file_0 266 83 266 87. - Definition loc_544 : location_info := LocationInfo file_0 266 84 266 87. - Definition loc_545 : location_info := LocationInfo file_0 266 91 266 121. - Definition loc_546 : location_info := LocationInfo file_0 266 92 266 114. - Definition loc_547 : location_info := LocationInfo file_0 266 92 266 110. - Definition loc_548 : location_info := LocationInfo file_0 266 93 266 105. - Definition loc_549 : location_info := LocationInfo file_0 266 108 266 109. - Definition loc_550 : location_info := LocationInfo file_0 266 113 266 114. - Definition loc_551 : location_info := LocationInfo file_0 266 117 266 120. - Definition loc_552 : location_info := LocationInfo file_0 266 127 266 128. - Definition loc_553 : location_info := LocationInfo file_0 266 133 266 207. - Definition loc_554 : location_info := LocationInfo file_0 266 135 266 162. - Definition loc_555 : location_info := LocationInfo file_0 266 136 266 157. - Definition loc_556 : location_info := LocationInfo file_0 266 136 266 142. - Definition loc_557 : location_info := LocationInfo file_0 266 138 266 141. - Definition loc_558 : location_info := LocationInfo file_0 266 145 266 157. - Definition loc_559 : location_info := LocationInfo file_0 266 146 266 149. - Definition loc_560 : location_info := LocationInfo file_0 266 153 266 156. - Definition loc_561 : location_info := LocationInfo file_0 266 160 266 161. - Definition loc_562 : location_info := LocationInfo file_0 266 165 266 205. - Definition loc_563 : location_info := LocationInfo file_0 266 166 266 170. - Definition loc_564 : location_info := LocationInfo file_0 266 167 266 170. - Definition loc_565 : location_info := LocationInfo file_0 266 174 266 204. - Definition loc_566 : location_info := LocationInfo file_0 266 175 266 197. - Definition loc_567 : location_info := LocationInfo file_0 266 175 266 193. - Definition loc_568 : location_info := LocationInfo file_0 266 176 266 188. - Definition loc_569 : location_info := LocationInfo file_0 266 191 266 192. - Definition loc_570 : location_info := LocationInfo file_0 266 196 266 197. - Definition loc_571 : location_info := LocationInfo file_0 266 200 266 203. - Definition loc_574 : location_info := LocationInfo file_0 265 16 265 30. - Definition loc_575 : location_info := LocationInfo file_0 265 16 265 22. - Definition loc_576 : location_info := LocationInfo file_0 265 16 265 22. - Definition loc_577 : location_info := LocationInfo file_0 265 25 265 26. - Definition loc_578 : location_info := LocationInfo file_0 265 29 265 30. - Definition loc_581 : location_info := LocationInfo file_0 264 19 264 49. - Definition loc_582 : location_info := LocationInfo file_0 264 19 264 23. - Definition loc_583 : location_info := LocationInfo file_0 264 19 264 23. - Definition loc_584 : location_info := LocationInfo file_0 264 26 264 49. + Definition loc_161 : location_info := LocationInfo file_0 219 4 219 79. + Definition loc_162 : location_info := LocationInfo file_0 220 4 220 75. + Definition loc_163 : location_info := LocationInfo file_0 221 4 221 24. + Definition loc_164 : location_info := LocationInfo file_0 222 4 222 33. + Definition loc_165 : location_info := LocationInfo file_0 224 1 224 13. + Definition loc_166 : location_info := LocationInfo file_0 224 1 224 6. + Definition loc_167 : location_info := LocationInfo file_0 224 2 224 6. + Definition loc_168 : location_info := LocationInfo file_0 224 2 224 6. + Definition loc_169 : location_info := LocationInfo file_0 224 9 224 12. + Definition loc_170 : location_info := LocationInfo file_0 224 9 224 12. + Definition loc_171 : location_info := LocationInfo file_0 222 12 222 30. + Definition loc_172 : location_info := LocationInfo file_0 222 12 222 25. + Definition loc_173 : location_info := LocationInfo file_0 222 12 222 25. + Definition loc_174 : location_info := LocationInfo file_0 222 26 222 29. + Definition loc_175 : location_info := LocationInfo file_0 222 26 222 29. + Definition loc_176 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_177 : location_info := LocationInfo file_0 221 4 221 23. + Definition loc_178 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_179 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_180 : location_info := LocationInfo file_0 221 11 221 23. + Definition loc_181 : location_info := LocationInfo file_0 221 12 221 15. + Definition loc_182 : location_info := LocationInfo file_0 221 19 221 22. + Definition loc_183 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_184 : location_info := LocationInfo file_0 220 4 220 74. + Definition loc_185 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_186 : location_info := LocationInfo file_0 220 4 220 7. + Definition loc_187 : location_info := LocationInfo file_0 220 11 220 74. + Definition loc_188 : location_info := LocationInfo file_0 220 12 220 56. + Definition loc_189 : location_info := LocationInfo file_0 220 13 220 16. + Definition loc_190 : location_info := LocationInfo file_0 220 20 220 55. + Definition loc_191 : location_info := LocationInfo file_0 220 21 220 50. + Definition loc_192 : location_info := LocationInfo file_0 220 21 220 36. + Definition loc_193 : location_info := LocationInfo file_0 220 21 220 36. + Definition loc_194 : location_info := LocationInfo file_0 220 37 220 49. + Definition loc_195 : location_info := LocationInfo file_0 220 38 220 41. + Definition loc_196 : location_info := LocationInfo file_0 220 45 220 48. + Definition loc_197 : location_info := LocationInfo file_0 220 53 220 54. + Definition loc_198 : location_info := LocationInfo file_0 220 59 220 73. + Definition loc_199 : location_info := LocationInfo file_0 220 61 220 64. + Definition loc_200 : location_info := LocationInfo file_0 220 68 220 71. + Definition loc_201 : location_info := LocationInfo file_0 219 33 219 78. + Definition loc_202 : location_info := LocationInfo file_0 219 33 219 48. + Definition loc_203 : location_info := LocationInfo file_0 219 33 219 48. + Definition loc_204 : location_info := LocationInfo file_0 219 49 219 77. + Definition loc_205 : location_info := LocationInfo file_0 219 49 219 69. + Definition loc_206 : location_info := LocationInfo file_0 219 49 219 69. + Definition loc_207 : location_info := LocationInfo file_0 219 49 219 69. + Definition loc_208 : location_info := LocationInfo file_0 219 49 219 55. + Definition loc_209 : location_info := LocationInfo file_0 219 49 219 55. + Definition loc_210 : location_info := LocationInfo file_0 219 70 219 76. + Definition loc_211 : location_info := LocationInfo file_0 219 70 219 76. + Definition loc_214 : location_info := LocationInfo file_0 219 20 219 25. + Definition loc_215 : location_info := LocationInfo file_0 219 20 219 25. + Definition loc_216 : location_info := LocationInfo file_0 219 21 219 25. + Definition loc_217 : location_info := LocationInfo file_0 219 21 219 25. + Definition loc_222 : location_info := LocationInfo file_0 239 4 239 53. + Definition loc_223 : location_info := LocationInfo file_0 240 4 241 33. + Definition loc_224 : location_info := LocationInfo file_0 242 4 242 171. + Definition loc_225 : location_info := LocationInfo file_0 243 4 243 78. + Definition loc_226 : location_info := LocationInfo file_0 244 4 244 24. + Definition loc_227 : location_info := LocationInfo file_0 246 4 247 26. + Definition loc_228 : location_info := LocationInfo file_0 249 1 249 13. + Definition loc_229 : location_info := LocationInfo file_0 250 4 250 13. + Definition loc_230 : location_info := LocationInfo file_0 250 11 250 12. + Definition loc_231 : location_info := LocationInfo file_0 249 1 249 6. + Definition loc_232 : location_info := LocationInfo file_0 249 2 249 6. + Definition loc_233 : location_info := LocationInfo file_0 249 2 249 6. + Definition loc_234 : location_info := LocationInfo file_0 249 9 249 12. + Definition loc_235 : location_info := LocationInfo file_0 249 9 249 12. + Definition loc_236 : location_info := LocationInfo file_0 247 8 247 26. + Definition loc_237 : location_info := LocationInfo file_0 247 15 247 25. + Definition loc_238 : location_info := LocationInfo file_0 247 15 247 18. + Definition loc_239 : location_info := LocationInfo file_0 247 15 247 18. + Definition loc_240 : location_info := LocationInfo file_0 247 22 247 25. + Definition loc_241 : location_info := LocationInfo file_0 247 22 247 25. + Definition loc_243 : location_info := LocationInfo file_0 246 8 246 26. + Definition loc_244 : location_info := LocationInfo file_0 246 8 246 21. + Definition loc_245 : location_info := LocationInfo file_0 246 8 246 21. + Definition loc_246 : location_info := LocationInfo file_0 246 22 246 25. + Definition loc_247 : location_info := LocationInfo file_0 246 22 246 25. + Definition loc_248 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_249 : location_info := LocationInfo file_0 244 4 244 23. + Definition loc_250 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_251 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_252 : location_info := LocationInfo file_0 244 11 244 23. + Definition loc_253 : location_info := LocationInfo file_0 244 12 244 15. + Definition loc_254 : location_info := LocationInfo file_0 244 19 244 22. + Definition loc_255 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_256 : location_info := LocationInfo file_0 243 4 243 77. + Definition loc_257 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_258 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_259 : location_info := LocationInfo file_0 243 11 243 77. + Definition loc_260 : location_info := LocationInfo file_0 243 12 243 59. + Definition loc_261 : location_info := LocationInfo file_0 243 13 243 19. + Definition loc_262 : location_info := LocationInfo file_0 243 13 243 19. + Definition loc_263 : location_info := LocationInfo file_0 243 23 243 58. + Definition loc_264 : location_info := LocationInfo file_0 243 24 243 53. + Definition loc_265 : location_info := LocationInfo file_0 243 24 243 39. + Definition loc_266 : location_info := LocationInfo file_0 243 24 243 39. + Definition loc_267 : location_info := LocationInfo file_0 243 40 243 52. + Definition loc_268 : location_info := LocationInfo file_0 243 41 243 44. + Definition loc_269 : location_info := LocationInfo file_0 243 48 243 51. + Definition loc_270 : location_info := LocationInfo file_0 243 56 243 57. + Definition loc_271 : location_info := LocationInfo file_0 243 62 243 76. + Definition loc_272 : location_info := LocationInfo file_0 243 64 243 67. + Definition loc_273 : location_info := LocationInfo file_0 243 71 243 74. + Definition loc_274 : location_info := LocationInfo file_0 242 4 242 7. + Definition loc_275 : location_info := LocationInfo file_0 242 4 242 170. + Definition loc_276 : location_info := LocationInfo file_0 242 4 242 7. + Definition loc_277 : location_info := LocationInfo file_0 242 4 242 7. + Definition loc_278 : location_info := LocationInfo file_0 242 11 242 170. + Definition loc_279 : location_info := LocationInfo file_0 242 11 242 15. + Definition loc_280 : location_info := LocationInfo file_0 242 11 242 15. + Definition loc_281 : location_info := LocationInfo file_0 242 18 242 170. + Definition loc_282 : location_info := LocationInfo file_0 242 19 242 92. + Definition loc_283 : location_info := LocationInfo file_0 242 20 242 47. + Definition loc_284 : location_info := LocationInfo file_0 242 21 242 42. + Definition loc_285 : location_info := LocationInfo file_0 242 21 242 27. + Definition loc_286 : location_info := LocationInfo file_0 242 23 242 26. + Definition loc_287 : location_info := LocationInfo file_0 242 30 242 42. + Definition loc_288 : location_info := LocationInfo file_0 242 31 242 34. + Definition loc_289 : location_info := LocationInfo file_0 242 38 242 41. + Definition loc_290 : location_info := LocationInfo file_0 242 45 242 46. + Definition loc_291 : location_info := LocationInfo file_0 242 50 242 91. + Definition loc_292 : location_info := LocationInfo file_0 242 51 242 55. + Definition loc_293 : location_info := LocationInfo file_0 242 52 242 55. + Definition loc_294 : location_info := LocationInfo file_0 242 59 242 90. + Definition loc_295 : location_info := LocationInfo file_0 242 60 242 82. + Definition loc_296 : location_info := LocationInfo file_0 242 60 242 78. + Definition loc_297 : location_info := LocationInfo file_0 242 61 242 73. + Definition loc_298 : location_info := LocationInfo file_0 242 76 242 77. + Definition loc_299 : location_info := LocationInfo file_0 242 81 242 82. + Definition loc_300 : location_info := LocationInfo file_0 242 85 242 89. + Definition loc_301 : location_info := LocationInfo file_0 242 95 242 169. + Definition loc_302 : location_info := LocationInfo file_0 242 96 242 124. + Definition loc_303 : location_info := LocationInfo file_0 242 97 242 119. + Definition loc_304 : location_info := LocationInfo file_0 242 97 242 103. + Definition loc_305 : location_info := LocationInfo file_0 242 99 242 102. + Definition loc_306 : location_info := LocationInfo file_0 242 106 242 119. + Definition loc_307 : location_info := LocationInfo file_0 242 107 242 110. + Definition loc_308 : location_info := LocationInfo file_0 242 114 242 118. + Definition loc_309 : location_info := LocationInfo file_0 242 122 242 123. + Definition loc_310 : location_info := LocationInfo file_0 242 127 242 168. + Definition loc_311 : location_info := LocationInfo file_0 242 128 242 132. + Definition loc_312 : location_info := LocationInfo file_0 242 129 242 132. + Definition loc_313 : location_info := LocationInfo file_0 242 136 242 167. + Definition loc_314 : location_info := LocationInfo file_0 242 137 242 159. + Definition loc_315 : location_info := LocationInfo file_0 242 137 242 155. + Definition loc_316 : location_info := LocationInfo file_0 242 138 242 150. + Definition loc_317 : location_info := LocationInfo file_0 242 153 242 154. + Definition loc_318 : location_info := LocationInfo file_0 242 158 242 159. + Definition loc_319 : location_info := LocationInfo file_0 242 162 242 166. + Definition loc_320 : location_info := LocationInfo file_0 240 15 241 32. + Definition loc_321 : location_info := LocationInfo file_0 240 15 240 32. + Definition loc_322 : location_info := LocationInfo file_0 240 16 240 21. + Definition loc_323 : location_info := LocationInfo file_0 240 16 240 21. + Definition loc_324 : location_info := LocationInfo file_0 240 25 240 31. + Definition loc_325 : location_info := LocationInfo file_0 240 25 240 27. + Definition loc_326 : location_info := LocationInfo file_0 240 30 240 31. + Definition loc_327 : location_info := LocationInfo file_0 240 35 240 36. + Definition loc_328 : location_info := LocationInfo file_0 241 31 241 32. + Definition loc_331 : location_info := LocationInfo file_0 239 33 239 52. + Definition loc_332 : location_info := LocationInfo file_0 239 33 239 48. + Definition loc_333 : location_info := LocationInfo file_0 239 33 239 48. + Definition loc_334 : location_info := LocationInfo file_0 239 49 239 51. + Definition loc_335 : location_info := LocationInfo file_0 239 49 239 51. + Definition loc_338 : location_info := LocationInfo file_0 239 20 239 25. + Definition loc_339 : location_info := LocationInfo file_0 239 20 239 25. + Definition loc_340 : location_info := LocationInfo file_0 239 21 239 25. + Definition loc_341 : location_info := LocationInfo file_0 239 21 239 25. + Definition loc_346 : location_info := LocationInfo file_0 262 4 262 50. + Definition loc_347 : location_info := LocationInfo file_0 263 4 263 31. + Definition loc_348 : location_info := LocationInfo file_0 264 4 264 209. + Definition loc_349 : location_info := LocationInfo file_0 265 4 265 15. + Definition loc_350 : location_info := LocationInfo file_0 266 4 267 29. + Definition loc_351 : location_info := LocationInfo file_0 268 4 269 19. + Definition loc_352 : location_info := LocationInfo file_0 270 4 277 5. + Definition loc_353 : location_info := LocationInfo file_0 278 4 278 197. + Definition loc_354 : location_info := LocationInfo file_0 279 4 279 197. + Definition loc_355 : location_info := LocationInfo file_0 280 4 280 26. + Definition loc_356 : location_info := LocationInfo file_0 281 4 281 22. + Definition loc_357 : location_info := LocationInfo file_0 282 4 282 13. + Definition loc_358 : location_info := LocationInfo file_0 282 11 282 12. + Definition loc_359 : location_info := LocationInfo file_0 281 4 281 14. + Definition loc_360 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_361 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_362 : location_info := LocationInfo file_0 281 17 281 21. + Definition loc_363 : location_info := LocationInfo file_0 281 17 281 21. + Definition loc_364 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_365 : location_info := LocationInfo file_0 280 4 280 25. + Definition loc_366 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_367 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_368 : location_info := LocationInfo file_0 280 12 280 25. + Definition loc_369 : location_info := LocationInfo file_0 280 13 280 16. + Definition loc_370 : location_info := LocationInfo file_0 280 20 280 24. + Definition loc_371 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_372 : location_info := LocationInfo file_0 279 4 279 196. + Definition loc_373 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_374 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_375 : location_info := LocationInfo file_0 279 12 279 196. + Definition loc_376 : location_info := LocationInfo file_0 279 13 279 118. + Definition loc_377 : location_info := LocationInfo file_0 279 14 279 18. + Definition loc_378 : location_info := LocationInfo file_0 279 14 279 18. + Definition loc_379 : location_info := LocationInfo file_0 279 22 279 117. + Definition loc_380 : location_info := LocationInfo file_0 279 23 279 112. + Definition loc_381 : location_info := LocationInfo file_0 279 23 279 38. + Definition loc_382 : location_info := LocationInfo file_0 279 23 279 38. + Definition loc_383 : location_info := LocationInfo file_0 279 39 279 111. + Definition loc_384 : location_info := LocationInfo file_0 279 40 279 67. + Definition loc_385 : location_info := LocationInfo file_0 279 41 279 62. + Definition loc_386 : location_info := LocationInfo file_0 279 41 279 47. + Definition loc_387 : location_info := LocationInfo file_0 279 43 279 46. + Definition loc_388 : location_info := LocationInfo file_0 279 50 279 62. + Definition loc_389 : location_info := LocationInfo file_0 279 51 279 54. + Definition loc_390 : location_info := LocationInfo file_0 279 58 279 61. + Definition loc_391 : location_info := LocationInfo file_0 279 65 279 66. + Definition loc_392 : location_info := LocationInfo file_0 279 70 279 110. + Definition loc_393 : location_info := LocationInfo file_0 279 71 279 75. + Definition loc_394 : location_info := LocationInfo file_0 279 72 279 75. + Definition loc_395 : location_info := LocationInfo file_0 279 79 279 109. + Definition loc_396 : location_info := LocationInfo file_0 279 80 279 102. + Definition loc_397 : location_info := LocationInfo file_0 279 80 279 98. + Definition loc_398 : location_info := LocationInfo file_0 279 81 279 93. + Definition loc_399 : location_info := LocationInfo file_0 279 96 279 97. + Definition loc_400 : location_info := LocationInfo file_0 279 101 279 102. + Definition loc_401 : location_info := LocationInfo file_0 279 105 279 108. + Definition loc_402 : location_info := LocationInfo file_0 279 115 279 116. + Definition loc_403 : location_info := LocationInfo file_0 279 121 279 195. + Definition loc_404 : location_info := LocationInfo file_0 279 123 279 150. + Definition loc_405 : location_info := LocationInfo file_0 279 124 279 145. + Definition loc_406 : location_info := LocationInfo file_0 279 124 279 130. + Definition loc_407 : location_info := LocationInfo file_0 279 126 279 129. + Definition loc_408 : location_info := LocationInfo file_0 279 133 279 145. + Definition loc_409 : location_info := LocationInfo file_0 279 134 279 137. + Definition loc_410 : location_info := LocationInfo file_0 279 141 279 144. + Definition loc_411 : location_info := LocationInfo file_0 279 148 279 149. + Definition loc_412 : location_info := LocationInfo file_0 279 153 279 193. + Definition loc_413 : location_info := LocationInfo file_0 279 154 279 158. + Definition loc_414 : location_info := LocationInfo file_0 279 155 279 158. + Definition loc_415 : location_info := LocationInfo file_0 279 162 279 192. + Definition loc_416 : location_info := LocationInfo file_0 279 163 279 185. + Definition loc_417 : location_info := LocationInfo file_0 279 163 279 181. + Definition loc_418 : location_info := LocationInfo file_0 279 164 279 176. + Definition loc_419 : location_info := LocationInfo file_0 279 179 279 180. + Definition loc_420 : location_info := LocationInfo file_0 279 184 279 185. + Definition loc_421 : location_info := LocationInfo file_0 279 188 279 191. + Definition loc_422 : location_info := LocationInfo file_0 278 4 278 8. + Definition loc_423 : location_info := LocationInfo file_0 278 4 278 196. + Definition loc_424 : location_info := LocationInfo file_0 278 4 278 8. + Definition loc_425 : location_info := LocationInfo file_0 278 4 278 8. + Definition loc_426 : location_info := LocationInfo file_0 278 12 278 196. + Definition loc_427 : location_info := LocationInfo file_0 278 13 278 118. + Definition loc_428 : location_info := LocationInfo file_0 278 14 278 18. + Definition loc_429 : location_info := LocationInfo file_0 278 14 278 18. + Definition loc_430 : location_info := LocationInfo file_0 278 22 278 117. + Definition loc_431 : location_info := LocationInfo file_0 278 23 278 112. + Definition loc_432 : location_info := LocationInfo file_0 278 23 278 38. + Definition loc_433 : location_info := LocationInfo file_0 278 23 278 38. + Definition loc_434 : location_info := LocationInfo file_0 278 39 278 111. + Definition loc_435 : location_info := LocationInfo file_0 278 40 278 67. + Definition loc_436 : location_info := LocationInfo file_0 278 41 278 62. + Definition loc_437 : location_info := LocationInfo file_0 278 41 278 47. + Definition loc_438 : location_info := LocationInfo file_0 278 43 278 46. + Definition loc_439 : location_info := LocationInfo file_0 278 50 278 62. + Definition loc_440 : location_info := LocationInfo file_0 278 51 278 54. + Definition loc_441 : location_info := LocationInfo file_0 278 58 278 61. + Definition loc_442 : location_info := LocationInfo file_0 278 65 278 66. + Definition loc_443 : location_info := LocationInfo file_0 278 70 278 110. + Definition loc_444 : location_info := LocationInfo file_0 278 71 278 75. + Definition loc_445 : location_info := LocationInfo file_0 278 72 278 75. + Definition loc_446 : location_info := LocationInfo file_0 278 79 278 109. + Definition loc_447 : location_info := LocationInfo file_0 278 80 278 102. + Definition loc_448 : location_info := LocationInfo file_0 278 80 278 98. + Definition loc_449 : location_info := LocationInfo file_0 278 81 278 93. + Definition loc_450 : location_info := LocationInfo file_0 278 96 278 97. + Definition loc_451 : location_info := LocationInfo file_0 278 101 278 102. + Definition loc_452 : location_info := LocationInfo file_0 278 105 278 108. + Definition loc_453 : location_info := LocationInfo file_0 278 115 278 116. + Definition loc_454 : location_info := LocationInfo file_0 278 121 278 195. + Definition loc_455 : location_info := LocationInfo file_0 278 123 278 150. + Definition loc_456 : location_info := LocationInfo file_0 278 124 278 145. + Definition loc_457 : location_info := LocationInfo file_0 278 124 278 130. + Definition loc_458 : location_info := LocationInfo file_0 278 126 278 129. + Definition loc_459 : location_info := LocationInfo file_0 278 133 278 145. + Definition loc_460 : location_info := LocationInfo file_0 278 134 278 137. + Definition loc_461 : location_info := LocationInfo file_0 278 141 278 144. + Definition loc_462 : location_info := LocationInfo file_0 278 148 278 149. + Definition loc_463 : location_info := LocationInfo file_0 278 153 278 193. + Definition loc_464 : location_info := LocationInfo file_0 278 154 278 158. + Definition loc_465 : location_info := LocationInfo file_0 278 155 278 158. + Definition loc_466 : location_info := LocationInfo file_0 278 162 278 192. + Definition loc_467 : location_info := LocationInfo file_0 278 163 278 185. + Definition loc_468 : location_info := LocationInfo file_0 278 163 278 181. + Definition loc_469 : location_info := LocationInfo file_0 278 164 278 176. + Definition loc_470 : location_info := LocationInfo file_0 278 179 278 180. + Definition loc_471 : location_info := LocationInfo file_0 278 184 278 185. + Definition loc_472 : location_info := LocationInfo file_0 278 188 278 191. + Definition loc_473 : location_info := LocationInfo file_0 270 35 275 5. + Definition loc_474 : location_info := LocationInfo file_0 271 8 272 23. + Definition loc_475 : location_info := LocationInfo file_0 273 8 274 23. + Definition loc_476 : location_info := LocationInfo file_0 274 12 274 23. + Definition loc_477 : location_info := LocationInfo file_0 274 19 274 22. + Definition loc_478 : location_info := LocationInfo file_0 274 20 274 22. + Definition loc_480 : location_info := LocationInfo file_0 273 12 273 18. + Definition loc_481 : location_info := LocationInfo file_0 273 12 273 18. + Definition loc_482 : location_info := LocationInfo file_0 272 12 272 23. + Definition loc_483 : location_info := LocationInfo file_0 272 19 272 22. + Definition loc_484 : location_info := LocationInfo file_0 272 20 272 22. + Definition loc_486 : location_info := LocationInfo file_0 271 12 271 37. + Definition loc_487 : location_info := LocationInfo file_0 271 12 271 16. + Definition loc_488 : location_info := LocationInfo file_0 271 12 271 16. + Definition loc_489 : location_info := LocationInfo file_0 271 19 271 37. + Definition loc_490 : location_info := LocationInfo file_0 275 11 277 5. + Definition loc_491 : location_info := LocationInfo file_0 276 8 276 30. + Definition loc_492 : location_info := LocationInfo file_0 276 8 276 12. + Definition loc_493 : location_info := LocationInfo file_0 276 8 276 29. + Definition loc_494 : location_info := LocationInfo file_0 276 8 276 12. + Definition loc_495 : location_info := LocationInfo file_0 276 8 276 12. + Definition loc_496 : location_info := LocationInfo file_0 276 16 276 29. + Definition loc_497 : location_info := LocationInfo file_0 276 17 276 20. + Definition loc_498 : location_info := LocationInfo file_0 276 24 276 28. + Definition loc_499 : location_info := LocationInfo file_0 270 8 270 33. + Definition loc_500 : location_info := LocationInfo file_0 270 8 270 12. + Definition loc_501 : location_info := LocationInfo file_0 270 8 270 12. + Definition loc_502 : location_info := LocationInfo file_0 270 15 270 33. + Definition loc_503 : location_info := LocationInfo file_0 269 8 269 19. + Definition loc_504 : location_info := LocationInfo file_0 269 15 269 18. + Definition loc_505 : location_info := LocationInfo file_0 269 16 269 18. + Definition loc_507 : location_info := LocationInfo file_0 268 8 268 36. + Definition loc_509 : location_info := LocationInfo file_0 268 9 268 36. + Definition loc_510 : location_info := LocationInfo file_0 268 10 268 14. + Definition loc_511 : location_info := LocationInfo file_0 268 10 268 14. + Definition loc_512 : location_info := LocationInfo file_0 268 17 268 35. + Definition loc_513 : location_info := LocationInfo file_0 266 13 267 28. + Definition loc_514 : location_info := LocationInfo file_0 266 13 266 40. + Definition loc_515 : location_info := LocationInfo file_0 266 14 266 18. + Definition loc_516 : location_info := LocationInfo file_0 266 14 266 18. + Definition loc_517 : location_info := LocationInfo file_0 266 21 266 39. + Definition loc_518 : location_info := LocationInfo file_0 266 43 266 44. + Definition loc_519 : location_info := LocationInfo file_0 267 27 267 28. + Definition loc_522 : location_info := LocationInfo file_0 265 13 265 14. + Definition loc_525 : location_info := LocationInfo file_0 264 21 264 208. + Definition loc_526 : location_info := LocationInfo file_0 264 22 264 130. + Definition loc_527 : location_info := LocationInfo file_0 264 23 264 30. + Definition loc_528 : location_info := LocationInfo file_0 264 23 264 30. + Definition loc_529 : location_info := LocationInfo file_0 264 34 264 129. + Definition loc_530 : location_info := LocationInfo file_0 264 35 264 124. + Definition loc_531 : location_info := LocationInfo file_0 264 35 264 50. + Definition loc_532 : location_info := LocationInfo file_0 264 35 264 50. + Definition loc_533 : location_info := LocationInfo file_0 264 51 264 123. + Definition loc_534 : location_info := LocationInfo file_0 264 52 264 79. + Definition loc_535 : location_info := LocationInfo file_0 264 53 264 74. + Definition loc_536 : location_info := LocationInfo file_0 264 53 264 59. + Definition loc_537 : location_info := LocationInfo file_0 264 55 264 58. + Definition loc_538 : location_info := LocationInfo file_0 264 62 264 74. + Definition loc_539 : location_info := LocationInfo file_0 264 63 264 66. + Definition loc_540 : location_info := LocationInfo file_0 264 70 264 73. + Definition loc_541 : location_info := LocationInfo file_0 264 77 264 78. + Definition loc_542 : location_info := LocationInfo file_0 264 82 264 122. + Definition loc_543 : location_info := LocationInfo file_0 264 83 264 87. + Definition loc_544 : location_info := LocationInfo file_0 264 84 264 87. + Definition loc_545 : location_info := LocationInfo file_0 264 91 264 121. + Definition loc_546 : location_info := LocationInfo file_0 264 92 264 114. + Definition loc_547 : location_info := LocationInfo file_0 264 92 264 110. + Definition loc_548 : location_info := LocationInfo file_0 264 93 264 105. + Definition loc_549 : location_info := LocationInfo file_0 264 108 264 109. + Definition loc_550 : location_info := LocationInfo file_0 264 113 264 114. + Definition loc_551 : location_info := LocationInfo file_0 264 117 264 120. + Definition loc_552 : location_info := LocationInfo file_0 264 127 264 128. + Definition loc_553 : location_info := LocationInfo file_0 264 133 264 207. + Definition loc_554 : location_info := LocationInfo file_0 264 135 264 162. + Definition loc_555 : location_info := LocationInfo file_0 264 136 264 157. + Definition loc_556 : location_info := LocationInfo file_0 264 136 264 142. + Definition loc_557 : location_info := LocationInfo file_0 264 138 264 141. + Definition loc_558 : location_info := LocationInfo file_0 264 145 264 157. + Definition loc_559 : location_info := LocationInfo file_0 264 146 264 149. + Definition loc_560 : location_info := LocationInfo file_0 264 153 264 156. + Definition loc_561 : location_info := LocationInfo file_0 264 160 264 161. + Definition loc_562 : location_info := LocationInfo file_0 264 165 264 205. + Definition loc_563 : location_info := LocationInfo file_0 264 166 264 170. + Definition loc_564 : location_info := LocationInfo file_0 264 167 264 170. + Definition loc_565 : location_info := LocationInfo file_0 264 174 264 204. + Definition loc_566 : location_info := LocationInfo file_0 264 175 264 197. + Definition loc_567 : location_info := LocationInfo file_0 264 175 264 193. + Definition loc_568 : location_info := LocationInfo file_0 264 176 264 188. + Definition loc_569 : location_info := LocationInfo file_0 264 191 264 192. + Definition loc_570 : location_info := LocationInfo file_0 264 196 264 197. + Definition loc_571 : location_info := LocationInfo file_0 264 200 264 203. + Definition loc_574 : location_info := LocationInfo file_0 263 16 263 30. + Definition loc_575 : location_info := LocationInfo file_0 263 16 263 22. + Definition loc_576 : location_info := LocationInfo file_0 263 16 263 22. + Definition loc_577 : location_info := LocationInfo file_0 263 25 263 26. + Definition loc_578 : location_info := LocationInfo file_0 263 29 263 30. + Definition loc_581 : location_info := LocationInfo file_0 262 19 262 49. + Definition loc_582 : location_info := LocationInfo file_0 262 19 262 23. + Definition loc_583 : location_info := LocationInfo file_0 262 19 262 23. + Definition loc_584 : location_info := LocationInfo file_0 262 26 262 49. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| sl_members := [ - (Some "zalloc_page", void*); - (Some "zalloc_pages_exact", void*); - (Some "free_pages_exact", void*); - (Some "get_page", void*); - (Some "put_page", void*); - (Some "page_count", void*); - (Some "phys_to_virt", void*); (Some "virt_to_phys", void*) ]; |}. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v index 7afb1f35..2cdc798b 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v @@ -1 +1 @@ -(* You were too lazy to even write a spec for this function. *) +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v index 7afb1f35..2cdc798b 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v @@ -1 +1 @@ -(* You were too lazy to even write a spec for this function. *) +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 87435c28..6e6250f7 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -7,6 +7,51 @@ Set Default Proof Using "Type". Section spec. Context `{!typeG Σ} `{!globalG Σ}. + (* Definition of type [kvm_pgtable_mm_ops]. *) + Definition kvm_pgtable_mm_ops_rec : (mm_ops -d> typeO) → (mm_ops -d> typeO) := (λ self ops, + struct struct_kvm_pgtable_mm_ops [@{type} + (function_ptr (fn(∀ (p, a) : loc * Z; p @ &own (a @ int u64); True) → ∃ () : (), (ops.(virt_to_phys) a) @ int u64; True)) + ] + )%I. + Typeclasses Opaque kvm_pgtable_mm_ops_rec. + + Global Instance kvm_pgtable_mm_ops_rec_ne : Contractive kvm_pgtable_mm_ops_rec. + Proof. solve_type_proper. Qed. + + Definition kvm_pgtable_mm_ops : rtype := {| + rty_type := mm_ops; + rty r__ := fixp kvm_pgtable_mm_ops_rec r__ + |}. + + Lemma kvm_pgtable_mm_ops_unfold (ops : mm_ops): + (ops @ kvm_pgtable_mm_ops)%I ≡@{type} ( + struct struct_kvm_pgtable_mm_ops [@{type} + (function_ptr (fn(∀ (p, a) : loc * Z; p @ &own (a @ int u64); True) → ∃ () : (), (ops.(virt_to_phys) a) @ int u64; True)) + ] + )%I. + Proof. by rewrite {1}/with_refinement/=fixp_unfold. Qed. + + + Global Program Instance kvm_pgtable_mm_ops_rmovable : RMovable kvm_pgtable_mm_ops := + {| rmovable patt__ := movable_eq _ _ (kvm_pgtable_mm_ops_unfold patt__) |}. + Next Obligation. solve_ty_layout_eq. Qed. + + Global Instance kvm_pgtable_mm_ops_simplify_hyp_place_inst_generated l_ β_ patt__: + SimplifyHypPlace l_ β_ (patt__ @ kvm_pgtable_mm_ops)%I (Some 100%N) := + λ T, i2p (simplify_hyp_place_eq l_ β_ _ _ T (kvm_pgtable_mm_ops_unfold _)). + Global Instance kvm_pgtable_mm_ops_simplify_goal_place_inst_generated l_ β_ patt__: + SimplifyGoalPlace l_ β_ (patt__ @ kvm_pgtable_mm_ops)%I (Some 100%N) := + λ T, i2p (simplify_goal_place_eq l_ β_ _ _ T (kvm_pgtable_mm_ops_unfold _)). + + Global Program Instance kvm_pgtable_mm_ops_simplify_hyp_val_inst_generated v_ patt__: + SimplifyHypVal v_ (patt__ @ kvm_pgtable_mm_ops)%I (Some 100%N) := + λ T, i2p (simplify_hyp_val_eq v_ _ _ (kvm_pgtable_mm_ops_unfold _) T _). + Next Obligation. done. Qed. + Global Program Instance kvm_pgtable_mm_ops_simplify_goal_val_inst_generated v_ patt__: + SimplifyGoalVal v_ (patt__ @ kvm_pgtable_mm_ops)%I (Some 100%N) := + λ T, i2p (simplify_goal_val_eq v_ _ _ (kvm_pgtable_mm_ops_unfold _) T _). + Next Obligation. done. Qed. + (* Type definitions. *) (* Specifications for function [__builtin_ffsll]. *) @@ -17,26 +62,34 @@ Section spec. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := fn(∀ pte : (bvec Pte); (pte @ (bitvec (Pte))); True) - → ∃ () : (), ((pte.[valid]) @ (boolean (bool_it))); True. + → ∃ () : (), ((pte[valid]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : (bvec Pte) * Z; (pte @ (bitvec (Pte))), (level @ (int (u32))); True) - → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && bool_decide (pte.[page_or_table])) @ (boolean (bool_it))); True. + → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte[valid] && pte[page_or_table]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := fn(∀ (pte, p) : (bvec Pte) * loc; (p @ (&own (pte @ (bitvec (Pte))))); True) - → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (bitvec (Pte)))). + → ∃ () : (), (void); (p ◁ₗ ((pte[valid := false]) @ (bitvec (Pte)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ () : (), (((empty_bvec Pte).[addr := (as_bvec Pte pa).[addr]]) @ (bitvec (Pte))); True. + → ∃ () : (), ((0%%Pte[addr := pa%%Pte[addr]]) @ (bitvec (Pte))); True. - (* Function [kvm_set_table_pte] has been skipped. *) + (* Specifications for function [kvm_set_table_pte]. *) + Definition type_of_kvm_set_table_pte := + fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * (bvec Pte) * Z * mm_ops; (p @ (&own (pte @ (bitvec (Pte))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte[valid] = true⌝) + → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte[addr := pa%%Pte[addr]; page_or_table := true; valid := true]) @ (bitvec (Pte)))). - (* Function [kvm_set_valid_leaf_pte] has been skipped. *) + (* Specifications for function [kvm_set_valid_leaf_pte]. *) + Definition type_of_kvm_set_valid_leaf_pte := + fn(∀ (p, pte, pa, attr, level) : loc * (bvec Pte) * Z * (bvec Pte) * Z; (p @ (&own (pte @ (bitvec (Pte))))), (pa @ (int (u64))), (attr @ (bitvec (Pte))), (level @ (int (u32))); True) + → ∃ (is_page, pte1) : bool * (bvec Pte), ((if pte[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte[addr := pa%%Pte[addr]; leaf_attr_lo := attr[leaf_attr_lo]; leaf_attr_hi := attr[leaf_attr_hi]][page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte[valid] then pte else pte1) @ (bitvec (Pte)))). (* Function [hyp_map_set_prot_attr] has been skipped. *) End spec. + +Typeclasses Opaque kvm_pgtable_mm_ops_rec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 60d3b2f5..ce0fee92 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -1,15 +1,8 @@ From refinedc.typing Require Import typing. -(* Record mm_ops := { - zalloc_page : ∀ A, A → unit; - zalloc_pages_exact : Z → unit; - free_pages_exact : Z → Z → unit; - get_page : Z -> unit; - put_page : Z -> unit; - page_count : Z -> Z; - phys_to_virt : Z → Z; +Record mm_ops := { virt_to_phys : Z → Z; -}. *) +}. Definition KVM_PGTABLE_MAX_LEVELS := 4. @@ -17,8 +10,8 @@ Definition KVM_PGTABLE_MAX_LEVELS := 4. Definition Pte : bitvec_type := {| bt_byte_size_log := 3; (* 2^3 * 8 = 64 *) - bt_fields := 6; bt_spec := [# bool_field; bool_field; data_field 10; data_field 36; undef_field 3; data_field 13]; + bt_length_eq := ltac:(done); |}. (* interesting fields *) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 98874fa4..f1ebf74f 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -4,6 +4,8 @@ Set Default Proof Using "Type". (** Representation of a bit vector type (specification of fields). *) +(* TODO: only keep user-needed definitions in this file? *) + Record field_desc := FieldDesc { fd_len : nat; @@ -31,12 +33,33 @@ Next Obligation. done. Qed. Program Definition undef_field := data_field. +Fixpoint length_fields (l : list field_desc) : nat := + match l with + | [] => 0 + | x :: xs => fd_len x + length_fields xs + end. + +Lemma length_fields_take l i fd : + l !! i = Some fd → + length_fields (take i l) + fd_len fd ≤ length_fields l. +Proof. + move: i. + induction l as [|x l IH]; first done. + destruct i; move => ?. + - have -> : x = fd by naive_solver. + simpl. lia. + - have Hl : l !! i = Some fd by naive_solver. + have := IH i Hl. + simpl. lia. +Qed. + Record bitvec_type := BitvecType { bt_byte_size_log : nat; + bt_length : nat := 8 * 2 ^ bt_byte_size_log; bt_fields : nat; bt_spec : vec field_desc bt_fields; - (* TODO: total length of `bt_spec` = 8 * `bt_bytes` *) + bt_length_eq : bt_length = length_fields bt_spec; }. Definition bt_layout (bt : bitvec_type) : layout := {| @@ -44,76 +67,129 @@ Definition bt_layout (bt : bitvec_type) : layout := {| ly_align_log := bt_byte_size_log bt; |}. -Definition bvec (bt : bitvec_type) : Type := - ∀ i, vec bool (fd_len (bt_spec bt !!! i)). +Definition bvec (bt : bitvec_type) : Type := vec bool (bt_length bt). + +(* TODO: vec version may simplify vslice, vinsert *) +Fixpoint indices (n : nat) : list nat := + match n with + | O => [] + | S n' => indices n' ++ [n'] + end. + +Definition Z_of_bool_vec {n} (v : vec bool n) : Z := + list_sum (zip_with (λ i (b : bool), (if b then 2 ^ i else 0)%nat) (indices n) v). + +Lemma Z_of_bool_vec_in_range {n} (v : vec bool n) : + -1 < Z_of_bool_vec v < 2 ^ n. +Admitted. -Definition bvec_to_list_go {bt : bitvec_type} (bv : bvec bt) (n : nat) : - (n ≤ bt_fields bt)%nat → list bool. +Fixpoint val_of_bool_vec {sz} (v : vec bool (8 * sz)) : val. Proof. - move => ?. induction n as [|n IHn]. + destruct sz as [|sz]. - refine []. - - have Hlt : (n < bt_fields bt)%nat by lia. - have Hle : (n ≤ bt_fields bt)%nat by lia. - refine (IHn Hle ++ vec_to_list (bv (nat_to_fin Hlt))). -Defined. + - have H8 : (8 < 8 * S sz)%nat. admit. + (* Wrong. 8 ≤ 8 * S sz. So we need a `vtake` that can take all elements. *) + (* have n := Z_of_bool_vec (vtake (nat_to_fin H8) v). *) + have Hn := Z_of_bool_vec_in_range (vtake (nat_to_fin H8) v). + have H256 : 2 ^ (nat_to_fin H8) = 256. admit. + rewrite H256 in Hn. + have v2 := vdrop (nat_to_fin H8) v. + have Heq : (8 * S sz - nat_to_fin H8 = 8 * sz)%nat. admit. + rewrite Heq in v2. + refine (MByte {| + byte_val := Z_of_bool_vec (vtake (nat_to_fin H8) v); + byte_constr := Hn; + |} :: val_of_bool_vec sz v2). +Admitted. -Definition bvec_to_list {bt : bitvec_type} (bv : bvec bt) : list bool := - bvec_to_list_go bv (bt_fields bt) (Nat.le_refl _). +Lemma val_of_bool_vec_length {sz} (v : vec bool (8 * sz)) : + length (val_of_bool_vec v) = sz. +Admitted. -Fixpoint extract_bits (start len : nat) (data : Z) : vec bool len := +Fixpoint Z_slice (i len : nat) (n : Z) : vec bool len := match len with | O => [#] - | S k => Z.testbit data start ::: extract_bits (S start) k data + | S k => Z.testbit n i ::: Z_slice (S i) k n end. -Definition as_bvec (bt : bitvec_type) (data : Z) : bvec bt := - let offset i := foldr (λ fd acc, (fd_len fd + acc)%nat) 0%nat $ - vec_to_list $ vtake i (bt_spec bt) - in λ i, extract_bits (offset i) (fd_len (bt_spec bt !!! i)) data. +Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bvec bt := + Z_slice 0 (bt_length bt) n. +Notation "n %% bt" := (Z_as_bvec bt n) (at level 5, format "n %% bt"). + +Record vec_range (n : nat) (len : nat) := + VecRange { + range_start : nat; + range_in_bound : range_start + len ≤ n; + }. -Definition empty_bvec (bt : bitvec_type) : bvec bt := as_bvec bt 0. +Definition vslice {A n len} (v : vec A n) (r : vec_range n len) : vec A len. +Proof. + destruct r as [i Hin]. + induction len as [|k IHk]. + - refine [#]. + - have Hlt : (i < n)%nat by lia. + refine ((v !!! nat_to_fin Hlt) ::: (IHk ltac:(lia))). +Qed. -Definition val_of_bvec {bt : bitvec_type} (bv : bvec bt) : option val. -Admitted. +Definition vupdate {A n len} (v : vec A n) (u : vec A len) (r : vec_range n len) : vec A n. +Proof. + destruct r as [i Hin]. + induction len as [|k IHk]. + - refine v. + - have Hlt : (i < n)%nat by lia. + refine ( + let u0 := vec_S_inv (λ _, _) (λ x _, x) u in + let u1 := vec_S_inv (λ _, _) (λ _ v, v) u in + vinsert (nat_to_fin Hlt) u0 (IHk u1 ltac:(lia)) + ). +Qed. -Lemma val_of_bvec_length (bt : bitvec_type) (bv : bvec bt) v : - val_of_bvec bv = Some v → length v = (2 ^ bt_byte_size_log bt)%nat. -Admitted. +Program Definition fd_range (bt : bitvec_type) (i : fin (bt_fields bt)) : vec_range (bt_length bt) (fd_len (bt_spec bt !!! i)) := + {| range_start := length_fields (take i (bt_spec bt)) |}. +Next Obligation. + move => ? ?. + rewrite bt_length_eq. + by apply length_fields_take, vlookup_lookup. +Qed. + +(* TODO: maybe not needed? *) +(* Global Instance bvec_eq_dec {bt : bitvec_type} : EqDecision (bvec bt). *) +(* Proof. solve_decision. Qed. *) Definition bvec_get {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) : fd_type (bt_spec bt !!! i) := - fd_decode (bt_spec bt !!! i) (bv i). + fd_decode (bt_spec bt !!! i) (vslice bv (fd_range bt i)). -Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]"). +Notation "bv [ i ]" := (bvec_get bv i) (at level 5, format "bv [ i ]"). -Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt. - (* λ j, if bool_decide (i = j) then (fd_encode (fdv !!! i) x) *) - (* else fv j. *) -Proof. - move => j. - destruct (decide (i = j)) as [<-|]. - - refine (fd_encode (bt_spec bt !!! i) x). - - refine (bv j). -Defined. +Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt := + vupdate bv (fd_encode (bt_spec bt !!! i) x) (fd_range bt i). + +Notation "bv [ i := x ]" := (bvec_put bv i x) + (at level 5, format "bv [ i := x ]"). -Notation "bv .[ i := x ]" := (bvec_put bv i x) (at level 5, format "bv .[ i := x ]"). +Notation "bv [ i1 := x1 ; i2 := x2 ]" := (bvec_put (bvec_put bv i1 x1) i2 x2) + (at level 5, format "bv [ i1 := x1 ; i2 := x2 ]"). -Lemma bvec_get_put {bt : bitvec_type} (bv : bvec bt) i x : - bv.[i := x].[i] = x. +Notation "bv [ i1 := x1 ; i2 := x2 ; i3 := x3 ]" := (bvec_put (bvec_put (bvec_put bv i1 x1) i2 x2) i3 x3) + (at level 5, format "bv [ i1 := x1 ; i2 := x2 ; i3 := x3 ]"). + +(* Lemma bvec_get_put {bt : bitvec_type} (bv : bvec bt) i x : + bv[i := x][i] = x. Proof. by rewrite /bvec_get /bvec_put decide_left encode_decode. Qed. Lemma bvec_get_put_ne {bt : bitvec_type} (bv : bvec bt) i j x : - i ≠ j → bv.[i := x].[j] = bv.[j]. + i ≠ j → bv[i := x][j] = bv[j]. Proof. rewrite /bvec_get /bvec_put. case_match => //. -Qed. +Qed. *) Section bitvec. Context `{!typeG Σ}. Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bvec bt) : type := {| - ty_own β l := (∃ v, ⌜val_of_bvec bv = Some v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I + ty_own β l := (∃ v, ⌜val_of_bool_vec bv = v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I |}. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. @@ -127,12 +203,14 @@ Section bitvec. Global Program Instance rmovable_bitvec bt : RMovable (bitvec bt) := {| rmovable bv := {| ty_layout := bt_layout bt; - ty_own_val v := ⌜val_of_bvec bv = Some v⌝%I; + ty_own_val v := ⌜val_of_bool_vec bv = v⌝%I; |} |}. Next Obligation. iIntros (bt bv l). by iDestruct 1 as (???)"?". Qed. Next Obligation. - by iIntros (bt bv v ?%val_of_bvec_length). Qed. + iIntros (bt bv v <-). iPureIntro. + by rewrite /has_layout_val val_of_bool_vec_length. + Qed. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hl Hv) "Hl". iExists _. by iFrame. -- GitLab From 1877b9bdd02a1b84a57a2494d7d8790cbc42f844 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 22 Mar 2021 16:10:32 +0800 Subject: [PATCH 07/71] simplify bvec ops and proofs --- linux/casestudies/pgtable.c | 21 +- .../proofs/pgtable/generated_code.v | 1080 ++++++++--------- .../proofs/pgtable/generated_spec.v | 18 +- .../proofs/pgtable/pgtable_lemmas.v | 1 + theories/typing/bitvec.v | 300 +++-- 5 files changed, 774 insertions(+), 646 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 318dac0c..ca3b1757 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -1,4 +1,5 @@ //@rc::import pgtable_lemmas from refinedc.linux.casestudies.pgtable +//@rc::inlined Open Scope bitvec_scope. #include #include @@ -161,7 +162,7 @@ struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { [[rc::parameters("pte : {bvec Pte}")]] [[rc::args("pte @ bitvec")]] -[[rc::returns("{pte[valid]} @ boolean")]] +[[rc::returns("{pte.[valid]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { @@ -170,7 +171,7 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : {bvec Pte}", "level : Z")]] [[rc::args("pte @ bitvec", "level @ int")]] -[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte[valid] && pte[page_or_table]} @ boolean")]] +[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -183,7 +184,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : {bvec Pte}", "p : loc")]] [[rc::args("p @ &own>")]] -[[rc::ensures("own p : {pte[valid := false]} @ bitvec")]] +[[rc::ensures("own p : {pte.[valid := false]} @ bitvec")]] [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -193,7 +194,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] -[[rc::returns("{0%%Pte[addr := pa%%Pte[addr]]} @ bitvec")]] +[[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ bitvec")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { @@ -208,10 +209,10 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) [[rc::parameters("p : loc", "q : loc", "o : loc", "pte : {bvec Pte}", "va : Z", "ops : mm_ops")]] [[rc::args("p @ &own>", "q @ &own>", "o @ &own")]] -[[rc::requires("{pte[valid] = true}")]] +[[rc::requires("{pte.[valid] = true}")]] [[rc::exists("pa : Z")]] [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] -[[rc::ensures("own p : {0%%Pte[addr := pa%%Pte[addr]; page_or_table := true; valid := true]} @ bitvec")]] +[[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]} @ bitvec")]] [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) @@ -228,10 +229,10 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, [[rc::args("p @ &own>", "pa @ int", "attr @ bitvec", "level @ int")]] [[rc::exists("is_page : bool")]] [[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] -[[rc::exists("pte1 : {bvec Pte}")]] // TODO : `pte'` not parsed -[[rc::ensures("{pte1 = 0%%Pte[addr := pa%%Pte[addr]; leaf_attr_lo := attr[leaf_attr_lo]; leaf_attr_hi := attr[leaf_attr_hi]][page_or_table := is_page; valid := true]}")]] -[[rc::ensures("own p : {if pte[valid] then pte else pte1} @ bitvec")]] -[[rc::returns("{if pte[valid] then bool_decide (pte = pte1) else true} @ boolean")]] +[[rc::exists("pte1 : {bvec Pte}")]] +[[rc::ensures("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]}")]] +[[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ bitvec")]] +[[rc::returns("{if pte.[valid] then bool_decide (pte = pte1) else true} @ boolean")]] [[rc::trust_me]] static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, u32 level) diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 6ba7294d..5cfb4440 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,546 +6,546 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 168 4 168 30. - Definition loc_3 : location_info := LocationInfo file_0 168 11 168 29. - Definition loc_4 : location_info := LocationInfo file_0 168 11 168 14. - Definition loc_5 : location_info := LocationInfo file_0 168 11 168 14. - Definition loc_6 : location_info := LocationInfo file_0 168 17 168 29. - Definition loc_7 : location_info := LocationInfo file_0 168 18 168 21. - Definition loc_8 : location_info := LocationInfo file_0 168 25 168 28. - Definition loc_11 : location_info := LocationInfo file_0 177 4 178 17. - Definition loc_12 : location_info := LocationInfo file_0 179 4 180 17. - Definition loc_13 : location_info := LocationInfo file_0 181 4 181 82. - Definition loc_14 : location_info := LocationInfo file_0 181 11 181 81. - Definition loc_15 : location_info := LocationInfo file_0 181 11 181 76. - Definition loc_16 : location_info := LocationInfo file_0 181 12 181 36. - Definition loc_17 : location_info := LocationInfo file_0 181 13 181 18. - Definition loc_18 : location_info := LocationInfo file_0 181 13 181 18. - Definition loc_19 : location_info := LocationInfo file_0 181 21 181 35. - Definition loc_20 : location_info := LocationInfo file_0 181 23 181 26. - Definition loc_21 : location_info := LocationInfo file_0 181 30 181 33. - Definition loc_22 : location_info := LocationInfo file_0 181 40 181 75. - Definition loc_23 : location_info := LocationInfo file_0 181 41 181 70. - Definition loc_24 : location_info := LocationInfo file_0 181 41 181 56. - Definition loc_25 : location_info := LocationInfo file_0 181 41 181 56. - Definition loc_26 : location_info := LocationInfo file_0 181 57 181 69. - Definition loc_27 : location_info := LocationInfo file_0 181 58 181 61. - Definition loc_28 : location_info := LocationInfo file_0 181 65 181 68. - Definition loc_29 : location_info := LocationInfo file_0 181 73 181 74. - Definition loc_30 : location_info := LocationInfo file_0 181 80 181 81. - Definition loc_31 : location_info := LocationInfo file_0 180 8 180 17. - Definition loc_32 : location_info := LocationInfo file_0 180 15 180 16. - Definition loc_34 : location_info := LocationInfo file_0 179 8 179 27. - Definition loc_36 : location_info := LocationInfo file_0 179 9 179 27. - Definition loc_37 : location_info := LocationInfo file_0 179 9 179 22. - Definition loc_38 : location_info := LocationInfo file_0 179 9 179 22. - Definition loc_39 : location_info := LocationInfo file_0 179 23 179 26. - Definition loc_40 : location_info := LocationInfo file_0 179 23 179 26. - Definition loc_41 : location_info := LocationInfo file_0 178 8 178 17. - Definition loc_42 : location_info := LocationInfo file_0 178 15 178 16. - Definition loc_44 : location_info := LocationInfo file_0 177 8 177 23. - Definition loc_45 : location_info := LocationInfo file_0 177 8 177 13. - Definition loc_46 : location_info := LocationInfo file_0 177 8 177 13. - Definition loc_47 : location_info := LocationInfo file_0 177 17 177 23. - Definition loc_48 : location_info := LocationInfo file_0 177 17 177 19. - Definition loc_49 : location_info := LocationInfo file_0 177 22 177 23. - Definition loc_52 : location_info := LocationInfo file_0 190 4 190 26. - Definition loc_53 : location_info := LocationInfo file_0 191 4 191 38. - Definition loc_54 : location_info := LocationInfo file_0 191 5 191 12. - Definition loc_55 : location_info := LocationInfo file_0 191 7 191 11. - Definition loc_56 : location_info := LocationInfo file_0 191 7 191 11. - Definition loc_57 : location_info := LocationInfo file_0 191 15 191 36. - Definition loc_58 : location_info := LocationInfo file_0 191 16 191 19. - Definition loc_59 : location_info := LocationInfo file_0 191 16 191 19. - Definition loc_60 : location_info := LocationInfo file_0 191 22 191 35. - Definition loc_61 : location_info := LocationInfo file_0 191 23 191 35. - Definition loc_62 : location_info := LocationInfo file_0 191 24 191 27. - Definition loc_63 : location_info := LocationInfo file_0 191 31 191 34. - Definition loc_64 : location_info := LocationInfo file_0 190 20 190 25. - Definition loc_65 : location_info := LocationInfo file_0 190 20 190 25. - Definition loc_66 : location_info := LocationInfo file_0 190 21 190 25. - Definition loc_67 : location_info := LocationInfo file_0 190 21 190 25. - Definition loc_72 : location_info := LocationInfo file_0 200 4 200 100. - Definition loc_73 : location_info := LocationInfo file_0 202 4 203 210. - Definition loc_74 : location_info := LocationInfo file_0 205 4 205 15. - Definition loc_75 : location_info := LocationInfo file_0 205 11 205 14. - Definition loc_76 : location_info := LocationInfo file_0 205 11 205 14. - Definition loc_77 : location_info := LocationInfo file_0 203 8 203 210. - Definition loc_78 : location_info := LocationInfo file_0 203 8 203 11. - Definition loc_79 : location_info := LocationInfo file_0 203 8 203 209. - Definition loc_80 : location_info := LocationInfo file_0 203 8 203 11. - Definition loc_81 : location_info := LocationInfo file_0 203 8 203 11. - Definition loc_82 : location_info := LocationInfo file_0 203 15 203 209. - Definition loc_83 : location_info := LocationInfo file_0 203 16 203 129. - Definition loc_84 : location_info := LocationInfo file_0 203 17 203 27. - Definition loc_85 : location_info := LocationInfo file_0 203 18 203 20. - Definition loc_86 : location_info := LocationInfo file_0 203 18 203 20. - Definition loc_87 : location_info := LocationInfo file_0 203 24 203 26. - Definition loc_88 : location_info := LocationInfo file_0 203 31 203 128. - Definition loc_89 : location_info := LocationInfo file_0 203 32 203 123. - Definition loc_90 : location_info := LocationInfo file_0 203 32 203 47. - Definition loc_91 : location_info := LocationInfo file_0 203 32 203 47. - Definition loc_92 : location_info := LocationInfo file_0 203 48 203 122. - Definition loc_93 : location_info := LocationInfo file_0 203 49 203 77. - Definition loc_94 : location_info := LocationInfo file_0 203 50 203 72. - Definition loc_95 : location_info := LocationInfo file_0 203 50 203 56. - Definition loc_96 : location_info := LocationInfo file_0 203 52 203 55. - Definition loc_97 : location_info := LocationInfo file_0 203 59 203 72. - Definition loc_98 : location_info := LocationInfo file_0 203 60 203 63. - Definition loc_99 : location_info := LocationInfo file_0 203 67 203 71. - Definition loc_100 : location_info := LocationInfo file_0 203 75 203 76. - Definition loc_101 : location_info := LocationInfo file_0 203 80 203 121. - Definition loc_102 : location_info := LocationInfo file_0 203 81 203 85. - Definition loc_103 : location_info := LocationInfo file_0 203 82 203 85. - Definition loc_104 : location_info := LocationInfo file_0 203 89 203 120. - Definition loc_105 : location_info := LocationInfo file_0 203 90 203 112. - Definition loc_106 : location_info := LocationInfo file_0 203 90 203 108. - Definition loc_107 : location_info := LocationInfo file_0 203 91 203 103. - Definition loc_108 : location_info := LocationInfo file_0 203 106 203 107. - Definition loc_109 : location_info := LocationInfo file_0 203 111 203 112. - Definition loc_110 : location_info := LocationInfo file_0 203 115 203 119. - Definition loc_111 : location_info := LocationInfo file_0 203 126 203 127. - Definition loc_112 : location_info := LocationInfo file_0 203 132 203 208. - Definition loc_113 : location_info := LocationInfo file_0 203 134 203 162. - Definition loc_114 : location_info := LocationInfo file_0 203 135 203 157. - Definition loc_115 : location_info := LocationInfo file_0 203 135 203 141. - Definition loc_116 : location_info := LocationInfo file_0 203 137 203 140. - Definition loc_117 : location_info := LocationInfo file_0 203 144 203 157. - Definition loc_118 : location_info := LocationInfo file_0 203 145 203 148. - Definition loc_119 : location_info := LocationInfo file_0 203 152 203 156. - Definition loc_120 : location_info := LocationInfo file_0 203 160 203 161. - Definition loc_121 : location_info := LocationInfo file_0 203 165 203 206. - Definition loc_122 : location_info := LocationInfo file_0 203 166 203 170. - Definition loc_123 : location_info := LocationInfo file_0 203 167 203 170. - Definition loc_124 : location_info := LocationInfo file_0 203 174 203 205. - Definition loc_125 : location_info := LocationInfo file_0 203 175 203 197. - Definition loc_126 : location_info := LocationInfo file_0 203 175 203 193. - Definition loc_127 : location_info := LocationInfo file_0 203 176 203 188. - Definition loc_128 : location_info := LocationInfo file_0 203 191 203 192. - Definition loc_129 : location_info := LocationInfo file_0 203 196 203 197. - Definition loc_130 : location_info := LocationInfo file_0 203 200 203 204. - Definition loc_132 : location_info := LocationInfo file_0 202 8 202 16. - Definition loc_133 : location_info := LocationInfo file_0 202 8 202 10. - Definition loc_134 : location_info := LocationInfo file_0 202 14 202 16. - Definition loc_135 : location_info := LocationInfo file_0 200 20 200 99. - Definition loc_136 : location_info := LocationInfo file_0 200 20 200 22. - Definition loc_137 : location_info := LocationInfo file_0 200 20 200 22. - Definition loc_138 : location_info := LocationInfo file_0 200 25 200 99. - Definition loc_139 : location_info := LocationInfo file_0 200 26 200 54. - Definition loc_140 : location_info := LocationInfo file_0 200 27 200 49. - Definition loc_141 : location_info := LocationInfo file_0 200 27 200 33. - Definition loc_142 : location_info := LocationInfo file_0 200 29 200 32. - Definition loc_143 : location_info := LocationInfo file_0 200 36 200 49. - Definition loc_144 : location_info := LocationInfo file_0 200 37 200 40. - Definition loc_145 : location_info := LocationInfo file_0 200 44 200 48. - Definition loc_146 : location_info := LocationInfo file_0 200 52 200 53. - Definition loc_147 : location_info := LocationInfo file_0 200 57 200 98. - Definition loc_148 : location_info := LocationInfo file_0 200 58 200 62. - Definition loc_149 : location_info := LocationInfo file_0 200 59 200 62. - Definition loc_150 : location_info := LocationInfo file_0 200 66 200 97. - Definition loc_151 : location_info := LocationInfo file_0 200 67 200 89. - Definition loc_152 : location_info := LocationInfo file_0 200 67 200 85. - Definition loc_153 : location_info := LocationInfo file_0 200 68 200 80. - Definition loc_154 : location_info := LocationInfo file_0 200 83 200 84. - Definition loc_155 : location_info := LocationInfo file_0 200 88 200 89. - Definition loc_156 : location_info := LocationInfo file_0 200 92 200 96. - Definition loc_161 : location_info := LocationInfo file_0 219 4 219 79. - Definition loc_162 : location_info := LocationInfo file_0 220 4 220 75. - Definition loc_163 : location_info := LocationInfo file_0 221 4 221 24. - Definition loc_164 : location_info := LocationInfo file_0 222 4 222 33. - Definition loc_165 : location_info := LocationInfo file_0 224 1 224 13. - Definition loc_166 : location_info := LocationInfo file_0 224 1 224 6. - Definition loc_167 : location_info := LocationInfo file_0 224 2 224 6. - Definition loc_168 : location_info := LocationInfo file_0 224 2 224 6. - Definition loc_169 : location_info := LocationInfo file_0 224 9 224 12. - Definition loc_170 : location_info := LocationInfo file_0 224 9 224 12. - Definition loc_171 : location_info := LocationInfo file_0 222 12 222 30. - Definition loc_172 : location_info := LocationInfo file_0 222 12 222 25. - Definition loc_173 : location_info := LocationInfo file_0 222 12 222 25. - Definition loc_174 : location_info := LocationInfo file_0 222 26 222 29. - Definition loc_175 : location_info := LocationInfo file_0 222 26 222 29. - Definition loc_176 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_177 : location_info := LocationInfo file_0 221 4 221 23. - Definition loc_178 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_179 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_180 : location_info := LocationInfo file_0 221 11 221 23. - Definition loc_181 : location_info := LocationInfo file_0 221 12 221 15. - Definition loc_182 : location_info := LocationInfo file_0 221 19 221 22. - Definition loc_183 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_184 : location_info := LocationInfo file_0 220 4 220 74. - Definition loc_185 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_186 : location_info := LocationInfo file_0 220 4 220 7. - Definition loc_187 : location_info := LocationInfo file_0 220 11 220 74. - Definition loc_188 : location_info := LocationInfo file_0 220 12 220 56. - Definition loc_189 : location_info := LocationInfo file_0 220 13 220 16. - Definition loc_190 : location_info := LocationInfo file_0 220 20 220 55. - Definition loc_191 : location_info := LocationInfo file_0 220 21 220 50. - Definition loc_192 : location_info := LocationInfo file_0 220 21 220 36. - Definition loc_193 : location_info := LocationInfo file_0 220 21 220 36. - Definition loc_194 : location_info := LocationInfo file_0 220 37 220 49. - Definition loc_195 : location_info := LocationInfo file_0 220 38 220 41. - Definition loc_196 : location_info := LocationInfo file_0 220 45 220 48. - Definition loc_197 : location_info := LocationInfo file_0 220 53 220 54. - Definition loc_198 : location_info := LocationInfo file_0 220 59 220 73. - Definition loc_199 : location_info := LocationInfo file_0 220 61 220 64. - Definition loc_200 : location_info := LocationInfo file_0 220 68 220 71. - Definition loc_201 : location_info := LocationInfo file_0 219 33 219 78. - Definition loc_202 : location_info := LocationInfo file_0 219 33 219 48. - Definition loc_203 : location_info := LocationInfo file_0 219 33 219 48. - Definition loc_204 : location_info := LocationInfo file_0 219 49 219 77. - Definition loc_205 : location_info := LocationInfo file_0 219 49 219 69. - Definition loc_206 : location_info := LocationInfo file_0 219 49 219 69. - Definition loc_207 : location_info := LocationInfo file_0 219 49 219 69. - Definition loc_208 : location_info := LocationInfo file_0 219 49 219 55. - Definition loc_209 : location_info := LocationInfo file_0 219 49 219 55. - Definition loc_210 : location_info := LocationInfo file_0 219 70 219 76. - Definition loc_211 : location_info := LocationInfo file_0 219 70 219 76. - Definition loc_214 : location_info := LocationInfo file_0 219 20 219 25. - Definition loc_215 : location_info := LocationInfo file_0 219 20 219 25. - Definition loc_216 : location_info := LocationInfo file_0 219 21 219 25. - Definition loc_217 : location_info := LocationInfo file_0 219 21 219 25. - Definition loc_222 : location_info := LocationInfo file_0 239 4 239 53. - Definition loc_223 : location_info := LocationInfo file_0 240 4 241 33. - Definition loc_224 : location_info := LocationInfo file_0 242 4 242 171. - Definition loc_225 : location_info := LocationInfo file_0 243 4 243 78. - Definition loc_226 : location_info := LocationInfo file_0 244 4 244 24. - Definition loc_227 : location_info := LocationInfo file_0 246 4 247 26. - Definition loc_228 : location_info := LocationInfo file_0 249 1 249 13. - Definition loc_229 : location_info := LocationInfo file_0 250 4 250 13. - Definition loc_230 : location_info := LocationInfo file_0 250 11 250 12. - Definition loc_231 : location_info := LocationInfo file_0 249 1 249 6. - Definition loc_232 : location_info := LocationInfo file_0 249 2 249 6. - Definition loc_233 : location_info := LocationInfo file_0 249 2 249 6. - Definition loc_234 : location_info := LocationInfo file_0 249 9 249 12. - Definition loc_235 : location_info := LocationInfo file_0 249 9 249 12. - Definition loc_236 : location_info := LocationInfo file_0 247 8 247 26. - Definition loc_237 : location_info := LocationInfo file_0 247 15 247 25. - Definition loc_238 : location_info := LocationInfo file_0 247 15 247 18. - Definition loc_239 : location_info := LocationInfo file_0 247 15 247 18. - Definition loc_240 : location_info := LocationInfo file_0 247 22 247 25. - Definition loc_241 : location_info := LocationInfo file_0 247 22 247 25. - Definition loc_243 : location_info := LocationInfo file_0 246 8 246 26. - Definition loc_244 : location_info := LocationInfo file_0 246 8 246 21. - Definition loc_245 : location_info := LocationInfo file_0 246 8 246 21. - Definition loc_246 : location_info := LocationInfo file_0 246 22 246 25. - Definition loc_247 : location_info := LocationInfo file_0 246 22 246 25. - Definition loc_248 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_249 : location_info := LocationInfo file_0 244 4 244 23. - Definition loc_250 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_251 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_252 : location_info := LocationInfo file_0 244 11 244 23. - Definition loc_253 : location_info := LocationInfo file_0 244 12 244 15. - Definition loc_254 : location_info := LocationInfo file_0 244 19 244 22. - Definition loc_255 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_256 : location_info := LocationInfo file_0 243 4 243 77. - Definition loc_257 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_258 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_259 : location_info := LocationInfo file_0 243 11 243 77. - Definition loc_260 : location_info := LocationInfo file_0 243 12 243 59. - Definition loc_261 : location_info := LocationInfo file_0 243 13 243 19. - Definition loc_262 : location_info := LocationInfo file_0 243 13 243 19. - Definition loc_263 : location_info := LocationInfo file_0 243 23 243 58. - Definition loc_264 : location_info := LocationInfo file_0 243 24 243 53. - Definition loc_265 : location_info := LocationInfo file_0 243 24 243 39. - Definition loc_266 : location_info := LocationInfo file_0 243 24 243 39. - Definition loc_267 : location_info := LocationInfo file_0 243 40 243 52. - Definition loc_268 : location_info := LocationInfo file_0 243 41 243 44. - Definition loc_269 : location_info := LocationInfo file_0 243 48 243 51. - Definition loc_270 : location_info := LocationInfo file_0 243 56 243 57. - Definition loc_271 : location_info := LocationInfo file_0 243 62 243 76. - Definition loc_272 : location_info := LocationInfo file_0 243 64 243 67. - Definition loc_273 : location_info := LocationInfo file_0 243 71 243 74. - Definition loc_274 : location_info := LocationInfo file_0 242 4 242 7. - Definition loc_275 : location_info := LocationInfo file_0 242 4 242 170. - Definition loc_276 : location_info := LocationInfo file_0 242 4 242 7. - Definition loc_277 : location_info := LocationInfo file_0 242 4 242 7. - Definition loc_278 : location_info := LocationInfo file_0 242 11 242 170. - Definition loc_279 : location_info := LocationInfo file_0 242 11 242 15. - Definition loc_280 : location_info := LocationInfo file_0 242 11 242 15. - Definition loc_281 : location_info := LocationInfo file_0 242 18 242 170. - Definition loc_282 : location_info := LocationInfo file_0 242 19 242 92. - Definition loc_283 : location_info := LocationInfo file_0 242 20 242 47. - Definition loc_284 : location_info := LocationInfo file_0 242 21 242 42. - Definition loc_285 : location_info := LocationInfo file_0 242 21 242 27. - Definition loc_286 : location_info := LocationInfo file_0 242 23 242 26. - Definition loc_287 : location_info := LocationInfo file_0 242 30 242 42. - Definition loc_288 : location_info := LocationInfo file_0 242 31 242 34. - Definition loc_289 : location_info := LocationInfo file_0 242 38 242 41. - Definition loc_290 : location_info := LocationInfo file_0 242 45 242 46. - Definition loc_291 : location_info := LocationInfo file_0 242 50 242 91. - Definition loc_292 : location_info := LocationInfo file_0 242 51 242 55. - Definition loc_293 : location_info := LocationInfo file_0 242 52 242 55. - Definition loc_294 : location_info := LocationInfo file_0 242 59 242 90. - Definition loc_295 : location_info := LocationInfo file_0 242 60 242 82. - Definition loc_296 : location_info := LocationInfo file_0 242 60 242 78. - Definition loc_297 : location_info := LocationInfo file_0 242 61 242 73. - Definition loc_298 : location_info := LocationInfo file_0 242 76 242 77. - Definition loc_299 : location_info := LocationInfo file_0 242 81 242 82. - Definition loc_300 : location_info := LocationInfo file_0 242 85 242 89. - Definition loc_301 : location_info := LocationInfo file_0 242 95 242 169. - Definition loc_302 : location_info := LocationInfo file_0 242 96 242 124. - Definition loc_303 : location_info := LocationInfo file_0 242 97 242 119. - Definition loc_304 : location_info := LocationInfo file_0 242 97 242 103. - Definition loc_305 : location_info := LocationInfo file_0 242 99 242 102. - Definition loc_306 : location_info := LocationInfo file_0 242 106 242 119. - Definition loc_307 : location_info := LocationInfo file_0 242 107 242 110. - Definition loc_308 : location_info := LocationInfo file_0 242 114 242 118. - Definition loc_309 : location_info := LocationInfo file_0 242 122 242 123. - Definition loc_310 : location_info := LocationInfo file_0 242 127 242 168. - Definition loc_311 : location_info := LocationInfo file_0 242 128 242 132. - Definition loc_312 : location_info := LocationInfo file_0 242 129 242 132. - Definition loc_313 : location_info := LocationInfo file_0 242 136 242 167. - Definition loc_314 : location_info := LocationInfo file_0 242 137 242 159. - Definition loc_315 : location_info := LocationInfo file_0 242 137 242 155. - Definition loc_316 : location_info := LocationInfo file_0 242 138 242 150. - Definition loc_317 : location_info := LocationInfo file_0 242 153 242 154. - Definition loc_318 : location_info := LocationInfo file_0 242 158 242 159. - Definition loc_319 : location_info := LocationInfo file_0 242 162 242 166. - Definition loc_320 : location_info := LocationInfo file_0 240 15 241 32. - Definition loc_321 : location_info := LocationInfo file_0 240 15 240 32. - Definition loc_322 : location_info := LocationInfo file_0 240 16 240 21. - Definition loc_323 : location_info := LocationInfo file_0 240 16 240 21. - Definition loc_324 : location_info := LocationInfo file_0 240 25 240 31. - Definition loc_325 : location_info := LocationInfo file_0 240 25 240 27. - Definition loc_326 : location_info := LocationInfo file_0 240 30 240 31. - Definition loc_327 : location_info := LocationInfo file_0 240 35 240 36. - Definition loc_328 : location_info := LocationInfo file_0 241 31 241 32. - Definition loc_331 : location_info := LocationInfo file_0 239 33 239 52. - Definition loc_332 : location_info := LocationInfo file_0 239 33 239 48. - Definition loc_333 : location_info := LocationInfo file_0 239 33 239 48. - Definition loc_334 : location_info := LocationInfo file_0 239 49 239 51. - Definition loc_335 : location_info := LocationInfo file_0 239 49 239 51. - Definition loc_338 : location_info := LocationInfo file_0 239 20 239 25. - Definition loc_339 : location_info := LocationInfo file_0 239 20 239 25. - Definition loc_340 : location_info := LocationInfo file_0 239 21 239 25. - Definition loc_341 : location_info := LocationInfo file_0 239 21 239 25. - Definition loc_346 : location_info := LocationInfo file_0 262 4 262 50. - Definition loc_347 : location_info := LocationInfo file_0 263 4 263 31. - Definition loc_348 : location_info := LocationInfo file_0 264 4 264 209. - Definition loc_349 : location_info := LocationInfo file_0 265 4 265 15. - Definition loc_350 : location_info := LocationInfo file_0 266 4 267 29. - Definition loc_351 : location_info := LocationInfo file_0 268 4 269 19. - Definition loc_352 : location_info := LocationInfo file_0 270 4 277 5. - Definition loc_353 : location_info := LocationInfo file_0 278 4 278 197. - Definition loc_354 : location_info := LocationInfo file_0 279 4 279 197. - Definition loc_355 : location_info := LocationInfo file_0 280 4 280 26. - Definition loc_356 : location_info := LocationInfo file_0 281 4 281 22. - Definition loc_357 : location_info := LocationInfo file_0 282 4 282 13. - Definition loc_358 : location_info := LocationInfo file_0 282 11 282 12. - Definition loc_359 : location_info := LocationInfo file_0 281 4 281 14. - Definition loc_360 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_361 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_362 : location_info := LocationInfo file_0 281 17 281 21. - Definition loc_363 : location_info := LocationInfo file_0 281 17 281 21. - Definition loc_364 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_365 : location_info := LocationInfo file_0 280 4 280 25. - Definition loc_366 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_367 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_368 : location_info := LocationInfo file_0 280 12 280 25. - Definition loc_369 : location_info := LocationInfo file_0 280 13 280 16. - Definition loc_370 : location_info := LocationInfo file_0 280 20 280 24. - Definition loc_371 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_372 : location_info := LocationInfo file_0 279 4 279 196. - Definition loc_373 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_374 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_375 : location_info := LocationInfo file_0 279 12 279 196. - Definition loc_376 : location_info := LocationInfo file_0 279 13 279 118. - Definition loc_377 : location_info := LocationInfo file_0 279 14 279 18. - Definition loc_378 : location_info := LocationInfo file_0 279 14 279 18. - Definition loc_379 : location_info := LocationInfo file_0 279 22 279 117. - Definition loc_380 : location_info := LocationInfo file_0 279 23 279 112. - Definition loc_381 : location_info := LocationInfo file_0 279 23 279 38. - Definition loc_382 : location_info := LocationInfo file_0 279 23 279 38. - Definition loc_383 : location_info := LocationInfo file_0 279 39 279 111. - Definition loc_384 : location_info := LocationInfo file_0 279 40 279 67. - Definition loc_385 : location_info := LocationInfo file_0 279 41 279 62. - Definition loc_386 : location_info := LocationInfo file_0 279 41 279 47. - Definition loc_387 : location_info := LocationInfo file_0 279 43 279 46. - Definition loc_388 : location_info := LocationInfo file_0 279 50 279 62. - Definition loc_389 : location_info := LocationInfo file_0 279 51 279 54. - Definition loc_390 : location_info := LocationInfo file_0 279 58 279 61. - Definition loc_391 : location_info := LocationInfo file_0 279 65 279 66. - Definition loc_392 : location_info := LocationInfo file_0 279 70 279 110. - Definition loc_393 : location_info := LocationInfo file_0 279 71 279 75. - Definition loc_394 : location_info := LocationInfo file_0 279 72 279 75. - Definition loc_395 : location_info := LocationInfo file_0 279 79 279 109. - Definition loc_396 : location_info := LocationInfo file_0 279 80 279 102. - Definition loc_397 : location_info := LocationInfo file_0 279 80 279 98. - Definition loc_398 : location_info := LocationInfo file_0 279 81 279 93. - Definition loc_399 : location_info := LocationInfo file_0 279 96 279 97. - Definition loc_400 : location_info := LocationInfo file_0 279 101 279 102. - Definition loc_401 : location_info := LocationInfo file_0 279 105 279 108. - Definition loc_402 : location_info := LocationInfo file_0 279 115 279 116. - Definition loc_403 : location_info := LocationInfo file_0 279 121 279 195. - Definition loc_404 : location_info := LocationInfo file_0 279 123 279 150. - Definition loc_405 : location_info := LocationInfo file_0 279 124 279 145. - Definition loc_406 : location_info := LocationInfo file_0 279 124 279 130. - Definition loc_407 : location_info := LocationInfo file_0 279 126 279 129. - Definition loc_408 : location_info := LocationInfo file_0 279 133 279 145. - Definition loc_409 : location_info := LocationInfo file_0 279 134 279 137. - Definition loc_410 : location_info := LocationInfo file_0 279 141 279 144. - Definition loc_411 : location_info := LocationInfo file_0 279 148 279 149. - Definition loc_412 : location_info := LocationInfo file_0 279 153 279 193. - Definition loc_413 : location_info := LocationInfo file_0 279 154 279 158. - Definition loc_414 : location_info := LocationInfo file_0 279 155 279 158. - Definition loc_415 : location_info := LocationInfo file_0 279 162 279 192. - Definition loc_416 : location_info := LocationInfo file_0 279 163 279 185. - Definition loc_417 : location_info := LocationInfo file_0 279 163 279 181. - Definition loc_418 : location_info := LocationInfo file_0 279 164 279 176. - Definition loc_419 : location_info := LocationInfo file_0 279 179 279 180. - Definition loc_420 : location_info := LocationInfo file_0 279 184 279 185. - Definition loc_421 : location_info := LocationInfo file_0 279 188 279 191. - Definition loc_422 : location_info := LocationInfo file_0 278 4 278 8. - Definition loc_423 : location_info := LocationInfo file_0 278 4 278 196. - Definition loc_424 : location_info := LocationInfo file_0 278 4 278 8. - Definition loc_425 : location_info := LocationInfo file_0 278 4 278 8. - Definition loc_426 : location_info := LocationInfo file_0 278 12 278 196. - Definition loc_427 : location_info := LocationInfo file_0 278 13 278 118. - Definition loc_428 : location_info := LocationInfo file_0 278 14 278 18. - Definition loc_429 : location_info := LocationInfo file_0 278 14 278 18. - Definition loc_430 : location_info := LocationInfo file_0 278 22 278 117. - Definition loc_431 : location_info := LocationInfo file_0 278 23 278 112. - Definition loc_432 : location_info := LocationInfo file_0 278 23 278 38. - Definition loc_433 : location_info := LocationInfo file_0 278 23 278 38. - Definition loc_434 : location_info := LocationInfo file_0 278 39 278 111. - Definition loc_435 : location_info := LocationInfo file_0 278 40 278 67. - Definition loc_436 : location_info := LocationInfo file_0 278 41 278 62. - Definition loc_437 : location_info := LocationInfo file_0 278 41 278 47. - Definition loc_438 : location_info := LocationInfo file_0 278 43 278 46. - Definition loc_439 : location_info := LocationInfo file_0 278 50 278 62. - Definition loc_440 : location_info := LocationInfo file_0 278 51 278 54. - Definition loc_441 : location_info := LocationInfo file_0 278 58 278 61. - Definition loc_442 : location_info := LocationInfo file_0 278 65 278 66. - Definition loc_443 : location_info := LocationInfo file_0 278 70 278 110. - Definition loc_444 : location_info := LocationInfo file_0 278 71 278 75. - Definition loc_445 : location_info := LocationInfo file_0 278 72 278 75. - Definition loc_446 : location_info := LocationInfo file_0 278 79 278 109. - Definition loc_447 : location_info := LocationInfo file_0 278 80 278 102. - Definition loc_448 : location_info := LocationInfo file_0 278 80 278 98. - Definition loc_449 : location_info := LocationInfo file_0 278 81 278 93. - Definition loc_450 : location_info := LocationInfo file_0 278 96 278 97. - Definition loc_451 : location_info := LocationInfo file_0 278 101 278 102. - Definition loc_452 : location_info := LocationInfo file_0 278 105 278 108. - Definition loc_453 : location_info := LocationInfo file_0 278 115 278 116. - Definition loc_454 : location_info := LocationInfo file_0 278 121 278 195. - Definition loc_455 : location_info := LocationInfo file_0 278 123 278 150. - Definition loc_456 : location_info := LocationInfo file_0 278 124 278 145. - Definition loc_457 : location_info := LocationInfo file_0 278 124 278 130. - Definition loc_458 : location_info := LocationInfo file_0 278 126 278 129. - Definition loc_459 : location_info := LocationInfo file_0 278 133 278 145. - Definition loc_460 : location_info := LocationInfo file_0 278 134 278 137. - Definition loc_461 : location_info := LocationInfo file_0 278 141 278 144. - Definition loc_462 : location_info := LocationInfo file_0 278 148 278 149. - Definition loc_463 : location_info := LocationInfo file_0 278 153 278 193. - Definition loc_464 : location_info := LocationInfo file_0 278 154 278 158. - Definition loc_465 : location_info := LocationInfo file_0 278 155 278 158. - Definition loc_466 : location_info := LocationInfo file_0 278 162 278 192. - Definition loc_467 : location_info := LocationInfo file_0 278 163 278 185. - Definition loc_468 : location_info := LocationInfo file_0 278 163 278 181. - Definition loc_469 : location_info := LocationInfo file_0 278 164 278 176. - Definition loc_470 : location_info := LocationInfo file_0 278 179 278 180. - Definition loc_471 : location_info := LocationInfo file_0 278 184 278 185. - Definition loc_472 : location_info := LocationInfo file_0 278 188 278 191. - Definition loc_473 : location_info := LocationInfo file_0 270 35 275 5. - Definition loc_474 : location_info := LocationInfo file_0 271 8 272 23. - Definition loc_475 : location_info := LocationInfo file_0 273 8 274 23. - Definition loc_476 : location_info := LocationInfo file_0 274 12 274 23. - Definition loc_477 : location_info := LocationInfo file_0 274 19 274 22. - Definition loc_478 : location_info := LocationInfo file_0 274 20 274 22. - Definition loc_480 : location_info := LocationInfo file_0 273 12 273 18. - Definition loc_481 : location_info := LocationInfo file_0 273 12 273 18. - Definition loc_482 : location_info := LocationInfo file_0 272 12 272 23. - Definition loc_483 : location_info := LocationInfo file_0 272 19 272 22. - Definition loc_484 : location_info := LocationInfo file_0 272 20 272 22. - Definition loc_486 : location_info := LocationInfo file_0 271 12 271 37. - Definition loc_487 : location_info := LocationInfo file_0 271 12 271 16. - Definition loc_488 : location_info := LocationInfo file_0 271 12 271 16. - Definition loc_489 : location_info := LocationInfo file_0 271 19 271 37. - Definition loc_490 : location_info := LocationInfo file_0 275 11 277 5. - Definition loc_491 : location_info := LocationInfo file_0 276 8 276 30. - Definition loc_492 : location_info := LocationInfo file_0 276 8 276 12. - Definition loc_493 : location_info := LocationInfo file_0 276 8 276 29. - Definition loc_494 : location_info := LocationInfo file_0 276 8 276 12. - Definition loc_495 : location_info := LocationInfo file_0 276 8 276 12. - Definition loc_496 : location_info := LocationInfo file_0 276 16 276 29. - Definition loc_497 : location_info := LocationInfo file_0 276 17 276 20. - Definition loc_498 : location_info := LocationInfo file_0 276 24 276 28. - Definition loc_499 : location_info := LocationInfo file_0 270 8 270 33. - Definition loc_500 : location_info := LocationInfo file_0 270 8 270 12. - Definition loc_501 : location_info := LocationInfo file_0 270 8 270 12. - Definition loc_502 : location_info := LocationInfo file_0 270 15 270 33. - Definition loc_503 : location_info := LocationInfo file_0 269 8 269 19. - Definition loc_504 : location_info := LocationInfo file_0 269 15 269 18. - Definition loc_505 : location_info := LocationInfo file_0 269 16 269 18. - Definition loc_507 : location_info := LocationInfo file_0 268 8 268 36. - Definition loc_509 : location_info := LocationInfo file_0 268 9 268 36. - Definition loc_510 : location_info := LocationInfo file_0 268 10 268 14. - Definition loc_511 : location_info := LocationInfo file_0 268 10 268 14. - Definition loc_512 : location_info := LocationInfo file_0 268 17 268 35. - Definition loc_513 : location_info := LocationInfo file_0 266 13 267 28. - Definition loc_514 : location_info := LocationInfo file_0 266 13 266 40. - Definition loc_515 : location_info := LocationInfo file_0 266 14 266 18. - Definition loc_516 : location_info := LocationInfo file_0 266 14 266 18. - Definition loc_517 : location_info := LocationInfo file_0 266 21 266 39. - Definition loc_518 : location_info := LocationInfo file_0 266 43 266 44. - Definition loc_519 : location_info := LocationInfo file_0 267 27 267 28. - Definition loc_522 : location_info := LocationInfo file_0 265 13 265 14. - Definition loc_525 : location_info := LocationInfo file_0 264 21 264 208. - Definition loc_526 : location_info := LocationInfo file_0 264 22 264 130. - Definition loc_527 : location_info := LocationInfo file_0 264 23 264 30. - Definition loc_528 : location_info := LocationInfo file_0 264 23 264 30. - Definition loc_529 : location_info := LocationInfo file_0 264 34 264 129. - Definition loc_530 : location_info := LocationInfo file_0 264 35 264 124. - Definition loc_531 : location_info := LocationInfo file_0 264 35 264 50. - Definition loc_532 : location_info := LocationInfo file_0 264 35 264 50. - Definition loc_533 : location_info := LocationInfo file_0 264 51 264 123. - Definition loc_534 : location_info := LocationInfo file_0 264 52 264 79. - Definition loc_535 : location_info := LocationInfo file_0 264 53 264 74. - Definition loc_536 : location_info := LocationInfo file_0 264 53 264 59. - Definition loc_537 : location_info := LocationInfo file_0 264 55 264 58. - Definition loc_538 : location_info := LocationInfo file_0 264 62 264 74. - Definition loc_539 : location_info := LocationInfo file_0 264 63 264 66. - Definition loc_540 : location_info := LocationInfo file_0 264 70 264 73. - Definition loc_541 : location_info := LocationInfo file_0 264 77 264 78. - Definition loc_542 : location_info := LocationInfo file_0 264 82 264 122. - Definition loc_543 : location_info := LocationInfo file_0 264 83 264 87. - Definition loc_544 : location_info := LocationInfo file_0 264 84 264 87. - Definition loc_545 : location_info := LocationInfo file_0 264 91 264 121. - Definition loc_546 : location_info := LocationInfo file_0 264 92 264 114. - Definition loc_547 : location_info := LocationInfo file_0 264 92 264 110. - Definition loc_548 : location_info := LocationInfo file_0 264 93 264 105. - Definition loc_549 : location_info := LocationInfo file_0 264 108 264 109. - Definition loc_550 : location_info := LocationInfo file_0 264 113 264 114. - Definition loc_551 : location_info := LocationInfo file_0 264 117 264 120. - Definition loc_552 : location_info := LocationInfo file_0 264 127 264 128. - Definition loc_553 : location_info := LocationInfo file_0 264 133 264 207. - Definition loc_554 : location_info := LocationInfo file_0 264 135 264 162. - Definition loc_555 : location_info := LocationInfo file_0 264 136 264 157. - Definition loc_556 : location_info := LocationInfo file_0 264 136 264 142. - Definition loc_557 : location_info := LocationInfo file_0 264 138 264 141. - Definition loc_558 : location_info := LocationInfo file_0 264 145 264 157. - Definition loc_559 : location_info := LocationInfo file_0 264 146 264 149. - Definition loc_560 : location_info := LocationInfo file_0 264 153 264 156. - Definition loc_561 : location_info := LocationInfo file_0 264 160 264 161. - Definition loc_562 : location_info := LocationInfo file_0 264 165 264 205. - Definition loc_563 : location_info := LocationInfo file_0 264 166 264 170. - Definition loc_564 : location_info := LocationInfo file_0 264 167 264 170. - Definition loc_565 : location_info := LocationInfo file_0 264 174 264 204. - Definition loc_566 : location_info := LocationInfo file_0 264 175 264 197. - Definition loc_567 : location_info := LocationInfo file_0 264 175 264 193. - Definition loc_568 : location_info := LocationInfo file_0 264 176 264 188. - Definition loc_569 : location_info := LocationInfo file_0 264 191 264 192. - Definition loc_570 : location_info := LocationInfo file_0 264 196 264 197. - Definition loc_571 : location_info := LocationInfo file_0 264 200 264 203. - Definition loc_574 : location_info := LocationInfo file_0 263 16 263 30. - Definition loc_575 : location_info := LocationInfo file_0 263 16 263 22. - Definition loc_576 : location_info := LocationInfo file_0 263 16 263 22. - Definition loc_577 : location_info := LocationInfo file_0 263 25 263 26. - Definition loc_578 : location_info := LocationInfo file_0 263 29 263 30. - Definition loc_581 : location_info := LocationInfo file_0 262 19 262 49. - Definition loc_582 : location_info := LocationInfo file_0 262 19 262 23. - Definition loc_583 : location_info := LocationInfo file_0 262 19 262 23. - Definition loc_584 : location_info := LocationInfo file_0 262 26 262 49. + Definition loc_2 : location_info := LocationInfo file_0 169 4 169 30. + Definition loc_3 : location_info := LocationInfo file_0 169 11 169 29. + Definition loc_4 : location_info := LocationInfo file_0 169 11 169 14. + Definition loc_5 : location_info := LocationInfo file_0 169 11 169 14. + Definition loc_6 : location_info := LocationInfo file_0 169 17 169 29. + Definition loc_7 : location_info := LocationInfo file_0 169 18 169 21. + Definition loc_8 : location_info := LocationInfo file_0 169 25 169 28. + Definition loc_11 : location_info := LocationInfo file_0 178 4 179 17. + Definition loc_12 : location_info := LocationInfo file_0 180 4 181 17. + Definition loc_13 : location_info := LocationInfo file_0 182 4 182 82. + Definition loc_14 : location_info := LocationInfo file_0 182 11 182 81. + Definition loc_15 : location_info := LocationInfo file_0 182 11 182 76. + Definition loc_16 : location_info := LocationInfo file_0 182 12 182 36. + Definition loc_17 : location_info := LocationInfo file_0 182 13 182 18. + Definition loc_18 : location_info := LocationInfo file_0 182 13 182 18. + Definition loc_19 : location_info := LocationInfo file_0 182 21 182 35. + Definition loc_20 : location_info := LocationInfo file_0 182 23 182 26. + Definition loc_21 : location_info := LocationInfo file_0 182 30 182 33. + Definition loc_22 : location_info := LocationInfo file_0 182 40 182 75. + Definition loc_23 : location_info := LocationInfo file_0 182 41 182 70. + Definition loc_24 : location_info := LocationInfo file_0 182 41 182 56. + Definition loc_25 : location_info := LocationInfo file_0 182 41 182 56. + Definition loc_26 : location_info := LocationInfo file_0 182 57 182 69. + Definition loc_27 : location_info := LocationInfo file_0 182 58 182 61. + Definition loc_28 : location_info := LocationInfo file_0 182 65 182 68. + Definition loc_29 : location_info := LocationInfo file_0 182 73 182 74. + Definition loc_30 : location_info := LocationInfo file_0 182 80 182 81. + Definition loc_31 : location_info := LocationInfo file_0 181 8 181 17. + Definition loc_32 : location_info := LocationInfo file_0 181 15 181 16. + Definition loc_34 : location_info := LocationInfo file_0 180 8 180 27. + Definition loc_36 : location_info := LocationInfo file_0 180 9 180 27. + Definition loc_37 : location_info := LocationInfo file_0 180 9 180 22. + Definition loc_38 : location_info := LocationInfo file_0 180 9 180 22. + Definition loc_39 : location_info := LocationInfo file_0 180 23 180 26. + Definition loc_40 : location_info := LocationInfo file_0 180 23 180 26. + Definition loc_41 : location_info := LocationInfo file_0 179 8 179 17. + Definition loc_42 : location_info := LocationInfo file_0 179 15 179 16. + Definition loc_44 : location_info := LocationInfo file_0 178 8 178 23. + Definition loc_45 : location_info := LocationInfo file_0 178 8 178 13. + Definition loc_46 : location_info := LocationInfo file_0 178 8 178 13. + Definition loc_47 : location_info := LocationInfo file_0 178 17 178 23. + Definition loc_48 : location_info := LocationInfo file_0 178 17 178 19. + Definition loc_49 : location_info := LocationInfo file_0 178 22 178 23. + Definition loc_52 : location_info := LocationInfo file_0 191 4 191 26. + Definition loc_53 : location_info := LocationInfo file_0 192 4 192 38. + Definition loc_54 : location_info := LocationInfo file_0 192 5 192 12. + Definition loc_55 : location_info := LocationInfo file_0 192 7 192 11. + Definition loc_56 : location_info := LocationInfo file_0 192 7 192 11. + Definition loc_57 : location_info := LocationInfo file_0 192 15 192 36. + Definition loc_58 : location_info := LocationInfo file_0 192 16 192 19. + Definition loc_59 : location_info := LocationInfo file_0 192 16 192 19. + Definition loc_60 : location_info := LocationInfo file_0 192 22 192 35. + Definition loc_61 : location_info := LocationInfo file_0 192 23 192 35. + Definition loc_62 : location_info := LocationInfo file_0 192 24 192 27. + Definition loc_63 : location_info := LocationInfo file_0 192 31 192 34. + Definition loc_64 : location_info := LocationInfo file_0 191 20 191 25. + Definition loc_65 : location_info := LocationInfo file_0 191 20 191 25. + Definition loc_66 : location_info := LocationInfo file_0 191 21 191 25. + Definition loc_67 : location_info := LocationInfo file_0 191 21 191 25. + Definition loc_72 : location_info := LocationInfo file_0 201 4 201 100. + Definition loc_73 : location_info := LocationInfo file_0 203 4 204 210. + Definition loc_74 : location_info := LocationInfo file_0 206 4 206 15. + Definition loc_75 : location_info := LocationInfo file_0 206 11 206 14. + Definition loc_76 : location_info := LocationInfo file_0 206 11 206 14. + Definition loc_77 : location_info := LocationInfo file_0 204 8 204 210. + Definition loc_78 : location_info := LocationInfo file_0 204 8 204 11. + Definition loc_79 : location_info := LocationInfo file_0 204 8 204 209. + Definition loc_80 : location_info := LocationInfo file_0 204 8 204 11. + Definition loc_81 : location_info := LocationInfo file_0 204 8 204 11. + Definition loc_82 : location_info := LocationInfo file_0 204 15 204 209. + Definition loc_83 : location_info := LocationInfo file_0 204 16 204 129. + Definition loc_84 : location_info := LocationInfo file_0 204 17 204 27. + Definition loc_85 : location_info := LocationInfo file_0 204 18 204 20. + Definition loc_86 : location_info := LocationInfo file_0 204 18 204 20. + Definition loc_87 : location_info := LocationInfo file_0 204 24 204 26. + Definition loc_88 : location_info := LocationInfo file_0 204 31 204 128. + Definition loc_89 : location_info := LocationInfo file_0 204 32 204 123. + Definition loc_90 : location_info := LocationInfo file_0 204 32 204 47. + Definition loc_91 : location_info := LocationInfo file_0 204 32 204 47. + Definition loc_92 : location_info := LocationInfo file_0 204 48 204 122. + Definition loc_93 : location_info := LocationInfo file_0 204 49 204 77. + Definition loc_94 : location_info := LocationInfo file_0 204 50 204 72. + Definition loc_95 : location_info := LocationInfo file_0 204 50 204 56. + Definition loc_96 : location_info := LocationInfo file_0 204 52 204 55. + Definition loc_97 : location_info := LocationInfo file_0 204 59 204 72. + Definition loc_98 : location_info := LocationInfo file_0 204 60 204 63. + Definition loc_99 : location_info := LocationInfo file_0 204 67 204 71. + Definition loc_100 : location_info := LocationInfo file_0 204 75 204 76. + Definition loc_101 : location_info := LocationInfo file_0 204 80 204 121. + Definition loc_102 : location_info := LocationInfo file_0 204 81 204 85. + Definition loc_103 : location_info := LocationInfo file_0 204 82 204 85. + Definition loc_104 : location_info := LocationInfo file_0 204 89 204 120. + Definition loc_105 : location_info := LocationInfo file_0 204 90 204 112. + Definition loc_106 : location_info := LocationInfo file_0 204 90 204 108. + Definition loc_107 : location_info := LocationInfo file_0 204 91 204 103. + Definition loc_108 : location_info := LocationInfo file_0 204 106 204 107. + Definition loc_109 : location_info := LocationInfo file_0 204 111 204 112. + Definition loc_110 : location_info := LocationInfo file_0 204 115 204 119. + Definition loc_111 : location_info := LocationInfo file_0 204 126 204 127. + Definition loc_112 : location_info := LocationInfo file_0 204 132 204 208. + Definition loc_113 : location_info := LocationInfo file_0 204 134 204 162. + Definition loc_114 : location_info := LocationInfo file_0 204 135 204 157. + Definition loc_115 : location_info := LocationInfo file_0 204 135 204 141. + Definition loc_116 : location_info := LocationInfo file_0 204 137 204 140. + Definition loc_117 : location_info := LocationInfo file_0 204 144 204 157. + Definition loc_118 : location_info := LocationInfo file_0 204 145 204 148. + Definition loc_119 : location_info := LocationInfo file_0 204 152 204 156. + Definition loc_120 : location_info := LocationInfo file_0 204 160 204 161. + Definition loc_121 : location_info := LocationInfo file_0 204 165 204 206. + Definition loc_122 : location_info := LocationInfo file_0 204 166 204 170. + Definition loc_123 : location_info := LocationInfo file_0 204 167 204 170. + Definition loc_124 : location_info := LocationInfo file_0 204 174 204 205. + Definition loc_125 : location_info := LocationInfo file_0 204 175 204 197. + Definition loc_126 : location_info := LocationInfo file_0 204 175 204 193. + Definition loc_127 : location_info := LocationInfo file_0 204 176 204 188. + Definition loc_128 : location_info := LocationInfo file_0 204 191 204 192. + Definition loc_129 : location_info := LocationInfo file_0 204 196 204 197. + Definition loc_130 : location_info := LocationInfo file_0 204 200 204 204. + Definition loc_132 : location_info := LocationInfo file_0 203 8 203 16. + Definition loc_133 : location_info := LocationInfo file_0 203 8 203 10. + Definition loc_134 : location_info := LocationInfo file_0 203 14 203 16. + Definition loc_135 : location_info := LocationInfo file_0 201 20 201 99. + Definition loc_136 : location_info := LocationInfo file_0 201 20 201 22. + Definition loc_137 : location_info := LocationInfo file_0 201 20 201 22. + Definition loc_138 : location_info := LocationInfo file_0 201 25 201 99. + Definition loc_139 : location_info := LocationInfo file_0 201 26 201 54. + Definition loc_140 : location_info := LocationInfo file_0 201 27 201 49. + Definition loc_141 : location_info := LocationInfo file_0 201 27 201 33. + Definition loc_142 : location_info := LocationInfo file_0 201 29 201 32. + Definition loc_143 : location_info := LocationInfo file_0 201 36 201 49. + Definition loc_144 : location_info := LocationInfo file_0 201 37 201 40. + Definition loc_145 : location_info := LocationInfo file_0 201 44 201 48. + Definition loc_146 : location_info := LocationInfo file_0 201 52 201 53. + Definition loc_147 : location_info := LocationInfo file_0 201 57 201 98. + Definition loc_148 : location_info := LocationInfo file_0 201 58 201 62. + Definition loc_149 : location_info := LocationInfo file_0 201 59 201 62. + Definition loc_150 : location_info := LocationInfo file_0 201 66 201 97. + Definition loc_151 : location_info := LocationInfo file_0 201 67 201 89. + Definition loc_152 : location_info := LocationInfo file_0 201 67 201 85. + Definition loc_153 : location_info := LocationInfo file_0 201 68 201 80. + Definition loc_154 : location_info := LocationInfo file_0 201 83 201 84. + Definition loc_155 : location_info := LocationInfo file_0 201 88 201 89. + Definition loc_156 : location_info := LocationInfo file_0 201 92 201 96. + Definition loc_161 : location_info := LocationInfo file_0 220 4 220 79. + Definition loc_162 : location_info := LocationInfo file_0 221 4 221 75. + Definition loc_163 : location_info := LocationInfo file_0 222 4 222 24. + Definition loc_164 : location_info := LocationInfo file_0 223 4 223 33. + Definition loc_165 : location_info := LocationInfo file_0 225 1 225 13. + Definition loc_166 : location_info := LocationInfo file_0 225 1 225 6. + Definition loc_167 : location_info := LocationInfo file_0 225 2 225 6. + Definition loc_168 : location_info := LocationInfo file_0 225 2 225 6. + Definition loc_169 : location_info := LocationInfo file_0 225 9 225 12. + Definition loc_170 : location_info := LocationInfo file_0 225 9 225 12. + Definition loc_171 : location_info := LocationInfo file_0 223 12 223 30. + Definition loc_172 : location_info := LocationInfo file_0 223 12 223 25. + Definition loc_173 : location_info := LocationInfo file_0 223 12 223 25. + Definition loc_174 : location_info := LocationInfo file_0 223 26 223 29. + Definition loc_175 : location_info := LocationInfo file_0 223 26 223 29. + Definition loc_176 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_177 : location_info := LocationInfo file_0 222 4 222 23. + Definition loc_178 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_179 : location_info := LocationInfo file_0 222 4 222 7. + Definition loc_180 : location_info := LocationInfo file_0 222 11 222 23. + Definition loc_181 : location_info := LocationInfo file_0 222 12 222 15. + Definition loc_182 : location_info := LocationInfo file_0 222 19 222 22. + Definition loc_183 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_184 : location_info := LocationInfo file_0 221 4 221 74. + Definition loc_185 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_186 : location_info := LocationInfo file_0 221 4 221 7. + Definition loc_187 : location_info := LocationInfo file_0 221 11 221 74. + Definition loc_188 : location_info := LocationInfo file_0 221 12 221 56. + Definition loc_189 : location_info := LocationInfo file_0 221 13 221 16. + Definition loc_190 : location_info := LocationInfo file_0 221 20 221 55. + Definition loc_191 : location_info := LocationInfo file_0 221 21 221 50. + Definition loc_192 : location_info := LocationInfo file_0 221 21 221 36. + Definition loc_193 : location_info := LocationInfo file_0 221 21 221 36. + Definition loc_194 : location_info := LocationInfo file_0 221 37 221 49. + Definition loc_195 : location_info := LocationInfo file_0 221 38 221 41. + Definition loc_196 : location_info := LocationInfo file_0 221 45 221 48. + Definition loc_197 : location_info := LocationInfo file_0 221 53 221 54. + Definition loc_198 : location_info := LocationInfo file_0 221 59 221 73. + Definition loc_199 : location_info := LocationInfo file_0 221 61 221 64. + Definition loc_200 : location_info := LocationInfo file_0 221 68 221 71. + Definition loc_201 : location_info := LocationInfo file_0 220 33 220 78. + Definition loc_202 : location_info := LocationInfo file_0 220 33 220 48. + Definition loc_203 : location_info := LocationInfo file_0 220 33 220 48. + Definition loc_204 : location_info := LocationInfo file_0 220 49 220 77. + Definition loc_205 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_206 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_207 : location_info := LocationInfo file_0 220 49 220 69. + Definition loc_208 : location_info := LocationInfo file_0 220 49 220 55. + Definition loc_209 : location_info := LocationInfo file_0 220 49 220 55. + Definition loc_210 : location_info := LocationInfo file_0 220 70 220 76. + Definition loc_211 : location_info := LocationInfo file_0 220 70 220 76. + Definition loc_214 : location_info := LocationInfo file_0 220 20 220 25. + Definition loc_215 : location_info := LocationInfo file_0 220 20 220 25. + Definition loc_216 : location_info := LocationInfo file_0 220 21 220 25. + Definition loc_217 : location_info := LocationInfo file_0 220 21 220 25. + Definition loc_222 : location_info := LocationInfo file_0 240 4 240 53. + Definition loc_223 : location_info := LocationInfo file_0 241 4 242 33. + Definition loc_224 : location_info := LocationInfo file_0 243 4 243 171. + Definition loc_225 : location_info := LocationInfo file_0 244 4 244 78. + Definition loc_226 : location_info := LocationInfo file_0 245 4 245 24. + Definition loc_227 : location_info := LocationInfo file_0 247 4 248 26. + Definition loc_228 : location_info := LocationInfo file_0 250 1 250 13. + Definition loc_229 : location_info := LocationInfo file_0 251 4 251 13. + Definition loc_230 : location_info := LocationInfo file_0 251 11 251 12. + Definition loc_231 : location_info := LocationInfo file_0 250 1 250 6. + Definition loc_232 : location_info := LocationInfo file_0 250 2 250 6. + Definition loc_233 : location_info := LocationInfo file_0 250 2 250 6. + Definition loc_234 : location_info := LocationInfo file_0 250 9 250 12. + Definition loc_235 : location_info := LocationInfo file_0 250 9 250 12. + Definition loc_236 : location_info := LocationInfo file_0 248 8 248 26. + Definition loc_237 : location_info := LocationInfo file_0 248 15 248 25. + Definition loc_238 : location_info := LocationInfo file_0 248 15 248 18. + Definition loc_239 : location_info := LocationInfo file_0 248 15 248 18. + Definition loc_240 : location_info := LocationInfo file_0 248 22 248 25. + Definition loc_241 : location_info := LocationInfo file_0 248 22 248 25. + Definition loc_243 : location_info := LocationInfo file_0 247 8 247 26. + Definition loc_244 : location_info := LocationInfo file_0 247 8 247 21. + Definition loc_245 : location_info := LocationInfo file_0 247 8 247 21. + Definition loc_246 : location_info := LocationInfo file_0 247 22 247 25. + Definition loc_247 : location_info := LocationInfo file_0 247 22 247 25. + Definition loc_248 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_249 : location_info := LocationInfo file_0 245 4 245 23. + Definition loc_250 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_251 : location_info := LocationInfo file_0 245 4 245 7. + Definition loc_252 : location_info := LocationInfo file_0 245 11 245 23. + Definition loc_253 : location_info := LocationInfo file_0 245 12 245 15. + Definition loc_254 : location_info := LocationInfo file_0 245 19 245 22. + Definition loc_255 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_256 : location_info := LocationInfo file_0 244 4 244 77. + Definition loc_257 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_258 : location_info := LocationInfo file_0 244 4 244 7. + Definition loc_259 : location_info := LocationInfo file_0 244 11 244 77. + Definition loc_260 : location_info := LocationInfo file_0 244 12 244 59. + Definition loc_261 : location_info := LocationInfo file_0 244 13 244 19. + Definition loc_262 : location_info := LocationInfo file_0 244 13 244 19. + Definition loc_263 : location_info := LocationInfo file_0 244 23 244 58. + Definition loc_264 : location_info := LocationInfo file_0 244 24 244 53. + Definition loc_265 : location_info := LocationInfo file_0 244 24 244 39. + Definition loc_266 : location_info := LocationInfo file_0 244 24 244 39. + Definition loc_267 : location_info := LocationInfo file_0 244 40 244 52. + Definition loc_268 : location_info := LocationInfo file_0 244 41 244 44. + Definition loc_269 : location_info := LocationInfo file_0 244 48 244 51. + Definition loc_270 : location_info := LocationInfo file_0 244 56 244 57. + Definition loc_271 : location_info := LocationInfo file_0 244 62 244 76. + Definition loc_272 : location_info := LocationInfo file_0 244 64 244 67. + Definition loc_273 : location_info := LocationInfo file_0 244 71 244 74. + Definition loc_274 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_275 : location_info := LocationInfo file_0 243 4 243 170. + Definition loc_276 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_277 : location_info := LocationInfo file_0 243 4 243 7. + Definition loc_278 : location_info := LocationInfo file_0 243 11 243 170. + Definition loc_279 : location_info := LocationInfo file_0 243 11 243 15. + Definition loc_280 : location_info := LocationInfo file_0 243 11 243 15. + Definition loc_281 : location_info := LocationInfo file_0 243 18 243 170. + Definition loc_282 : location_info := LocationInfo file_0 243 19 243 92. + Definition loc_283 : location_info := LocationInfo file_0 243 20 243 47. + Definition loc_284 : location_info := LocationInfo file_0 243 21 243 42. + Definition loc_285 : location_info := LocationInfo file_0 243 21 243 27. + Definition loc_286 : location_info := LocationInfo file_0 243 23 243 26. + Definition loc_287 : location_info := LocationInfo file_0 243 30 243 42. + Definition loc_288 : location_info := LocationInfo file_0 243 31 243 34. + Definition loc_289 : location_info := LocationInfo file_0 243 38 243 41. + Definition loc_290 : location_info := LocationInfo file_0 243 45 243 46. + Definition loc_291 : location_info := LocationInfo file_0 243 50 243 91. + Definition loc_292 : location_info := LocationInfo file_0 243 51 243 55. + Definition loc_293 : location_info := LocationInfo file_0 243 52 243 55. + Definition loc_294 : location_info := LocationInfo file_0 243 59 243 90. + Definition loc_295 : location_info := LocationInfo file_0 243 60 243 82. + Definition loc_296 : location_info := LocationInfo file_0 243 60 243 78. + Definition loc_297 : location_info := LocationInfo file_0 243 61 243 73. + Definition loc_298 : location_info := LocationInfo file_0 243 76 243 77. + Definition loc_299 : location_info := LocationInfo file_0 243 81 243 82. + Definition loc_300 : location_info := LocationInfo file_0 243 85 243 89. + Definition loc_301 : location_info := LocationInfo file_0 243 95 243 169. + Definition loc_302 : location_info := LocationInfo file_0 243 96 243 124. + Definition loc_303 : location_info := LocationInfo file_0 243 97 243 119. + Definition loc_304 : location_info := LocationInfo file_0 243 97 243 103. + Definition loc_305 : location_info := LocationInfo file_0 243 99 243 102. + Definition loc_306 : location_info := LocationInfo file_0 243 106 243 119. + Definition loc_307 : location_info := LocationInfo file_0 243 107 243 110. + Definition loc_308 : location_info := LocationInfo file_0 243 114 243 118. + Definition loc_309 : location_info := LocationInfo file_0 243 122 243 123. + Definition loc_310 : location_info := LocationInfo file_0 243 127 243 168. + Definition loc_311 : location_info := LocationInfo file_0 243 128 243 132. + Definition loc_312 : location_info := LocationInfo file_0 243 129 243 132. + Definition loc_313 : location_info := LocationInfo file_0 243 136 243 167. + Definition loc_314 : location_info := LocationInfo file_0 243 137 243 159. + Definition loc_315 : location_info := LocationInfo file_0 243 137 243 155. + Definition loc_316 : location_info := LocationInfo file_0 243 138 243 150. + Definition loc_317 : location_info := LocationInfo file_0 243 153 243 154. + Definition loc_318 : location_info := LocationInfo file_0 243 158 243 159. + Definition loc_319 : location_info := LocationInfo file_0 243 162 243 166. + Definition loc_320 : location_info := LocationInfo file_0 241 15 242 32. + Definition loc_321 : location_info := LocationInfo file_0 241 15 241 32. + Definition loc_322 : location_info := LocationInfo file_0 241 16 241 21. + Definition loc_323 : location_info := LocationInfo file_0 241 16 241 21. + Definition loc_324 : location_info := LocationInfo file_0 241 25 241 31. + Definition loc_325 : location_info := LocationInfo file_0 241 25 241 27. + Definition loc_326 : location_info := LocationInfo file_0 241 30 241 31. + Definition loc_327 : location_info := LocationInfo file_0 241 35 241 36. + Definition loc_328 : location_info := LocationInfo file_0 242 31 242 32. + Definition loc_331 : location_info := LocationInfo file_0 240 33 240 52. + Definition loc_332 : location_info := LocationInfo file_0 240 33 240 48. + Definition loc_333 : location_info := LocationInfo file_0 240 33 240 48. + Definition loc_334 : location_info := LocationInfo file_0 240 49 240 51. + Definition loc_335 : location_info := LocationInfo file_0 240 49 240 51. + Definition loc_338 : location_info := LocationInfo file_0 240 20 240 25. + Definition loc_339 : location_info := LocationInfo file_0 240 20 240 25. + Definition loc_340 : location_info := LocationInfo file_0 240 21 240 25. + Definition loc_341 : location_info := LocationInfo file_0 240 21 240 25. + Definition loc_346 : location_info := LocationInfo file_0 263 4 263 50. + Definition loc_347 : location_info := LocationInfo file_0 264 4 264 31. + Definition loc_348 : location_info := LocationInfo file_0 265 4 265 209. + Definition loc_349 : location_info := LocationInfo file_0 266 4 266 15. + Definition loc_350 : location_info := LocationInfo file_0 267 4 268 29. + Definition loc_351 : location_info := LocationInfo file_0 269 4 270 19. + Definition loc_352 : location_info := LocationInfo file_0 271 4 278 5. + Definition loc_353 : location_info := LocationInfo file_0 279 4 279 197. + Definition loc_354 : location_info := LocationInfo file_0 280 4 280 197. + Definition loc_355 : location_info := LocationInfo file_0 281 4 281 26. + Definition loc_356 : location_info := LocationInfo file_0 282 4 282 22. + Definition loc_357 : location_info := LocationInfo file_0 283 4 283 13. + Definition loc_358 : location_info := LocationInfo file_0 283 11 283 12. + Definition loc_359 : location_info := LocationInfo file_0 282 4 282 14. + Definition loc_360 : location_info := LocationInfo file_0 282 4 282 8. + Definition loc_361 : location_info := LocationInfo file_0 282 4 282 8. + Definition loc_362 : location_info := LocationInfo file_0 282 17 282 21. + Definition loc_363 : location_info := LocationInfo file_0 282 17 282 21. + Definition loc_364 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_365 : location_info := LocationInfo file_0 281 4 281 25. + Definition loc_366 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_367 : location_info := LocationInfo file_0 281 4 281 8. + Definition loc_368 : location_info := LocationInfo file_0 281 12 281 25. + Definition loc_369 : location_info := LocationInfo file_0 281 13 281 16. + Definition loc_370 : location_info := LocationInfo file_0 281 20 281 24. + Definition loc_371 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_372 : location_info := LocationInfo file_0 280 4 280 196. + Definition loc_373 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_374 : location_info := LocationInfo file_0 280 4 280 8. + Definition loc_375 : location_info := LocationInfo file_0 280 12 280 196. + Definition loc_376 : location_info := LocationInfo file_0 280 13 280 118. + Definition loc_377 : location_info := LocationInfo file_0 280 14 280 18. + Definition loc_378 : location_info := LocationInfo file_0 280 14 280 18. + Definition loc_379 : location_info := LocationInfo file_0 280 22 280 117. + Definition loc_380 : location_info := LocationInfo file_0 280 23 280 112. + Definition loc_381 : location_info := LocationInfo file_0 280 23 280 38. + Definition loc_382 : location_info := LocationInfo file_0 280 23 280 38. + Definition loc_383 : location_info := LocationInfo file_0 280 39 280 111. + Definition loc_384 : location_info := LocationInfo file_0 280 40 280 67. + Definition loc_385 : location_info := LocationInfo file_0 280 41 280 62. + Definition loc_386 : location_info := LocationInfo file_0 280 41 280 47. + Definition loc_387 : location_info := LocationInfo file_0 280 43 280 46. + Definition loc_388 : location_info := LocationInfo file_0 280 50 280 62. + Definition loc_389 : location_info := LocationInfo file_0 280 51 280 54. + Definition loc_390 : location_info := LocationInfo file_0 280 58 280 61. + Definition loc_391 : location_info := LocationInfo file_0 280 65 280 66. + Definition loc_392 : location_info := LocationInfo file_0 280 70 280 110. + Definition loc_393 : location_info := LocationInfo file_0 280 71 280 75. + Definition loc_394 : location_info := LocationInfo file_0 280 72 280 75. + Definition loc_395 : location_info := LocationInfo file_0 280 79 280 109. + Definition loc_396 : location_info := LocationInfo file_0 280 80 280 102. + Definition loc_397 : location_info := LocationInfo file_0 280 80 280 98. + Definition loc_398 : location_info := LocationInfo file_0 280 81 280 93. + Definition loc_399 : location_info := LocationInfo file_0 280 96 280 97. + Definition loc_400 : location_info := LocationInfo file_0 280 101 280 102. + Definition loc_401 : location_info := LocationInfo file_0 280 105 280 108. + Definition loc_402 : location_info := LocationInfo file_0 280 115 280 116. + Definition loc_403 : location_info := LocationInfo file_0 280 121 280 195. + Definition loc_404 : location_info := LocationInfo file_0 280 123 280 150. + Definition loc_405 : location_info := LocationInfo file_0 280 124 280 145. + Definition loc_406 : location_info := LocationInfo file_0 280 124 280 130. + Definition loc_407 : location_info := LocationInfo file_0 280 126 280 129. + Definition loc_408 : location_info := LocationInfo file_0 280 133 280 145. + Definition loc_409 : location_info := LocationInfo file_0 280 134 280 137. + Definition loc_410 : location_info := LocationInfo file_0 280 141 280 144. + Definition loc_411 : location_info := LocationInfo file_0 280 148 280 149. + Definition loc_412 : location_info := LocationInfo file_0 280 153 280 193. + Definition loc_413 : location_info := LocationInfo file_0 280 154 280 158. + Definition loc_414 : location_info := LocationInfo file_0 280 155 280 158. + Definition loc_415 : location_info := LocationInfo file_0 280 162 280 192. + Definition loc_416 : location_info := LocationInfo file_0 280 163 280 185. + Definition loc_417 : location_info := LocationInfo file_0 280 163 280 181. + Definition loc_418 : location_info := LocationInfo file_0 280 164 280 176. + Definition loc_419 : location_info := LocationInfo file_0 280 179 280 180. + Definition loc_420 : location_info := LocationInfo file_0 280 184 280 185. + Definition loc_421 : location_info := LocationInfo file_0 280 188 280 191. + Definition loc_422 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_423 : location_info := LocationInfo file_0 279 4 279 196. + Definition loc_424 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_425 : location_info := LocationInfo file_0 279 4 279 8. + Definition loc_426 : location_info := LocationInfo file_0 279 12 279 196. + Definition loc_427 : location_info := LocationInfo file_0 279 13 279 118. + Definition loc_428 : location_info := LocationInfo file_0 279 14 279 18. + Definition loc_429 : location_info := LocationInfo file_0 279 14 279 18. + Definition loc_430 : location_info := LocationInfo file_0 279 22 279 117. + Definition loc_431 : location_info := LocationInfo file_0 279 23 279 112. + Definition loc_432 : location_info := LocationInfo file_0 279 23 279 38. + Definition loc_433 : location_info := LocationInfo file_0 279 23 279 38. + Definition loc_434 : location_info := LocationInfo file_0 279 39 279 111. + Definition loc_435 : location_info := LocationInfo file_0 279 40 279 67. + Definition loc_436 : location_info := LocationInfo file_0 279 41 279 62. + Definition loc_437 : location_info := LocationInfo file_0 279 41 279 47. + Definition loc_438 : location_info := LocationInfo file_0 279 43 279 46. + Definition loc_439 : location_info := LocationInfo file_0 279 50 279 62. + Definition loc_440 : location_info := LocationInfo file_0 279 51 279 54. + Definition loc_441 : location_info := LocationInfo file_0 279 58 279 61. + Definition loc_442 : location_info := LocationInfo file_0 279 65 279 66. + Definition loc_443 : location_info := LocationInfo file_0 279 70 279 110. + Definition loc_444 : location_info := LocationInfo file_0 279 71 279 75. + Definition loc_445 : location_info := LocationInfo file_0 279 72 279 75. + Definition loc_446 : location_info := LocationInfo file_0 279 79 279 109. + Definition loc_447 : location_info := LocationInfo file_0 279 80 279 102. + Definition loc_448 : location_info := LocationInfo file_0 279 80 279 98. + Definition loc_449 : location_info := LocationInfo file_0 279 81 279 93. + Definition loc_450 : location_info := LocationInfo file_0 279 96 279 97. + Definition loc_451 : location_info := LocationInfo file_0 279 101 279 102. + Definition loc_452 : location_info := LocationInfo file_0 279 105 279 108. + Definition loc_453 : location_info := LocationInfo file_0 279 115 279 116. + Definition loc_454 : location_info := LocationInfo file_0 279 121 279 195. + Definition loc_455 : location_info := LocationInfo file_0 279 123 279 150. + Definition loc_456 : location_info := LocationInfo file_0 279 124 279 145. + Definition loc_457 : location_info := LocationInfo file_0 279 124 279 130. + Definition loc_458 : location_info := LocationInfo file_0 279 126 279 129. + Definition loc_459 : location_info := LocationInfo file_0 279 133 279 145. + Definition loc_460 : location_info := LocationInfo file_0 279 134 279 137. + Definition loc_461 : location_info := LocationInfo file_0 279 141 279 144. + Definition loc_462 : location_info := LocationInfo file_0 279 148 279 149. + Definition loc_463 : location_info := LocationInfo file_0 279 153 279 193. + Definition loc_464 : location_info := LocationInfo file_0 279 154 279 158. + Definition loc_465 : location_info := LocationInfo file_0 279 155 279 158. + Definition loc_466 : location_info := LocationInfo file_0 279 162 279 192. + Definition loc_467 : location_info := LocationInfo file_0 279 163 279 185. + Definition loc_468 : location_info := LocationInfo file_0 279 163 279 181. + Definition loc_469 : location_info := LocationInfo file_0 279 164 279 176. + Definition loc_470 : location_info := LocationInfo file_0 279 179 279 180. + Definition loc_471 : location_info := LocationInfo file_0 279 184 279 185. + Definition loc_472 : location_info := LocationInfo file_0 279 188 279 191. + Definition loc_473 : location_info := LocationInfo file_0 271 35 276 5. + Definition loc_474 : location_info := LocationInfo file_0 272 8 273 23. + Definition loc_475 : location_info := LocationInfo file_0 274 8 275 23. + Definition loc_476 : location_info := LocationInfo file_0 275 12 275 23. + Definition loc_477 : location_info := LocationInfo file_0 275 19 275 22. + Definition loc_478 : location_info := LocationInfo file_0 275 20 275 22. + Definition loc_480 : location_info := LocationInfo file_0 274 12 274 18. + Definition loc_481 : location_info := LocationInfo file_0 274 12 274 18. + Definition loc_482 : location_info := LocationInfo file_0 273 12 273 23. + Definition loc_483 : location_info := LocationInfo file_0 273 19 273 22. + Definition loc_484 : location_info := LocationInfo file_0 273 20 273 22. + Definition loc_486 : location_info := LocationInfo file_0 272 12 272 37. + Definition loc_487 : location_info := LocationInfo file_0 272 12 272 16. + Definition loc_488 : location_info := LocationInfo file_0 272 12 272 16. + Definition loc_489 : location_info := LocationInfo file_0 272 19 272 37. + Definition loc_490 : location_info := LocationInfo file_0 276 11 278 5. + Definition loc_491 : location_info := LocationInfo file_0 277 8 277 30. + Definition loc_492 : location_info := LocationInfo file_0 277 8 277 12. + Definition loc_493 : location_info := LocationInfo file_0 277 8 277 29. + Definition loc_494 : location_info := LocationInfo file_0 277 8 277 12. + Definition loc_495 : location_info := LocationInfo file_0 277 8 277 12. + Definition loc_496 : location_info := LocationInfo file_0 277 16 277 29. + Definition loc_497 : location_info := LocationInfo file_0 277 17 277 20. + Definition loc_498 : location_info := LocationInfo file_0 277 24 277 28. + Definition loc_499 : location_info := LocationInfo file_0 271 8 271 33. + Definition loc_500 : location_info := LocationInfo file_0 271 8 271 12. + Definition loc_501 : location_info := LocationInfo file_0 271 8 271 12. + Definition loc_502 : location_info := LocationInfo file_0 271 15 271 33. + Definition loc_503 : location_info := LocationInfo file_0 270 8 270 19. + Definition loc_504 : location_info := LocationInfo file_0 270 15 270 18. + Definition loc_505 : location_info := LocationInfo file_0 270 16 270 18. + Definition loc_507 : location_info := LocationInfo file_0 269 8 269 36. + Definition loc_509 : location_info := LocationInfo file_0 269 9 269 36. + Definition loc_510 : location_info := LocationInfo file_0 269 10 269 14. + Definition loc_511 : location_info := LocationInfo file_0 269 10 269 14. + Definition loc_512 : location_info := LocationInfo file_0 269 17 269 35. + Definition loc_513 : location_info := LocationInfo file_0 267 13 268 28. + Definition loc_514 : location_info := LocationInfo file_0 267 13 267 40. + Definition loc_515 : location_info := LocationInfo file_0 267 14 267 18. + Definition loc_516 : location_info := LocationInfo file_0 267 14 267 18. + Definition loc_517 : location_info := LocationInfo file_0 267 21 267 39. + Definition loc_518 : location_info := LocationInfo file_0 267 43 267 44. + Definition loc_519 : location_info := LocationInfo file_0 268 27 268 28. + Definition loc_522 : location_info := LocationInfo file_0 266 13 266 14. + Definition loc_525 : location_info := LocationInfo file_0 265 21 265 208. + Definition loc_526 : location_info := LocationInfo file_0 265 22 265 130. + Definition loc_527 : location_info := LocationInfo file_0 265 23 265 30. + Definition loc_528 : location_info := LocationInfo file_0 265 23 265 30. + Definition loc_529 : location_info := LocationInfo file_0 265 34 265 129. + Definition loc_530 : location_info := LocationInfo file_0 265 35 265 124. + Definition loc_531 : location_info := LocationInfo file_0 265 35 265 50. + Definition loc_532 : location_info := LocationInfo file_0 265 35 265 50. + Definition loc_533 : location_info := LocationInfo file_0 265 51 265 123. + Definition loc_534 : location_info := LocationInfo file_0 265 52 265 79. + Definition loc_535 : location_info := LocationInfo file_0 265 53 265 74. + Definition loc_536 : location_info := LocationInfo file_0 265 53 265 59. + Definition loc_537 : location_info := LocationInfo file_0 265 55 265 58. + Definition loc_538 : location_info := LocationInfo file_0 265 62 265 74. + Definition loc_539 : location_info := LocationInfo file_0 265 63 265 66. + Definition loc_540 : location_info := LocationInfo file_0 265 70 265 73. + Definition loc_541 : location_info := LocationInfo file_0 265 77 265 78. + Definition loc_542 : location_info := LocationInfo file_0 265 82 265 122. + Definition loc_543 : location_info := LocationInfo file_0 265 83 265 87. + Definition loc_544 : location_info := LocationInfo file_0 265 84 265 87. + Definition loc_545 : location_info := LocationInfo file_0 265 91 265 121. + Definition loc_546 : location_info := LocationInfo file_0 265 92 265 114. + Definition loc_547 : location_info := LocationInfo file_0 265 92 265 110. + Definition loc_548 : location_info := LocationInfo file_0 265 93 265 105. + Definition loc_549 : location_info := LocationInfo file_0 265 108 265 109. + Definition loc_550 : location_info := LocationInfo file_0 265 113 265 114. + Definition loc_551 : location_info := LocationInfo file_0 265 117 265 120. + Definition loc_552 : location_info := LocationInfo file_0 265 127 265 128. + Definition loc_553 : location_info := LocationInfo file_0 265 133 265 207. + Definition loc_554 : location_info := LocationInfo file_0 265 135 265 162. + Definition loc_555 : location_info := LocationInfo file_0 265 136 265 157. + Definition loc_556 : location_info := LocationInfo file_0 265 136 265 142. + Definition loc_557 : location_info := LocationInfo file_0 265 138 265 141. + Definition loc_558 : location_info := LocationInfo file_0 265 145 265 157. + Definition loc_559 : location_info := LocationInfo file_0 265 146 265 149. + Definition loc_560 : location_info := LocationInfo file_0 265 153 265 156. + Definition loc_561 : location_info := LocationInfo file_0 265 160 265 161. + Definition loc_562 : location_info := LocationInfo file_0 265 165 265 205. + Definition loc_563 : location_info := LocationInfo file_0 265 166 265 170. + Definition loc_564 : location_info := LocationInfo file_0 265 167 265 170. + Definition loc_565 : location_info := LocationInfo file_0 265 174 265 204. + Definition loc_566 : location_info := LocationInfo file_0 265 175 265 197. + Definition loc_567 : location_info := LocationInfo file_0 265 175 265 193. + Definition loc_568 : location_info := LocationInfo file_0 265 176 265 188. + Definition loc_569 : location_info := LocationInfo file_0 265 191 265 192. + Definition loc_570 : location_info := LocationInfo file_0 265 196 265 197. + Definition loc_571 : location_info := LocationInfo file_0 265 200 265 203. + Definition loc_574 : location_info := LocationInfo file_0 264 16 264 30. + Definition loc_575 : location_info := LocationInfo file_0 264 16 264 22. + Definition loc_576 : location_info := LocationInfo file_0 264 16 264 22. + Definition loc_577 : location_info := LocationInfo file_0 264 25 264 26. + Definition loc_578 : location_info := LocationInfo file_0 264 29 264 30. + Definition loc_581 : location_info := LocationInfo file_0 263 19 263 49. + Definition loc_582 : location_info := LocationInfo file_0 263 19 263 23. + Definition loc_583 : location_info := LocationInfo file_0 263 19 263 23. + Definition loc_584 : location_info := LocationInfo file_0 263 26 263 49. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 6e6250f7..536dd966 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -7,6 +7,10 @@ Set Default Proof Using "Type". Section spec. Context `{!typeG Σ} `{!globalG Σ}. + (* Inlined code. *) + + Open Scope bitvec_scope. + (* Definition of type [kvm_pgtable_mm_ops]. *) Definition kvm_pgtable_mm_ops_rec : (mm_ops -d> typeO) → (mm_ops -d> typeO) := (λ self ops, struct struct_kvm_pgtable_mm_ops [@{type} @@ -62,32 +66,32 @@ Section spec. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := fn(∀ pte : (bvec Pte); (pte @ (bitvec (Pte))); True) - → ∃ () : (), ((pte[valid]) @ (boolean (bool_it))); True. + → ∃ () : (), ((pte.[valid]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : (bvec Pte) * Z; (pte @ (bitvec (Pte))), (level @ (int (u32))); True) - → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte[valid] && pte[page_or_table]) @ (boolean (bool_it))); True. + → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := fn(∀ (pte, p) : (bvec Pte) * loc; (p @ (&own (pte @ (bitvec (Pte))))); True) - → ∃ () : (), (void); (p ◁ₗ ((pte[valid := false]) @ (bitvec (Pte)))). + → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (bitvec (Pte)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ () : (), ((0%%Pte[addr := pa%%Pte[addr]]) @ (bitvec (Pte))); True. + → ∃ () : (), ((0%%Pte.[addr := pa%%Pte.[addr]]) @ (bitvec (Pte))); True. (* Specifications for function [kvm_set_table_pte]. *) Definition type_of_kvm_set_table_pte := - fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * (bvec Pte) * Z * mm_ops; (p @ (&own (pte @ (bitvec (Pte))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte[valid] = true⌝) - → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte[addr := pa%%Pte[addr]; page_or_table := true; valid := true]) @ (bitvec (Pte)))). + fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * (bvec Pte) * Z * mm_ops; (p @ (&own (pte @ (bitvec (Pte))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte.[valid] = true⌝) + → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]) @ (bitvec (Pte)))). (* Specifications for function [kvm_set_valid_leaf_pte]. *) Definition type_of_kvm_set_valid_leaf_pte := fn(∀ (p, pte, pa, attr, level) : loc * (bvec Pte) * Z * (bvec Pte) * Z; (p @ (&own (pte @ (bitvec (Pte))))), (pa @ (int (u64))), (attr @ (bitvec (Pte))), (level @ (int (u32))); True) - → ∃ (is_page, pte1) : bool * (bvec Pte), ((if pte[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte[addr := pa%%Pte[addr]; leaf_attr_lo := attr[leaf_attr_lo]; leaf_attr_hi := attr[leaf_attr_hi]][page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte[valid] then pte else pte1) @ (bitvec (Pte)))). + → ∃ (is_page, pte1) : bool * (bvec Pte), ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (bitvec (Pte)))). (* Function [hyp_map_set_prot_attr] has been skipped. *) End spec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index ce0fee92..12121a14 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -21,3 +21,4 @@ Definition leaf_attr_lo : fin 6 := 2%fin. (* 2..11 *) Definition addr : fin 6 := 3%fin. (* 12..47 *) (* 48..50 : undef *) Definition leaf_attr_hi : fin 6 := 5%fin. (* 51..63 *) + diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index f1ebf74f..3dac962b 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -41,16 +41,16 @@ Fixpoint length_fields (l : list field_desc) : nat := Lemma length_fields_take l i fd : l !! i = Some fd → - length_fields (take i l) + fd_len fd ≤ length_fields l. + (length_fields (take i l) + fd_len fd ≤ length_fields l)%nat. Proof. move: i. induction l as [|x l IH]; first done. destruct i; move => ?. - have -> : x = fd by naive_solver. - simpl. lia. + cbn. lia. - have Hl : l !! i = Some fd by naive_solver. have := IH i Hl. - simpl. lia. + cbn. lia. Qed. Record bitvec_type := @@ -69,109 +69,168 @@ Definition bt_layout (bt : bitvec_type) : layout := {| Definition bvec (bt : bitvec_type) : Type := vec bool (bt_length bt). -(* TODO: vec version may simplify vslice, vinsert *) -Fixpoint indices (n : nat) : list nat := - match n with - | O => [] - | S n' => indices n' ++ [n'] - end. +Section vec. + + Fixpoint vec_take {A n} k (Hk : (k ≤ n)%nat) (v : vec A n) : vec A k. + Proof. + destruct k as [|k']. + - refine [#]. + - destruct n as [|n']. + + have ? : ¬ (S k' ≤ 0)%nat by lia. + contradiction. + + inversion v as [|x ? v']. simplify_eq. + have Hk' : (k' ≤ n')%nat by lia. + refine (x ::: vec_take _ _ _ Hk' v'). + Defined. + + Fixpoint vec_drop {A n} k (Hk : (k ≤ n)%nat) (v : vec A n) : vec A (n - k). + Proof. + destruct k as [|k']. + - have -> : (n - 0 = n)%nat by lia. + refine v. + - destruct n as [|n']. + + have ? : ¬ (S k' ≤ 0)%nat by lia. + contradiction. + + inversion v as [|_ ? v']. simplify_eq. + have Hk' : (k' ≤ n')%nat by lia. + refine (vec_drop _ _ _ Hk' v'). + Defined. + + Fixpoint vec_split {A k m} (v : vec A (k * m)) : vec (vec A k) m. + Proof. + destruct m as [|m']. + - refine [#]. + - have Hk : (k ≤ k * S m')%nat by lia. + have v1 := vec_take _ Hk v. + have v2 := vec_drop _ Hk v. + have Hn' : (k * S m' - k = k * m')%nat by lia. + rewrite Hn' in v2. + refine (v1 ::: vec_split _ _ _ v2). + Defined. + + Record vec_range (n : nat) (len : nat) := + VecRange { + range_start : nat; + range_in_bound : (range_start + len ≤ n)%nat; + }. + + Definition vec_slice {A n k} (v : vec A n) (r : vec_range n k) : vec A k. + Proof. + destruct r as [i Hin]. + have v1 := vec_take _ Hin v. + have Hi : (i ≤ i + k)%nat by lia. + have v2 := vec_drop _ Hi v1. + have -> : (k = i + k - i)%nat by lia. + refine v2. + Defined. + + Definition vec_update {A n k} (v : vec A n) (u : vec A k) (r : vec_range n k) : vec A n. + Proof. + destruct r as [i Hin]. + have Hi : (i ≤ n)%nat by lia. + have v1 := vec_take _ Hi v. + have v2 := vec_drop _ Hin v. + have v' := v1 +++ u +++ v2. + have -> : (n = i + (k + (n - (i + k))))%nat by lia. + refine v'. + Defined. + + Definition vec_rev {A n} (v : vec A n) : vec A n. + Proof. + have v' := list_to_vec (rev (vec_to_list v)). + rewrite rev_length vec_to_list_length in v'. + refine v'. + Defined. + +End vec. + +Section bool_vec. + + (* Assume `v` is Big-Endian .*) + Fixpoint Z_of_bool_vec_BE {n} (v : vec bool n) : Z := + match v with + | [#] => 0 + | true ::: v' => 2 ^ (n - 1) + Z_of_bool_vec_BE v' + | false ::: v' => Z_of_bool_vec_BE v' + end. + + Lemma Z_of_bool_vec_BE_in_range n (v : vec bool n) : + -1 < Z_of_bool_vec_BE v < 2 ^ n. + Proof. + induction v as [|[|] n v [? ?]]; cbn; split; try lia. + - suff : 0 < 2 ^ (S n - 1) by lia. + apply Z.pow_pos_nonneg; lia. + - suff : 2 ^ (S n - 1) + 2 ^ n ≤ 2 ^ S n by lia. + have -> : S n - 1 = n by lia. + have -> : 2 ^ S n = 2 ^ (n + 1) by lia. + rewrite Zpower_exp; lia. + - suff : 2 ^ n < 2 ^ S n by lia. + apply Z.pow_lt_mono_r; lia. + Qed. + + (* By default: `v` is Small-Endian. *) + Definition byte_of_bool_vec (v : vec bool 8) : byte := {| + byte_val := Z_of_bool_vec_BE (vec_rev v); + byte_constr := Z_of_bool_vec_BE_in_range _ _; + |}. -Definition Z_of_bool_vec {n} (v : vec bool n) : Z := - list_sum (zip_with (λ i (b : bool), (if b then 2 ^ i else 0)%nat) (indices n) v). + Definition val_of_bool_vec {sz} (v : vec bool (8 * sz)) : val := + map (MByte ∘ byte_of_bool_vec) (vec_split v). -Lemma Z_of_bool_vec_in_range {n} (v : vec bool n) : - -1 < Z_of_bool_vec v < 2 ^ n. -Admitted. + Lemma val_of_bool_vec_length {sz} (v : vec bool (8 * sz)) : + length (val_of_bool_vec v) = sz. + Proof. + by rewrite map_length vec_to_list_length. + Qed. -Fixpoint val_of_bool_vec {sz} (v : vec bool (8 * sz)) : val. -Proof. - destruct sz as [|sz]. - - refine []. - - have H8 : (8 < 8 * S sz)%nat. admit. - (* Wrong. 8 ≤ 8 * S sz. So we need a `vtake` that can take all elements. *) - (* have n := Z_of_bool_vec (vtake (nat_to_fin H8) v). *) - have Hn := Z_of_bool_vec_in_range (vtake (nat_to_fin H8) v). - have H256 : 2 ^ (nat_to_fin H8) = 256. admit. - rewrite H256 in Hn. - have v2 := vdrop (nat_to_fin H8) v. - have Heq : (8 * S sz - nat_to_fin H8 = 8 * sz)%nat. admit. - rewrite Heq in v2. - refine (MByte {| - byte_val := Z_of_bool_vec (vtake (nat_to_fin H8) v); - byte_constr := Hn; - |} :: val_of_bool_vec sz v2). -Admitted. + Fixpoint Z_slice (i len : nat) (n : Z) : vec bool len := + match len with + | O => [#] + | S k => Z.testbit n i ::: Z_slice (S i) k n + end. -Lemma val_of_bool_vec_length {sz} (v : vec bool (8 * sz)) : - length (val_of_bool_vec v) = sz. -Admitted. +End bool_vec. -Fixpoint Z_slice (i len : nat) (n : Z) : vec bool len := - match len with - | O => [#] - | S k => Z.testbit n i ::: Z_slice (S i) k n - end. +Section bitvec_op. -Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bvec bt := - Z_slice 0 (bt_length bt) n. -Notation "n %% bt" := (Z_as_bvec bt n) (at level 5, format "n %% bt"). + Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bvec bt := + Z_slice 0 (bt_length bt) n. -Record vec_range (n : nat) (len : nat) := - VecRange { - range_start : nat; - range_in_bound : range_start + len ≤ n; - }. + Program Definition fd_range (bt : bitvec_type) (i : fin (bt_fields bt)) : vec_range (bt_length bt) (fd_len (bt_spec bt !!! i)) := + {| range_start := length_fields (take i (bt_spec bt)) |}. + Next Obligation. + move => ? ?. + rewrite bt_length_eq. + by apply length_fields_take, vlookup_lookup. + Qed. -Definition vslice {A n len} (v : vec A n) (r : vec_range n len) : vec A len. -Proof. - destruct r as [i Hin]. - induction len as [|k IHk]. - - refine [#]. - - have Hlt : (i < n)%nat by lia. - refine ((v !!! nat_to_fin Hlt) ::: (IHk ltac:(lia))). -Qed. + (* TODO: maybe not needed? *) + (* Global Instance bvec_eq_dec {bt : bitvec_type} : EqDecision (bvec bt). *) + (* Proof. solve_decision. Qed. *) -Definition vupdate {A n len} (v : vec A n) (u : vec A len) (r : vec_range n len) : vec A n. -Proof. - destruct r as [i Hin]. - induction len as [|k IHk]. - - refine v. - - have Hlt : (i < n)%nat by lia. - refine ( - let u0 := vec_S_inv (λ _, _) (λ x _, x) u in - let u1 := vec_S_inv (λ _, _) (λ _ v, v) u in - vinsert (nat_to_fin Hlt) u0 (IHk u1 ltac:(lia)) - ). -Qed. + Definition bvec_get {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) : fd_type (bt_spec bt !!! i) := + fd_decode (bt_spec bt !!! i) (vec_slice bv (fd_range bt i)). -Program Definition fd_range (bt : bitvec_type) (i : fin (bt_fields bt)) : vec_range (bt_length bt) (fd_len (bt_spec bt !!! i)) := - {| range_start := length_fields (take i (bt_spec bt)) |}. -Next Obligation. - move => ? ?. - rewrite bt_length_eq. - by apply length_fields_take, vlookup_lookup. -Qed. + Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt := + vec_update bv (fd_encode (bt_spec bt !!! i) x) (fd_range bt i). -(* TODO: maybe not needed? *) -(* Global Instance bvec_eq_dec {bt : bitvec_type} : EqDecision (bvec bt). *) -(* Proof. solve_decision. Qed. *) +End bitvec_op. -Definition bvec_get {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) : fd_type (bt_spec bt !!! i) := - fd_decode (bt_spec bt !!! i) (vslice bv (fd_range bt i)). +Declare Scope bitvec_scope. -Notation "bv [ i ]" := (bvec_get bv i) (at level 5, format "bv [ i ]"). +Notation "n %% bt" := (Z_as_bvec bt n) (at level 5, format "n %% bt") : bitvec_scope. -Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt := - vupdate bv (fd_encode (bt_spec bt !!! i) x) (fd_range bt i). +Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]") : bitvec_scope. -Notation "bv [ i := x ]" := (bvec_put bv i x) - (at level 5, format "bv [ i := x ]"). +Notation "bv .[ i := x ]" := (bvec_put bv i x) + (at level 5, format "bv .[ i := x ]") : bitvec_scope. -Notation "bv [ i1 := x1 ; i2 := x2 ]" := (bvec_put (bvec_put bv i1 x1) i2 x2) - (at level 5, format "bv [ i1 := x1 ; i2 := x2 ]"). +Notation "bv .[ i1 := x1 ; i2 := x2 ]" := (bvec_put (bvec_put bv i1 x1) i2 x2) + (at level 5, format "bv .[ i1 := x1 ; i2 := x2 ]") : bitvec_scope. -Notation "bv [ i1 := x1 ; i2 := x2 ; i3 := x3 ]" := (bvec_put (bvec_put (bvec_put bv i1 x1) i2 x2) i3 x3) - (at level 5, format "bv [ i1 := x1 ; i2 := x2 ; i3 := x3 ]"). +Notation "bv .[ i1 := x1 ; i2 := x2 ; i3 := x3 ]" := + (bvec_put (bvec_put (bvec_put bv i1 x1) i2 x2) i3 x3) + (at level 5, format "bv .[ i1 := x1 ; i2 := x2 ; i3 := x3 ]") : bitvec_scope. (* Lemma bvec_get_put {bt : bitvec_type} (bv : bvec bt) i x : bv[i := x][i] = x. @@ -221,3 +280,66 @@ Section bitvec. End bitvec. Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. + +(* +(* The `≤` version of `fin` *) +Inductive Fin : nat → Set := + | FinO n : Fin n + | FinS n : Fin n → Fin (S n) + . + +Arguments FinO {_}. +Arguments FinS {_} _. + +Fixpoint Fin_to_nat {n} (k : Fin n) : nat := + match k with + | FinO => O + | FinS k => S (Fin_to_nat k) + end. + +Coercion Fin_to_nat : Fin >-> nat. + +Fixpoint vec_take {A n} (k : Fin n) : vec A n → vec A k := + match k with + | FinO => λ _, [#] + | FinS k => vec_S_inv _ (λ x v, x ::: vec_take k v) + end. + +Definition vec_id {A n} : vec A n → vec A (n - 0). +Proof. + move => v. + rewrite Nat.sub_0_r. + refine v. +Qed. + +Fixpoint vec_drop {A n} (k : Fin n) : vec A n → vec A (n - k) := + match k in Fin n return vec A n → vec A (n - k) with + | FinO => vec_id + | FinS k => vec_S_inv _ (λ _, vec_drop k) + end. + +Definition vec_split_at {A n} (k : Fin n) (v : vec A n) : vec A k * vec A (n - k) := + (vec_take k v, vec_drop k v). + +Fixpoint nat_to_Fin (p n : nat) : p ≤ n → Fin n. +Admitted. + +Fixpoint vec_split {m n} : vec bool (m * n) → vec (vec bool m) n. +Proof. + move => v. + induction n as [|n' IHn']. + - refine [#]. + - have Fm := (nat_to_Fin m (m * S n') ltac:(lia)). + have v1 := vec_take Fm v. + have v2 := vec_drop Fm v. + have Heq : m * S n' - (nat_to_Fin Fm) = m * n' by lia. + rewrite Heq in v2. + + match n return vec bool (m * n) → vec (vec bool m) n with + | O => λ _, [#] + | S k => λ v, + let in + let v1 := vec_take Fm v in + let v2 := vec_drop Fm v in + v1 ::: vec_split v2 + end. *) -- GitLab From c263c4f2af6cf919178ed027e8b11474ca17683b Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 22 Mar 2021 17:25:02 +0800 Subject: [PATCH 08/71] bitvec is Copyable --- theories/typing/bitvec.v | 72 +++++----------------------------------- 1 file changed, 8 insertions(+), 64 deletions(-) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 3dac962b..949deb24 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -277,69 +277,13 @@ Section bitvec. Next Obligation. iIntros (it bv l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. Next Obligation. iIntros (bt x1 x2). done. Qed. -End bitvec. + Global Program Instance bitvec_copyable bt v : Copyable (v @ bitvec bt). + Next Obligation. + iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". + iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. + iExists _, _. iFrame. iModIntro. iSplit => //. + by iIntros "_". + Qed. +End bitvec. Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. - -(* -(* The `≤` version of `fin` *) -Inductive Fin : nat → Set := - | FinO n : Fin n - | FinS n : Fin n → Fin (S n) - . - -Arguments FinO {_}. -Arguments FinS {_} _. - -Fixpoint Fin_to_nat {n} (k : Fin n) : nat := - match k with - | FinO => O - | FinS k => S (Fin_to_nat k) - end. - -Coercion Fin_to_nat : Fin >-> nat. - -Fixpoint vec_take {A n} (k : Fin n) : vec A n → vec A k := - match k with - | FinO => λ _, [#] - | FinS k => vec_S_inv _ (λ x v, x ::: vec_take k v) - end. - -Definition vec_id {A n} : vec A n → vec A (n - 0). -Proof. - move => v. - rewrite Nat.sub_0_r. - refine v. -Qed. - -Fixpoint vec_drop {A n} (k : Fin n) : vec A n → vec A (n - k) := - match k in Fin n return vec A n → vec A (n - k) with - | FinO => vec_id - | FinS k => vec_S_inv _ (λ _, vec_drop k) - end. - -Definition vec_split_at {A n} (k : Fin n) (v : vec A n) : vec A k * vec A (n - k) := - (vec_take k v, vec_drop k v). - -Fixpoint nat_to_Fin (p n : nat) : p ≤ n → Fin n. -Admitted. - -Fixpoint vec_split {m n} : vec bool (m * n) → vec (vec bool m) n. -Proof. - move => v. - induction n as [|n' IHn']. - - refine [#]. - - have Fm := (nat_to_Fin m (m * S n') ltac:(lia)). - have v1 := vec_take Fm v. - have v2 := vec_drop Fm v. - have Heq : m * S n' - (nat_to_Fin Fm) = m * n' by lia. - rewrite Heq in v2. - - match n return vec bool (m * n) → vec (vec bool m) n with - | O => λ _, [#] - | S k => λ v, - let in - let v1 := vec_take Fm v in - let v2 := vec_drop Fm v in - v1 ::: vec_split v2 - end. *) -- GitLab From b93bb594cbd975c81189ce7cec3f528863992065 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 31 Mar 2021 15:14:37 +0800 Subject: [PATCH 09/71] try adding typing rules for bits --- linux/casestudies/pgtable.c | 138 +- .../proofs/pgtable/generated_code.v | 1169 ++++++----------- .../proofs/pgtable/generated_proof_BIT.v | 1 + .../pgtable/generated_proof_FIELD_GET.v | 1 + .../pgtable/generated_proof_FIELD_PREP.v | 1 + .../proofs/pgtable/generated_proof_GENMASK.v | 1 + .../generated_proof_hyp_map_set_prot_attr.v | 1 - .../proofs/pgtable/generated_spec.v | 40 +- .../proofs/pgtable/pgtable_lemmas.v | 24 +- linux/casestudies/proofs/pgtable/proof_files | 5 +- theories/typing/binary.v | 188 +++ theories/typing/bitvec.v | 728 +++++++++- 12 files changed, 1415 insertions(+), 882 deletions(-) create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_BIT.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_FIELD_GET.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_FIELD_PREP.v create mode 100644 linux/casestudies/proofs/pgtable/generated_proof_GENMASK.v delete mode 100644 linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v create mode 100644 theories/typing/binary.v diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index ca3b1757..2374eaad 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -16,14 +16,33 @@ typedef uint32_t u32; /* linux/bits.h */ -#define BIT(N) (1UL << (N)) +// #define BIT(i) (1UL << (i)) +[[rc::parameters("i : nat")]] +[[rc::args("i @ int")]] +[[rc::requires("{i < 64}")]] +[[rc::returns("{(i, 1)%nat} @ bmask")]] +[[rc::trust_me]] +u64 BIT(int i) +{ + return (1UL << (i)); +} + /* * Create a contiguous bitmask starting at bit position @l and ending at * position @h. For example * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. */ -#define GENMASK(h, l) \ +// #define GENMASK(h, l) \ (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) +[[rc::parameters("h : nat", "l : nat")]] +[[rc::args("h @ int", "l @ int")]] +[[rc::requires("{h < 64}", "{l <= h}")]] +[[rc::returns("{(l, h - l + 1)%nat} @ bmask")]] +[[rc::trust_me]] +u64 GENMASK(int h, int l) +{ + return (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))); +} /* linux/bitfield.h */ @@ -62,8 +81,16 @@ int __builtin_ffsll (long long x); */ // TODO: `typeof` is a compiler extension. // simple version without `typeof`: -#define FIELD_GET(_mask, _reg) \ +// #define FIELD_GET(_mask, _reg) \ (((_reg) & (_mask)) >> __bf_shf(_mask)) +[[rc::parameters("r : bin", "a : nat", "k : nat")]] +[[rc::args("{(a, k)} @ bmask", "r @ binary")]] +[[rc::returns("{bin_slice a k r ++ replicate (64 - k) false} @ binary")]] +[[rc::trust_me]] +u64 FIELD_GET(u64 _mask, u64 _reg) +{ + return (((_reg) & (_mask)) >> __bf_shf(_mask)); +} /** * FIELD_PREP() - prepare a bitfield element @@ -82,8 +109,17 @@ int __builtin_ffsll (long long x); */ // TODO: `typeof` is a compiler extension. // simple version without `typeof`: -#define FIELD_PREP(_mask, _val) \ +// #define FIELD_PREP(_mask, _val) \ (((_val) << __bf_shf(_mask)) & (_mask)) +[[rc::parameters("a : nat", "k : nat", "v : bin")]] +[[rc::args("{(a, k)} @ bmask", "v @ binary")]] +[[rc::returns("{(a, k, take k v)} @ bdata")]] +[[rc::trust_me]] +u64 FIELD_PREP(u64 _mask, u64 _val) +{ + return ((_val) << __bf_shf(_mask)) & (_mask); +} + /* asm/kvm_pgtable.h */ @@ -97,12 +133,12 @@ typedef u64 phys_addr_t; * @KVM_PGTABLE_PROT_R: Read permission. * @KVM_PGTABLE_PROT_DEVICE: Device attributes. */ -enum kvm_pgtable_prot { - KVM_PGTABLE_PROT_X = BIT(0), - KVM_PGTABLE_PROT_W = BIT(1), - KVM_PGTABLE_PROT_R = BIT(2), - KVM_PGTABLE_PROT_DEVICE = BIT(3), -}; +// enum kvm_pgtable_prot { +// KVM_PGTABLE_PROT_X = BIT(0), +// KVM_PGTABLE_PROT_W = BIT(1), +// KVM_PGTABLE_PROT_R = BIT(2), +// KVM_PGTABLE_PROT_DEVICE = BIT(3), +// }; /** * struct kvm_pgtable_mm_ops - Memory management callbacks. @@ -160,8 +196,8 @@ struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { #define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) // #define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) -[[rc::parameters("pte : {bvec Pte}")]] -[[rc::args("pte @ bitvec")]] +[[rc::parameters("pte : bin")]] +[[rc::args("pte @ binary")]] [[rc::returns("{pte.[valid]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) @@ -169,8 +205,8 @@ static bool kvm_pte_valid(kvm_pte_t pte) return pte & KVM_PTE_VALID; } -[[rc::parameters("pte : {bvec Pte}", "level : Z")]] -[[rc::args("pte @ bitvec", "level @ int")]] +[[rc::parameters("pte : bin", "level : Z")]] +[[rc::args("pte @ binary", "level @ int")]] [[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) @@ -182,9 +218,9 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) return FIELD_GET(KVM_PTE_TYPE, pte) == KVM_PTE_TYPE_TABLE; } -[[rc::parameters("pte : {bvec Pte}", "p : loc")]] -[[rc::args("p @ &own>")]] -[[rc::ensures("own p : {pte.[valid := false]} @ bitvec")]] +[[rc::parameters("pte : bin", "p : loc")]] +[[rc::args("p @ &own>")]] +[[rc::ensures("own p : {pte.[valid := false]} @ binary")]] [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -194,7 +230,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] -[[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ bitvec")]] +[[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ binary")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { @@ -206,13 +242,13 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) return pte; } -[[rc::parameters("p : loc", "q : loc", "o : loc", "pte : {bvec Pte}", "va : Z", "ops : mm_ops")]] -[[rc::args("p @ &own>", "q @ &own>", +[[rc::parameters("p : loc", "q : loc", "o : loc", "pte : bin", "va : Z", "ops : mm_ops")]] +[[rc::args("p @ &own>", "q @ &own>", "o @ &own")]] [[rc::requires("{pte.[valid] = true}")]] [[rc::exists("pa : Z")]] [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] -[[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]} @ bitvec")]] +[[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]} @ binary")]] [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) @@ -220,18 +256,18 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp)); pte |= FIELD_PREP(KVM_PTE_TYPE, KVM_PTE_TYPE_TABLE); pte |= KVM_PTE_VALID; - WARN_ON(kvm_pte_valid(old)); // ??? + WARN_ON(kvm_pte_valid(old)); // smp_store_release(ptep, pte); *ptep = pte; } -[[rc::parameters("p : loc", "pte : {bvec Pte}", "pa : Z", "attr : {bvec Pte}", "level : Z")]] -[[rc::args("p @ &own>", "pa @ int", "attr @ bitvec", "level @ int")]] +[[rc::parameters("p : loc", "pte : bin", "pa : Z", "attr : bin", "level : Z")]] +[[rc::args("p @ &own>", "pa @ int", "attr @ binary", "level @ int")]] [[rc::exists("is_page : bool")]] [[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] -[[rc::exists("pte1 : {bvec Pte}")]] +[[rc::exists("pte1 : bin")]] [[rc::ensures("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]}")]] -[[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ bitvec")]] +[[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ binary")]] [[rc::returns("{if pte.[valid] then bool_decide (pte = pte1) else true} @ boolean")]] [[rc::trust_me]] static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, @@ -257,28 +293,28 @@ struct hyp_map_data { struct kvm_pgtable_mm_ops *mm_ops; }; -static int hyp_map_set_prot_attr(enum kvm_pgtable_prot prot, - struct hyp_map_data *data) -{ - bool device = prot & KVM_PGTABLE_PROT_DEVICE; - u32 mtype = device ? MT_DEVICE_nGnRE : MT_NORMAL; - kvm_pte_t attr = FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX, mtype); - u32 sh = KVM_PTE_LEAF_ATTR_LO_S1_SH_IS; - u32 ap = (prot & KVM_PGTABLE_PROT_W) ? KVM_PTE_LEAF_ATTR_LO_S1_AP_RW : - KVM_PTE_LEAF_ATTR_LO_S1_AP_RO; - if (!(prot & KVM_PGTABLE_PROT_R)) - return -EINVAL; - if (prot & KVM_PGTABLE_PROT_X) { - if (prot & KVM_PGTABLE_PROT_W) - return -EINVAL; - if (device) - return -EINVAL; - } else { - attr |= KVM_PTE_LEAF_ATTR_HI_S1_XN; - } - attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_AP, ap); - attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_SH, sh); - attr |= KVM_PTE_LEAF_ATTR_LO_S1_AF; - data->attr = attr; - return 0; -} +// static int hyp_map_set_prot_attr(enum kvm_pgtable_prot prot, +// struct hyp_map_data *data) +// { +// bool device = prot & KVM_PGTABLE_PROT_DEVICE; +// u32 mtype = device ? MT_DEVICE_nGnRE : MT_NORMAL; +// kvm_pte_t attr = FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX, mtype); +// u32 sh = KVM_PTE_LEAF_ATTR_LO_S1_SH_IS; +// u32 ap = (prot & KVM_PGTABLE_PROT_W) ? KVM_PTE_LEAF_ATTR_LO_S1_AP_RW : +// KVM_PTE_LEAF_ATTR_LO_S1_AP_RO; +// if (!(prot & KVM_PGTABLE_PROT_R)) +// return -EINVAL; +// if (prot & KVM_PGTABLE_PROT_X) { +// if (prot & KVM_PGTABLE_PROT_W) +// return -EINVAL; +// if (device) +// return -EINVAL; +// } else { +// attr |= KVM_PTE_LEAF_ATTR_HI_S1_XN; +// } +// attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_AP, ap); +// attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_SH, sh); +// attr |= KVM_PTE_LEAF_ATTR_LO_S1_AF; +// data->attr = attr; +// return 0; +// } diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 5cfb4440..81a04e37 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,546 +6,281 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 169 4 169 30. - Definition loc_3 : location_info := LocationInfo file_0 169 11 169 29. - Definition loc_4 : location_info := LocationInfo file_0 169 11 169 14. - Definition loc_5 : location_info := LocationInfo file_0 169 11 169 14. - Definition loc_6 : location_info := LocationInfo file_0 169 17 169 29. - Definition loc_7 : location_info := LocationInfo file_0 169 18 169 21. - Definition loc_8 : location_info := LocationInfo file_0 169 25 169 28. - Definition loc_11 : location_info := LocationInfo file_0 178 4 179 17. - Definition loc_12 : location_info := LocationInfo file_0 180 4 181 17. - Definition loc_13 : location_info := LocationInfo file_0 182 4 182 82. - Definition loc_14 : location_info := LocationInfo file_0 182 11 182 81. - Definition loc_15 : location_info := LocationInfo file_0 182 11 182 76. - Definition loc_16 : location_info := LocationInfo file_0 182 12 182 36. - Definition loc_17 : location_info := LocationInfo file_0 182 13 182 18. - Definition loc_18 : location_info := LocationInfo file_0 182 13 182 18. - Definition loc_19 : location_info := LocationInfo file_0 182 21 182 35. - Definition loc_20 : location_info := LocationInfo file_0 182 23 182 26. - Definition loc_21 : location_info := LocationInfo file_0 182 30 182 33. - Definition loc_22 : location_info := LocationInfo file_0 182 40 182 75. - Definition loc_23 : location_info := LocationInfo file_0 182 41 182 70. - Definition loc_24 : location_info := LocationInfo file_0 182 41 182 56. - Definition loc_25 : location_info := LocationInfo file_0 182 41 182 56. - Definition loc_26 : location_info := LocationInfo file_0 182 57 182 69. - Definition loc_27 : location_info := LocationInfo file_0 182 58 182 61. - Definition loc_28 : location_info := LocationInfo file_0 182 65 182 68. - Definition loc_29 : location_info := LocationInfo file_0 182 73 182 74. - Definition loc_30 : location_info := LocationInfo file_0 182 80 182 81. - Definition loc_31 : location_info := LocationInfo file_0 181 8 181 17. - Definition loc_32 : location_info := LocationInfo file_0 181 15 181 16. - Definition loc_34 : location_info := LocationInfo file_0 180 8 180 27. - Definition loc_36 : location_info := LocationInfo file_0 180 9 180 27. - Definition loc_37 : location_info := LocationInfo file_0 180 9 180 22. - Definition loc_38 : location_info := LocationInfo file_0 180 9 180 22. - Definition loc_39 : location_info := LocationInfo file_0 180 23 180 26. - Definition loc_40 : location_info := LocationInfo file_0 180 23 180 26. - Definition loc_41 : location_info := LocationInfo file_0 179 8 179 17. - Definition loc_42 : location_info := LocationInfo file_0 179 15 179 16. - Definition loc_44 : location_info := LocationInfo file_0 178 8 178 23. - Definition loc_45 : location_info := LocationInfo file_0 178 8 178 13. - Definition loc_46 : location_info := LocationInfo file_0 178 8 178 13. - Definition loc_47 : location_info := LocationInfo file_0 178 17 178 23. - Definition loc_48 : location_info := LocationInfo file_0 178 17 178 19. - Definition loc_49 : location_info := LocationInfo file_0 178 22 178 23. - Definition loc_52 : location_info := LocationInfo file_0 191 4 191 26. - Definition loc_53 : location_info := LocationInfo file_0 192 4 192 38. - Definition loc_54 : location_info := LocationInfo file_0 192 5 192 12. - Definition loc_55 : location_info := LocationInfo file_0 192 7 192 11. - Definition loc_56 : location_info := LocationInfo file_0 192 7 192 11. - Definition loc_57 : location_info := LocationInfo file_0 192 15 192 36. - Definition loc_58 : location_info := LocationInfo file_0 192 16 192 19. - Definition loc_59 : location_info := LocationInfo file_0 192 16 192 19. - Definition loc_60 : location_info := LocationInfo file_0 192 22 192 35. - Definition loc_61 : location_info := LocationInfo file_0 192 23 192 35. - Definition loc_62 : location_info := LocationInfo file_0 192 24 192 27. - Definition loc_63 : location_info := LocationInfo file_0 192 31 192 34. - Definition loc_64 : location_info := LocationInfo file_0 191 20 191 25. - Definition loc_65 : location_info := LocationInfo file_0 191 20 191 25. - Definition loc_66 : location_info := LocationInfo file_0 191 21 191 25. - Definition loc_67 : location_info := LocationInfo file_0 191 21 191 25. - Definition loc_72 : location_info := LocationInfo file_0 201 4 201 100. - Definition loc_73 : location_info := LocationInfo file_0 203 4 204 210. - Definition loc_74 : location_info := LocationInfo file_0 206 4 206 15. - Definition loc_75 : location_info := LocationInfo file_0 206 11 206 14. - Definition loc_76 : location_info := LocationInfo file_0 206 11 206 14. - Definition loc_77 : location_info := LocationInfo file_0 204 8 204 210. - Definition loc_78 : location_info := LocationInfo file_0 204 8 204 11. - Definition loc_79 : location_info := LocationInfo file_0 204 8 204 209. - Definition loc_80 : location_info := LocationInfo file_0 204 8 204 11. - Definition loc_81 : location_info := LocationInfo file_0 204 8 204 11. - Definition loc_82 : location_info := LocationInfo file_0 204 15 204 209. - Definition loc_83 : location_info := LocationInfo file_0 204 16 204 129. - Definition loc_84 : location_info := LocationInfo file_0 204 17 204 27. - Definition loc_85 : location_info := LocationInfo file_0 204 18 204 20. - Definition loc_86 : location_info := LocationInfo file_0 204 18 204 20. - Definition loc_87 : location_info := LocationInfo file_0 204 24 204 26. - Definition loc_88 : location_info := LocationInfo file_0 204 31 204 128. - Definition loc_89 : location_info := LocationInfo file_0 204 32 204 123. - Definition loc_90 : location_info := LocationInfo file_0 204 32 204 47. - Definition loc_91 : location_info := LocationInfo file_0 204 32 204 47. - Definition loc_92 : location_info := LocationInfo file_0 204 48 204 122. - Definition loc_93 : location_info := LocationInfo file_0 204 49 204 77. - Definition loc_94 : location_info := LocationInfo file_0 204 50 204 72. - Definition loc_95 : location_info := LocationInfo file_0 204 50 204 56. - Definition loc_96 : location_info := LocationInfo file_0 204 52 204 55. - Definition loc_97 : location_info := LocationInfo file_0 204 59 204 72. - Definition loc_98 : location_info := LocationInfo file_0 204 60 204 63. - Definition loc_99 : location_info := LocationInfo file_0 204 67 204 71. - Definition loc_100 : location_info := LocationInfo file_0 204 75 204 76. - Definition loc_101 : location_info := LocationInfo file_0 204 80 204 121. - Definition loc_102 : location_info := LocationInfo file_0 204 81 204 85. - Definition loc_103 : location_info := LocationInfo file_0 204 82 204 85. - Definition loc_104 : location_info := LocationInfo file_0 204 89 204 120. - Definition loc_105 : location_info := LocationInfo file_0 204 90 204 112. - Definition loc_106 : location_info := LocationInfo file_0 204 90 204 108. - Definition loc_107 : location_info := LocationInfo file_0 204 91 204 103. - Definition loc_108 : location_info := LocationInfo file_0 204 106 204 107. - Definition loc_109 : location_info := LocationInfo file_0 204 111 204 112. - Definition loc_110 : location_info := LocationInfo file_0 204 115 204 119. - Definition loc_111 : location_info := LocationInfo file_0 204 126 204 127. - Definition loc_112 : location_info := LocationInfo file_0 204 132 204 208. - Definition loc_113 : location_info := LocationInfo file_0 204 134 204 162. - Definition loc_114 : location_info := LocationInfo file_0 204 135 204 157. - Definition loc_115 : location_info := LocationInfo file_0 204 135 204 141. - Definition loc_116 : location_info := LocationInfo file_0 204 137 204 140. - Definition loc_117 : location_info := LocationInfo file_0 204 144 204 157. - Definition loc_118 : location_info := LocationInfo file_0 204 145 204 148. - Definition loc_119 : location_info := LocationInfo file_0 204 152 204 156. - Definition loc_120 : location_info := LocationInfo file_0 204 160 204 161. - Definition loc_121 : location_info := LocationInfo file_0 204 165 204 206. - Definition loc_122 : location_info := LocationInfo file_0 204 166 204 170. - Definition loc_123 : location_info := LocationInfo file_0 204 167 204 170. - Definition loc_124 : location_info := LocationInfo file_0 204 174 204 205. - Definition loc_125 : location_info := LocationInfo file_0 204 175 204 197. - Definition loc_126 : location_info := LocationInfo file_0 204 175 204 193. - Definition loc_127 : location_info := LocationInfo file_0 204 176 204 188. - Definition loc_128 : location_info := LocationInfo file_0 204 191 204 192. - Definition loc_129 : location_info := LocationInfo file_0 204 196 204 197. - Definition loc_130 : location_info := LocationInfo file_0 204 200 204 204. - Definition loc_132 : location_info := LocationInfo file_0 203 8 203 16. - Definition loc_133 : location_info := LocationInfo file_0 203 8 203 10. - Definition loc_134 : location_info := LocationInfo file_0 203 14 203 16. - Definition loc_135 : location_info := LocationInfo file_0 201 20 201 99. - Definition loc_136 : location_info := LocationInfo file_0 201 20 201 22. - Definition loc_137 : location_info := LocationInfo file_0 201 20 201 22. - Definition loc_138 : location_info := LocationInfo file_0 201 25 201 99. - Definition loc_139 : location_info := LocationInfo file_0 201 26 201 54. - Definition loc_140 : location_info := LocationInfo file_0 201 27 201 49. - Definition loc_141 : location_info := LocationInfo file_0 201 27 201 33. - Definition loc_142 : location_info := LocationInfo file_0 201 29 201 32. - Definition loc_143 : location_info := LocationInfo file_0 201 36 201 49. - Definition loc_144 : location_info := LocationInfo file_0 201 37 201 40. - Definition loc_145 : location_info := LocationInfo file_0 201 44 201 48. - Definition loc_146 : location_info := LocationInfo file_0 201 52 201 53. - Definition loc_147 : location_info := LocationInfo file_0 201 57 201 98. - Definition loc_148 : location_info := LocationInfo file_0 201 58 201 62. - Definition loc_149 : location_info := LocationInfo file_0 201 59 201 62. - Definition loc_150 : location_info := LocationInfo file_0 201 66 201 97. - Definition loc_151 : location_info := LocationInfo file_0 201 67 201 89. - Definition loc_152 : location_info := LocationInfo file_0 201 67 201 85. - Definition loc_153 : location_info := LocationInfo file_0 201 68 201 80. - Definition loc_154 : location_info := LocationInfo file_0 201 83 201 84. - Definition loc_155 : location_info := LocationInfo file_0 201 88 201 89. - Definition loc_156 : location_info := LocationInfo file_0 201 92 201 96. - Definition loc_161 : location_info := LocationInfo file_0 220 4 220 79. - Definition loc_162 : location_info := LocationInfo file_0 221 4 221 75. - Definition loc_163 : location_info := LocationInfo file_0 222 4 222 24. - Definition loc_164 : location_info := LocationInfo file_0 223 4 223 33. - Definition loc_165 : location_info := LocationInfo file_0 225 1 225 13. - Definition loc_166 : location_info := LocationInfo file_0 225 1 225 6. - Definition loc_167 : location_info := LocationInfo file_0 225 2 225 6. - Definition loc_168 : location_info := LocationInfo file_0 225 2 225 6. - Definition loc_169 : location_info := LocationInfo file_0 225 9 225 12. - Definition loc_170 : location_info := LocationInfo file_0 225 9 225 12. - Definition loc_171 : location_info := LocationInfo file_0 223 12 223 30. - Definition loc_172 : location_info := LocationInfo file_0 223 12 223 25. - Definition loc_173 : location_info := LocationInfo file_0 223 12 223 25. - Definition loc_174 : location_info := LocationInfo file_0 223 26 223 29. - Definition loc_175 : location_info := LocationInfo file_0 223 26 223 29. - Definition loc_176 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_177 : location_info := LocationInfo file_0 222 4 222 23. - Definition loc_178 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_179 : location_info := LocationInfo file_0 222 4 222 7. - Definition loc_180 : location_info := LocationInfo file_0 222 11 222 23. - Definition loc_181 : location_info := LocationInfo file_0 222 12 222 15. - Definition loc_182 : location_info := LocationInfo file_0 222 19 222 22. - Definition loc_183 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_184 : location_info := LocationInfo file_0 221 4 221 74. - Definition loc_185 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_186 : location_info := LocationInfo file_0 221 4 221 7. - Definition loc_187 : location_info := LocationInfo file_0 221 11 221 74. - Definition loc_188 : location_info := LocationInfo file_0 221 12 221 56. - Definition loc_189 : location_info := LocationInfo file_0 221 13 221 16. - Definition loc_190 : location_info := LocationInfo file_0 221 20 221 55. - Definition loc_191 : location_info := LocationInfo file_0 221 21 221 50. - Definition loc_192 : location_info := LocationInfo file_0 221 21 221 36. - Definition loc_193 : location_info := LocationInfo file_0 221 21 221 36. - Definition loc_194 : location_info := LocationInfo file_0 221 37 221 49. - Definition loc_195 : location_info := LocationInfo file_0 221 38 221 41. - Definition loc_196 : location_info := LocationInfo file_0 221 45 221 48. - Definition loc_197 : location_info := LocationInfo file_0 221 53 221 54. - Definition loc_198 : location_info := LocationInfo file_0 221 59 221 73. - Definition loc_199 : location_info := LocationInfo file_0 221 61 221 64. - Definition loc_200 : location_info := LocationInfo file_0 221 68 221 71. - Definition loc_201 : location_info := LocationInfo file_0 220 33 220 78. - Definition loc_202 : location_info := LocationInfo file_0 220 33 220 48. - Definition loc_203 : location_info := LocationInfo file_0 220 33 220 48. - Definition loc_204 : location_info := LocationInfo file_0 220 49 220 77. - Definition loc_205 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_206 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_207 : location_info := LocationInfo file_0 220 49 220 69. - Definition loc_208 : location_info := LocationInfo file_0 220 49 220 55. - Definition loc_209 : location_info := LocationInfo file_0 220 49 220 55. - Definition loc_210 : location_info := LocationInfo file_0 220 70 220 76. - Definition loc_211 : location_info := LocationInfo file_0 220 70 220 76. - Definition loc_214 : location_info := LocationInfo file_0 220 20 220 25. - Definition loc_215 : location_info := LocationInfo file_0 220 20 220 25. - Definition loc_216 : location_info := LocationInfo file_0 220 21 220 25. - Definition loc_217 : location_info := LocationInfo file_0 220 21 220 25. - Definition loc_222 : location_info := LocationInfo file_0 240 4 240 53. - Definition loc_223 : location_info := LocationInfo file_0 241 4 242 33. - Definition loc_224 : location_info := LocationInfo file_0 243 4 243 171. - Definition loc_225 : location_info := LocationInfo file_0 244 4 244 78. - Definition loc_226 : location_info := LocationInfo file_0 245 4 245 24. - Definition loc_227 : location_info := LocationInfo file_0 247 4 248 26. - Definition loc_228 : location_info := LocationInfo file_0 250 1 250 13. - Definition loc_229 : location_info := LocationInfo file_0 251 4 251 13. - Definition loc_230 : location_info := LocationInfo file_0 251 11 251 12. - Definition loc_231 : location_info := LocationInfo file_0 250 1 250 6. - Definition loc_232 : location_info := LocationInfo file_0 250 2 250 6. - Definition loc_233 : location_info := LocationInfo file_0 250 2 250 6. - Definition loc_234 : location_info := LocationInfo file_0 250 9 250 12. - Definition loc_235 : location_info := LocationInfo file_0 250 9 250 12. - Definition loc_236 : location_info := LocationInfo file_0 248 8 248 26. - Definition loc_237 : location_info := LocationInfo file_0 248 15 248 25. - Definition loc_238 : location_info := LocationInfo file_0 248 15 248 18. - Definition loc_239 : location_info := LocationInfo file_0 248 15 248 18. - Definition loc_240 : location_info := LocationInfo file_0 248 22 248 25. - Definition loc_241 : location_info := LocationInfo file_0 248 22 248 25. - Definition loc_243 : location_info := LocationInfo file_0 247 8 247 26. - Definition loc_244 : location_info := LocationInfo file_0 247 8 247 21. - Definition loc_245 : location_info := LocationInfo file_0 247 8 247 21. - Definition loc_246 : location_info := LocationInfo file_0 247 22 247 25. - Definition loc_247 : location_info := LocationInfo file_0 247 22 247 25. - Definition loc_248 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_249 : location_info := LocationInfo file_0 245 4 245 23. - Definition loc_250 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_251 : location_info := LocationInfo file_0 245 4 245 7. - Definition loc_252 : location_info := LocationInfo file_0 245 11 245 23. - Definition loc_253 : location_info := LocationInfo file_0 245 12 245 15. - Definition loc_254 : location_info := LocationInfo file_0 245 19 245 22. - Definition loc_255 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_256 : location_info := LocationInfo file_0 244 4 244 77. - Definition loc_257 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_258 : location_info := LocationInfo file_0 244 4 244 7. - Definition loc_259 : location_info := LocationInfo file_0 244 11 244 77. - Definition loc_260 : location_info := LocationInfo file_0 244 12 244 59. - Definition loc_261 : location_info := LocationInfo file_0 244 13 244 19. - Definition loc_262 : location_info := LocationInfo file_0 244 13 244 19. - Definition loc_263 : location_info := LocationInfo file_0 244 23 244 58. - Definition loc_264 : location_info := LocationInfo file_0 244 24 244 53. - Definition loc_265 : location_info := LocationInfo file_0 244 24 244 39. - Definition loc_266 : location_info := LocationInfo file_0 244 24 244 39. - Definition loc_267 : location_info := LocationInfo file_0 244 40 244 52. - Definition loc_268 : location_info := LocationInfo file_0 244 41 244 44. - Definition loc_269 : location_info := LocationInfo file_0 244 48 244 51. - Definition loc_270 : location_info := LocationInfo file_0 244 56 244 57. - Definition loc_271 : location_info := LocationInfo file_0 244 62 244 76. - Definition loc_272 : location_info := LocationInfo file_0 244 64 244 67. - Definition loc_273 : location_info := LocationInfo file_0 244 71 244 74. - Definition loc_274 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_275 : location_info := LocationInfo file_0 243 4 243 170. - Definition loc_276 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_277 : location_info := LocationInfo file_0 243 4 243 7. - Definition loc_278 : location_info := LocationInfo file_0 243 11 243 170. - Definition loc_279 : location_info := LocationInfo file_0 243 11 243 15. - Definition loc_280 : location_info := LocationInfo file_0 243 11 243 15. - Definition loc_281 : location_info := LocationInfo file_0 243 18 243 170. - Definition loc_282 : location_info := LocationInfo file_0 243 19 243 92. - Definition loc_283 : location_info := LocationInfo file_0 243 20 243 47. - Definition loc_284 : location_info := LocationInfo file_0 243 21 243 42. - Definition loc_285 : location_info := LocationInfo file_0 243 21 243 27. - Definition loc_286 : location_info := LocationInfo file_0 243 23 243 26. - Definition loc_287 : location_info := LocationInfo file_0 243 30 243 42. - Definition loc_288 : location_info := LocationInfo file_0 243 31 243 34. - Definition loc_289 : location_info := LocationInfo file_0 243 38 243 41. - Definition loc_290 : location_info := LocationInfo file_0 243 45 243 46. - Definition loc_291 : location_info := LocationInfo file_0 243 50 243 91. - Definition loc_292 : location_info := LocationInfo file_0 243 51 243 55. - Definition loc_293 : location_info := LocationInfo file_0 243 52 243 55. - Definition loc_294 : location_info := LocationInfo file_0 243 59 243 90. - Definition loc_295 : location_info := LocationInfo file_0 243 60 243 82. - Definition loc_296 : location_info := LocationInfo file_0 243 60 243 78. - Definition loc_297 : location_info := LocationInfo file_0 243 61 243 73. - Definition loc_298 : location_info := LocationInfo file_0 243 76 243 77. - Definition loc_299 : location_info := LocationInfo file_0 243 81 243 82. - Definition loc_300 : location_info := LocationInfo file_0 243 85 243 89. - Definition loc_301 : location_info := LocationInfo file_0 243 95 243 169. - Definition loc_302 : location_info := LocationInfo file_0 243 96 243 124. - Definition loc_303 : location_info := LocationInfo file_0 243 97 243 119. - Definition loc_304 : location_info := LocationInfo file_0 243 97 243 103. - Definition loc_305 : location_info := LocationInfo file_0 243 99 243 102. - Definition loc_306 : location_info := LocationInfo file_0 243 106 243 119. - Definition loc_307 : location_info := LocationInfo file_0 243 107 243 110. - Definition loc_308 : location_info := LocationInfo file_0 243 114 243 118. - Definition loc_309 : location_info := LocationInfo file_0 243 122 243 123. - Definition loc_310 : location_info := LocationInfo file_0 243 127 243 168. - Definition loc_311 : location_info := LocationInfo file_0 243 128 243 132. - Definition loc_312 : location_info := LocationInfo file_0 243 129 243 132. - Definition loc_313 : location_info := LocationInfo file_0 243 136 243 167. - Definition loc_314 : location_info := LocationInfo file_0 243 137 243 159. - Definition loc_315 : location_info := LocationInfo file_0 243 137 243 155. - Definition loc_316 : location_info := LocationInfo file_0 243 138 243 150. - Definition loc_317 : location_info := LocationInfo file_0 243 153 243 154. - Definition loc_318 : location_info := LocationInfo file_0 243 158 243 159. - Definition loc_319 : location_info := LocationInfo file_0 243 162 243 166. - Definition loc_320 : location_info := LocationInfo file_0 241 15 242 32. - Definition loc_321 : location_info := LocationInfo file_0 241 15 241 32. - Definition loc_322 : location_info := LocationInfo file_0 241 16 241 21. - Definition loc_323 : location_info := LocationInfo file_0 241 16 241 21. - Definition loc_324 : location_info := LocationInfo file_0 241 25 241 31. - Definition loc_325 : location_info := LocationInfo file_0 241 25 241 27. - Definition loc_326 : location_info := LocationInfo file_0 241 30 241 31. - Definition loc_327 : location_info := LocationInfo file_0 241 35 241 36. - Definition loc_328 : location_info := LocationInfo file_0 242 31 242 32. - Definition loc_331 : location_info := LocationInfo file_0 240 33 240 52. - Definition loc_332 : location_info := LocationInfo file_0 240 33 240 48. - Definition loc_333 : location_info := LocationInfo file_0 240 33 240 48. - Definition loc_334 : location_info := LocationInfo file_0 240 49 240 51. - Definition loc_335 : location_info := LocationInfo file_0 240 49 240 51. - Definition loc_338 : location_info := LocationInfo file_0 240 20 240 25. - Definition loc_339 : location_info := LocationInfo file_0 240 20 240 25. - Definition loc_340 : location_info := LocationInfo file_0 240 21 240 25. - Definition loc_341 : location_info := LocationInfo file_0 240 21 240 25. - Definition loc_346 : location_info := LocationInfo file_0 263 4 263 50. - Definition loc_347 : location_info := LocationInfo file_0 264 4 264 31. - Definition loc_348 : location_info := LocationInfo file_0 265 4 265 209. - Definition loc_349 : location_info := LocationInfo file_0 266 4 266 15. - Definition loc_350 : location_info := LocationInfo file_0 267 4 268 29. - Definition loc_351 : location_info := LocationInfo file_0 269 4 270 19. - Definition loc_352 : location_info := LocationInfo file_0 271 4 278 5. - Definition loc_353 : location_info := LocationInfo file_0 279 4 279 197. - Definition loc_354 : location_info := LocationInfo file_0 280 4 280 197. - Definition loc_355 : location_info := LocationInfo file_0 281 4 281 26. - Definition loc_356 : location_info := LocationInfo file_0 282 4 282 22. - Definition loc_357 : location_info := LocationInfo file_0 283 4 283 13. - Definition loc_358 : location_info := LocationInfo file_0 283 11 283 12. - Definition loc_359 : location_info := LocationInfo file_0 282 4 282 14. - Definition loc_360 : location_info := LocationInfo file_0 282 4 282 8. - Definition loc_361 : location_info := LocationInfo file_0 282 4 282 8. - Definition loc_362 : location_info := LocationInfo file_0 282 17 282 21. - Definition loc_363 : location_info := LocationInfo file_0 282 17 282 21. - Definition loc_364 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_365 : location_info := LocationInfo file_0 281 4 281 25. - Definition loc_366 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_367 : location_info := LocationInfo file_0 281 4 281 8. - Definition loc_368 : location_info := LocationInfo file_0 281 12 281 25. - Definition loc_369 : location_info := LocationInfo file_0 281 13 281 16. - Definition loc_370 : location_info := LocationInfo file_0 281 20 281 24. - Definition loc_371 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_372 : location_info := LocationInfo file_0 280 4 280 196. - Definition loc_373 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_374 : location_info := LocationInfo file_0 280 4 280 8. - Definition loc_375 : location_info := LocationInfo file_0 280 12 280 196. - Definition loc_376 : location_info := LocationInfo file_0 280 13 280 118. - Definition loc_377 : location_info := LocationInfo file_0 280 14 280 18. - Definition loc_378 : location_info := LocationInfo file_0 280 14 280 18. - Definition loc_379 : location_info := LocationInfo file_0 280 22 280 117. - Definition loc_380 : location_info := LocationInfo file_0 280 23 280 112. - Definition loc_381 : location_info := LocationInfo file_0 280 23 280 38. - Definition loc_382 : location_info := LocationInfo file_0 280 23 280 38. - Definition loc_383 : location_info := LocationInfo file_0 280 39 280 111. - Definition loc_384 : location_info := LocationInfo file_0 280 40 280 67. - Definition loc_385 : location_info := LocationInfo file_0 280 41 280 62. - Definition loc_386 : location_info := LocationInfo file_0 280 41 280 47. - Definition loc_387 : location_info := LocationInfo file_0 280 43 280 46. - Definition loc_388 : location_info := LocationInfo file_0 280 50 280 62. - Definition loc_389 : location_info := LocationInfo file_0 280 51 280 54. - Definition loc_390 : location_info := LocationInfo file_0 280 58 280 61. - Definition loc_391 : location_info := LocationInfo file_0 280 65 280 66. - Definition loc_392 : location_info := LocationInfo file_0 280 70 280 110. - Definition loc_393 : location_info := LocationInfo file_0 280 71 280 75. - Definition loc_394 : location_info := LocationInfo file_0 280 72 280 75. - Definition loc_395 : location_info := LocationInfo file_0 280 79 280 109. - Definition loc_396 : location_info := LocationInfo file_0 280 80 280 102. - Definition loc_397 : location_info := LocationInfo file_0 280 80 280 98. - Definition loc_398 : location_info := LocationInfo file_0 280 81 280 93. - Definition loc_399 : location_info := LocationInfo file_0 280 96 280 97. - Definition loc_400 : location_info := LocationInfo file_0 280 101 280 102. - Definition loc_401 : location_info := LocationInfo file_0 280 105 280 108. - Definition loc_402 : location_info := LocationInfo file_0 280 115 280 116. - Definition loc_403 : location_info := LocationInfo file_0 280 121 280 195. - Definition loc_404 : location_info := LocationInfo file_0 280 123 280 150. - Definition loc_405 : location_info := LocationInfo file_0 280 124 280 145. - Definition loc_406 : location_info := LocationInfo file_0 280 124 280 130. - Definition loc_407 : location_info := LocationInfo file_0 280 126 280 129. - Definition loc_408 : location_info := LocationInfo file_0 280 133 280 145. - Definition loc_409 : location_info := LocationInfo file_0 280 134 280 137. - Definition loc_410 : location_info := LocationInfo file_0 280 141 280 144. - Definition loc_411 : location_info := LocationInfo file_0 280 148 280 149. - Definition loc_412 : location_info := LocationInfo file_0 280 153 280 193. - Definition loc_413 : location_info := LocationInfo file_0 280 154 280 158. - Definition loc_414 : location_info := LocationInfo file_0 280 155 280 158. - Definition loc_415 : location_info := LocationInfo file_0 280 162 280 192. - Definition loc_416 : location_info := LocationInfo file_0 280 163 280 185. - Definition loc_417 : location_info := LocationInfo file_0 280 163 280 181. - Definition loc_418 : location_info := LocationInfo file_0 280 164 280 176. - Definition loc_419 : location_info := LocationInfo file_0 280 179 280 180. - Definition loc_420 : location_info := LocationInfo file_0 280 184 280 185. - Definition loc_421 : location_info := LocationInfo file_0 280 188 280 191. - Definition loc_422 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_423 : location_info := LocationInfo file_0 279 4 279 196. - Definition loc_424 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_425 : location_info := LocationInfo file_0 279 4 279 8. - Definition loc_426 : location_info := LocationInfo file_0 279 12 279 196. - Definition loc_427 : location_info := LocationInfo file_0 279 13 279 118. - Definition loc_428 : location_info := LocationInfo file_0 279 14 279 18. - Definition loc_429 : location_info := LocationInfo file_0 279 14 279 18. - Definition loc_430 : location_info := LocationInfo file_0 279 22 279 117. - Definition loc_431 : location_info := LocationInfo file_0 279 23 279 112. - Definition loc_432 : location_info := LocationInfo file_0 279 23 279 38. - Definition loc_433 : location_info := LocationInfo file_0 279 23 279 38. - Definition loc_434 : location_info := LocationInfo file_0 279 39 279 111. - Definition loc_435 : location_info := LocationInfo file_0 279 40 279 67. - Definition loc_436 : location_info := LocationInfo file_0 279 41 279 62. - Definition loc_437 : location_info := LocationInfo file_0 279 41 279 47. - Definition loc_438 : location_info := LocationInfo file_0 279 43 279 46. - Definition loc_439 : location_info := LocationInfo file_0 279 50 279 62. - Definition loc_440 : location_info := LocationInfo file_0 279 51 279 54. - Definition loc_441 : location_info := LocationInfo file_0 279 58 279 61. - Definition loc_442 : location_info := LocationInfo file_0 279 65 279 66. - Definition loc_443 : location_info := LocationInfo file_0 279 70 279 110. - Definition loc_444 : location_info := LocationInfo file_0 279 71 279 75. - Definition loc_445 : location_info := LocationInfo file_0 279 72 279 75. - Definition loc_446 : location_info := LocationInfo file_0 279 79 279 109. - Definition loc_447 : location_info := LocationInfo file_0 279 80 279 102. - Definition loc_448 : location_info := LocationInfo file_0 279 80 279 98. - Definition loc_449 : location_info := LocationInfo file_0 279 81 279 93. - Definition loc_450 : location_info := LocationInfo file_0 279 96 279 97. - Definition loc_451 : location_info := LocationInfo file_0 279 101 279 102. - Definition loc_452 : location_info := LocationInfo file_0 279 105 279 108. - Definition loc_453 : location_info := LocationInfo file_0 279 115 279 116. - Definition loc_454 : location_info := LocationInfo file_0 279 121 279 195. - Definition loc_455 : location_info := LocationInfo file_0 279 123 279 150. - Definition loc_456 : location_info := LocationInfo file_0 279 124 279 145. - Definition loc_457 : location_info := LocationInfo file_0 279 124 279 130. - Definition loc_458 : location_info := LocationInfo file_0 279 126 279 129. - Definition loc_459 : location_info := LocationInfo file_0 279 133 279 145. - Definition loc_460 : location_info := LocationInfo file_0 279 134 279 137. - Definition loc_461 : location_info := LocationInfo file_0 279 141 279 144. - Definition loc_462 : location_info := LocationInfo file_0 279 148 279 149. - Definition loc_463 : location_info := LocationInfo file_0 279 153 279 193. - Definition loc_464 : location_info := LocationInfo file_0 279 154 279 158. - Definition loc_465 : location_info := LocationInfo file_0 279 155 279 158. - Definition loc_466 : location_info := LocationInfo file_0 279 162 279 192. - Definition loc_467 : location_info := LocationInfo file_0 279 163 279 185. - Definition loc_468 : location_info := LocationInfo file_0 279 163 279 181. - Definition loc_469 : location_info := LocationInfo file_0 279 164 279 176. - Definition loc_470 : location_info := LocationInfo file_0 279 179 279 180. - Definition loc_471 : location_info := LocationInfo file_0 279 184 279 185. - Definition loc_472 : location_info := LocationInfo file_0 279 188 279 191. - Definition loc_473 : location_info := LocationInfo file_0 271 35 276 5. - Definition loc_474 : location_info := LocationInfo file_0 272 8 273 23. - Definition loc_475 : location_info := LocationInfo file_0 274 8 275 23. - Definition loc_476 : location_info := LocationInfo file_0 275 12 275 23. - Definition loc_477 : location_info := LocationInfo file_0 275 19 275 22. - Definition loc_478 : location_info := LocationInfo file_0 275 20 275 22. - Definition loc_480 : location_info := LocationInfo file_0 274 12 274 18. - Definition loc_481 : location_info := LocationInfo file_0 274 12 274 18. - Definition loc_482 : location_info := LocationInfo file_0 273 12 273 23. - Definition loc_483 : location_info := LocationInfo file_0 273 19 273 22. - Definition loc_484 : location_info := LocationInfo file_0 273 20 273 22. - Definition loc_486 : location_info := LocationInfo file_0 272 12 272 37. - Definition loc_487 : location_info := LocationInfo file_0 272 12 272 16. - Definition loc_488 : location_info := LocationInfo file_0 272 12 272 16. - Definition loc_489 : location_info := LocationInfo file_0 272 19 272 37. - Definition loc_490 : location_info := LocationInfo file_0 276 11 278 5. - Definition loc_491 : location_info := LocationInfo file_0 277 8 277 30. - Definition loc_492 : location_info := LocationInfo file_0 277 8 277 12. - Definition loc_493 : location_info := LocationInfo file_0 277 8 277 29. - Definition loc_494 : location_info := LocationInfo file_0 277 8 277 12. - Definition loc_495 : location_info := LocationInfo file_0 277 8 277 12. - Definition loc_496 : location_info := LocationInfo file_0 277 16 277 29. - Definition loc_497 : location_info := LocationInfo file_0 277 17 277 20. - Definition loc_498 : location_info := LocationInfo file_0 277 24 277 28. - Definition loc_499 : location_info := LocationInfo file_0 271 8 271 33. - Definition loc_500 : location_info := LocationInfo file_0 271 8 271 12. - Definition loc_501 : location_info := LocationInfo file_0 271 8 271 12. - Definition loc_502 : location_info := LocationInfo file_0 271 15 271 33. - Definition loc_503 : location_info := LocationInfo file_0 270 8 270 19. - Definition loc_504 : location_info := LocationInfo file_0 270 15 270 18. - Definition loc_505 : location_info := LocationInfo file_0 270 16 270 18. - Definition loc_507 : location_info := LocationInfo file_0 269 8 269 36. - Definition loc_509 : location_info := LocationInfo file_0 269 9 269 36. - Definition loc_510 : location_info := LocationInfo file_0 269 10 269 14. - Definition loc_511 : location_info := LocationInfo file_0 269 10 269 14. - Definition loc_512 : location_info := LocationInfo file_0 269 17 269 35. - Definition loc_513 : location_info := LocationInfo file_0 267 13 268 28. - Definition loc_514 : location_info := LocationInfo file_0 267 13 267 40. - Definition loc_515 : location_info := LocationInfo file_0 267 14 267 18. - Definition loc_516 : location_info := LocationInfo file_0 267 14 267 18. - Definition loc_517 : location_info := LocationInfo file_0 267 21 267 39. - Definition loc_518 : location_info := LocationInfo file_0 267 43 267 44. - Definition loc_519 : location_info := LocationInfo file_0 268 27 268 28. - Definition loc_522 : location_info := LocationInfo file_0 266 13 266 14. - Definition loc_525 : location_info := LocationInfo file_0 265 21 265 208. - Definition loc_526 : location_info := LocationInfo file_0 265 22 265 130. - Definition loc_527 : location_info := LocationInfo file_0 265 23 265 30. - Definition loc_528 : location_info := LocationInfo file_0 265 23 265 30. - Definition loc_529 : location_info := LocationInfo file_0 265 34 265 129. - Definition loc_530 : location_info := LocationInfo file_0 265 35 265 124. - Definition loc_531 : location_info := LocationInfo file_0 265 35 265 50. - Definition loc_532 : location_info := LocationInfo file_0 265 35 265 50. - Definition loc_533 : location_info := LocationInfo file_0 265 51 265 123. - Definition loc_534 : location_info := LocationInfo file_0 265 52 265 79. - Definition loc_535 : location_info := LocationInfo file_0 265 53 265 74. - Definition loc_536 : location_info := LocationInfo file_0 265 53 265 59. - Definition loc_537 : location_info := LocationInfo file_0 265 55 265 58. - Definition loc_538 : location_info := LocationInfo file_0 265 62 265 74. - Definition loc_539 : location_info := LocationInfo file_0 265 63 265 66. - Definition loc_540 : location_info := LocationInfo file_0 265 70 265 73. - Definition loc_541 : location_info := LocationInfo file_0 265 77 265 78. - Definition loc_542 : location_info := LocationInfo file_0 265 82 265 122. - Definition loc_543 : location_info := LocationInfo file_0 265 83 265 87. - Definition loc_544 : location_info := LocationInfo file_0 265 84 265 87. - Definition loc_545 : location_info := LocationInfo file_0 265 91 265 121. - Definition loc_546 : location_info := LocationInfo file_0 265 92 265 114. - Definition loc_547 : location_info := LocationInfo file_0 265 92 265 110. - Definition loc_548 : location_info := LocationInfo file_0 265 93 265 105. - Definition loc_549 : location_info := LocationInfo file_0 265 108 265 109. - Definition loc_550 : location_info := LocationInfo file_0 265 113 265 114. - Definition loc_551 : location_info := LocationInfo file_0 265 117 265 120. - Definition loc_552 : location_info := LocationInfo file_0 265 127 265 128. - Definition loc_553 : location_info := LocationInfo file_0 265 133 265 207. - Definition loc_554 : location_info := LocationInfo file_0 265 135 265 162. - Definition loc_555 : location_info := LocationInfo file_0 265 136 265 157. - Definition loc_556 : location_info := LocationInfo file_0 265 136 265 142. - Definition loc_557 : location_info := LocationInfo file_0 265 138 265 141. - Definition loc_558 : location_info := LocationInfo file_0 265 145 265 157. - Definition loc_559 : location_info := LocationInfo file_0 265 146 265 149. - Definition loc_560 : location_info := LocationInfo file_0 265 153 265 156. - Definition loc_561 : location_info := LocationInfo file_0 265 160 265 161. - Definition loc_562 : location_info := LocationInfo file_0 265 165 265 205. - Definition loc_563 : location_info := LocationInfo file_0 265 166 265 170. - Definition loc_564 : location_info := LocationInfo file_0 265 167 265 170. - Definition loc_565 : location_info := LocationInfo file_0 265 174 265 204. - Definition loc_566 : location_info := LocationInfo file_0 265 175 265 197. - Definition loc_567 : location_info := LocationInfo file_0 265 175 265 193. - Definition loc_568 : location_info := LocationInfo file_0 265 176 265 188. - Definition loc_569 : location_info := LocationInfo file_0 265 191 265 192. - Definition loc_570 : location_info := LocationInfo file_0 265 196 265 197. - Definition loc_571 : location_info := LocationInfo file_0 265 200 265 203. - Definition loc_574 : location_info := LocationInfo file_0 264 16 264 30. - Definition loc_575 : location_info := LocationInfo file_0 264 16 264 22. - Definition loc_576 : location_info := LocationInfo file_0 264 16 264 22. - Definition loc_577 : location_info := LocationInfo file_0 264 25 264 26. - Definition loc_578 : location_info := LocationInfo file_0 264 29 264 30. - Definition loc_581 : location_info := LocationInfo file_0 263 19 263 49. - Definition loc_582 : location_info := LocationInfo file_0 263 19 263 23. - Definition loc_583 : location_info := LocationInfo file_0 263 19 263 23. - Definition loc_584 : location_info := LocationInfo file_0 263 26 263 49. + Definition loc_2 : location_info := LocationInfo file_0 27 1 27 21. + Definition loc_3 : location_info := LocationInfo file_0 27 8 27 20. + Definition loc_4 : location_info := LocationInfo file_0 27 9 27 12. + Definition loc_5 : location_info := LocationInfo file_0 27 16 27 19. + Definition loc_6 : location_info := LocationInfo file_0 27 16 27 19. + Definition loc_9 : location_info := LocationInfo file_0 44 1 44 81. + Definition loc_10 : location_info := LocationInfo file_0 44 8 44 80. + Definition loc_11 : location_info := LocationInfo file_0 44 9 44 36. + Definition loc_12 : location_info := LocationInfo file_0 44 10 44 31. + Definition loc_13 : location_info := LocationInfo file_0 44 10 44 16. + Definition loc_14 : location_info := LocationInfo file_0 44 12 44 15. + Definition loc_15 : location_info := LocationInfo file_0 44 19 44 31. + Definition loc_16 : location_info := LocationInfo file_0 44 20 44 23. + Definition loc_17 : location_info := LocationInfo file_0 44 27 44 30. + Definition loc_18 : location_info := LocationInfo file_0 44 27 44 30. + Definition loc_19 : location_info := LocationInfo file_0 44 34 44 35. + Definition loc_20 : location_info := LocationInfo file_0 44 39 44 79. + Definition loc_21 : location_info := LocationInfo file_0 44 40 44 44. + Definition loc_22 : location_info := LocationInfo file_0 44 41 44 44. + Definition loc_23 : location_info := LocationInfo file_0 44 48 44 78. + Definition loc_24 : location_info := LocationInfo file_0 44 49 44 71. + Definition loc_25 : location_info := LocationInfo file_0 44 49 44 67. + Definition loc_26 : location_info := LocationInfo file_0 44 50 44 62. + Definition loc_27 : location_info := LocationInfo file_0 44 65 44 66. + Definition loc_28 : location_info := LocationInfo file_0 44 70 44 71. + Definition loc_29 : location_info := LocationInfo file_0 44 74 44 77. + Definition loc_30 : location_info := LocationInfo file_0 44 74 44 77. + Definition loc_33 : location_info := LocationInfo file_0 92 1 92 61. + Definition loc_34 : location_info := LocationInfo file_0 92 8 92 60. + Definition loc_35 : location_info := LocationInfo file_0 92 9 92 27. + Definition loc_36 : location_info := LocationInfo file_0 92 10 92 16. + Definition loc_37 : location_info := LocationInfo file_0 92 10 92 16. + Definition loc_38 : location_info := LocationInfo file_0 92 19 92 26. + Definition loc_39 : location_info := LocationInfo file_0 92 19 92 26. + Definition loc_40 : location_info := LocationInfo file_0 92 31 92 59. + Definition loc_41 : location_info := LocationInfo file_0 92 32 92 54. + Definition loc_42 : location_info := LocationInfo file_0 92 32 92 47. + Definition loc_43 : location_info := LocationInfo file_0 92 32 92 47. + Definition loc_44 : location_info := LocationInfo file_0 92 48 92 53. + Definition loc_45 : location_info := LocationInfo file_0 92 48 92 53. + Definition loc_46 : location_info := LocationInfo file_0 92 57 92 58. + Definition loc_49 : location_info := LocationInfo file_0 120 1 120 59. + Definition loc_50 : location_info := LocationInfo file_0 120 8 120 58. + Definition loc_51 : location_info := LocationInfo file_0 120 8 120 48. + Definition loc_52 : location_info := LocationInfo file_0 120 9 120 15. + Definition loc_53 : location_info := LocationInfo file_0 120 9 120 15. + Definition loc_54 : location_info := LocationInfo file_0 120 19 120 47. + Definition loc_55 : location_info := LocationInfo file_0 120 20 120 42. + Definition loc_56 : location_info := LocationInfo file_0 120 20 120 35. + Definition loc_57 : location_info := LocationInfo file_0 120 20 120 35. + Definition loc_58 : location_info := LocationInfo file_0 120 36 120 41. + Definition loc_59 : location_info := LocationInfo file_0 120 36 120 41. + Definition loc_60 : location_info := LocationInfo file_0 120 45 120 46. + Definition loc_61 : location_info := LocationInfo file_0 120 51 120 58. + Definition loc_62 : location_info := LocationInfo file_0 120 51 120 58. + Definition loc_65 : location_info := LocationInfo file_0 205 4 205 24. + Definition loc_66 : location_info := LocationInfo file_0 205 11 205 23. + Definition loc_67 : location_info := LocationInfo file_0 205 11 205 14. + Definition loc_68 : location_info := LocationInfo file_0 205 11 205 14. + Definition loc_69 : location_info := LocationInfo file_0 205 17 205 23. + Definition loc_70 : location_info := LocationInfo file_0 205 17 205 20. + Definition loc_71 : location_info := LocationInfo file_0 205 17 205 20. + Definition loc_72 : location_info := LocationInfo file_0 205 21 205 22. + Definition loc_75 : location_info := LocationInfo file_0 214 4 215 17. + Definition loc_76 : location_info := LocationInfo file_0 216 4 217 17. + Definition loc_77 : location_info := LocationInfo file_0 218 4 218 39. + Definition loc_78 : location_info := LocationInfo file_0 218 11 218 38. + Definition loc_79 : location_info := LocationInfo file_0 218 11 218 33. + Definition loc_80 : location_info := LocationInfo file_0 218 11 218 20. + Definition loc_81 : location_info := LocationInfo file_0 218 11 218 20. + Definition loc_82 : location_info := LocationInfo file_0 218 21 218 27. + Definition loc_83 : location_info := LocationInfo file_0 218 21 218 24. + Definition loc_84 : location_info := LocationInfo file_0 218 21 218 24. + Definition loc_85 : location_info := LocationInfo file_0 218 25 218 26. + Definition loc_86 : location_info := LocationInfo file_0 218 29 218 32. + Definition loc_87 : location_info := LocationInfo file_0 218 29 218 32. + Definition loc_88 : location_info := LocationInfo file_0 218 37 218 38. + Definition loc_89 : location_info := LocationInfo file_0 217 8 217 17. + Definition loc_90 : location_info := LocationInfo file_0 217 15 217 16. + Definition loc_92 : location_info := LocationInfo file_0 216 8 216 27. + Definition loc_94 : location_info := LocationInfo file_0 216 9 216 27. + Definition loc_95 : location_info := LocationInfo file_0 216 9 216 22. + Definition loc_96 : location_info := LocationInfo file_0 216 9 216 22. + Definition loc_97 : location_info := LocationInfo file_0 216 23 216 26. + Definition loc_98 : location_info := LocationInfo file_0 216 23 216 26. + Definition loc_99 : location_info := LocationInfo file_0 215 8 215 17. + Definition loc_100 : location_info := LocationInfo file_0 215 15 215 16. + Definition loc_102 : location_info := LocationInfo file_0 214 8 214 23. + Definition loc_103 : location_info := LocationInfo file_0 214 8 214 13. + Definition loc_104 : location_info := LocationInfo file_0 214 8 214 13. + Definition loc_105 : location_info := LocationInfo file_0 214 17 214 23. + Definition loc_106 : location_info := LocationInfo file_0 214 17 214 19. + Definition loc_107 : location_info := LocationInfo file_0 214 22 214 23. + Definition loc_110 : location_info := LocationInfo file_0 227 4 227 26. + Definition loc_111 : location_info := LocationInfo file_0 228 4 228 32. + Definition loc_112 : location_info := LocationInfo file_0 228 5 228 12. + Definition loc_113 : location_info := LocationInfo file_0 228 7 228 11. + Definition loc_114 : location_info := LocationInfo file_0 228 7 228 11. + Definition loc_115 : location_info := LocationInfo file_0 228 15 228 30. + Definition loc_116 : location_info := LocationInfo file_0 228 16 228 19. + Definition loc_117 : location_info := LocationInfo file_0 228 16 228 19. + Definition loc_118 : location_info := LocationInfo file_0 228 22 228 29. + Definition loc_119 : location_info := LocationInfo file_0 228 23 228 29. + Definition loc_120 : location_info := LocationInfo file_0 228 23 228 26. + Definition loc_121 : location_info := LocationInfo file_0 228 23 228 26. + Definition loc_122 : location_info := LocationInfo file_0 228 27 228 28. + Definition loc_123 : location_info := LocationInfo file_0 227 20 227 25. + Definition loc_124 : location_info := LocationInfo file_0 227 20 227 25. + Definition loc_125 : location_info := LocationInfo file_0 227 21 227 25. + Definition loc_126 : location_info := LocationInfo file_0 227 21 227 25. + Definition loc_131 : location_info := LocationInfo file_0 237 4 237 41. + Definition loc_132 : location_info := LocationInfo file_0 239 4 240 53. + Definition loc_133 : location_info := LocationInfo file_0 242 4 242 15. + Definition loc_134 : location_info := LocationInfo file_0 242 11 242 14. + Definition loc_135 : location_info := LocationInfo file_0 242 11 242 14. + Definition loc_136 : location_info := LocationInfo file_0 240 8 240 53. + Definition loc_137 : location_info := LocationInfo file_0 240 8 240 11. + Definition loc_138 : location_info := LocationInfo file_0 240 8 240 52. + Definition loc_139 : location_info := LocationInfo file_0 240 8 240 11. + Definition loc_140 : location_info := LocationInfo file_0 240 8 240 11. + Definition loc_141 : location_info := LocationInfo file_0 240 15 240 52. + Definition loc_142 : location_info := LocationInfo file_0 240 15 240 25. + Definition loc_143 : location_info := LocationInfo file_0 240 15 240 25. + Definition loc_144 : location_info := LocationInfo file_0 240 26 240 41. + Definition loc_145 : location_info := LocationInfo file_0 240 26 240 33. + Definition loc_146 : location_info := LocationInfo file_0 240 26 240 33. + Definition loc_147 : location_info := LocationInfo file_0 240 34 240 36. + Definition loc_148 : location_info := LocationInfo file_0 240 38 240 40. + Definition loc_149 : location_info := LocationInfo file_0 240 43 240 51. + Definition loc_150 : location_info := LocationInfo file_0 240 43 240 45. + Definition loc_151 : location_info := LocationInfo file_0 240 43 240 45. + Definition loc_152 : location_info := LocationInfo file_0 240 49 240 51. + Definition loc_154 : location_info := LocationInfo file_0 239 8 239 16. + Definition loc_155 : location_info := LocationInfo file_0 239 8 239 10. + Definition loc_156 : location_info := LocationInfo file_0 239 14 239 16. + Definition loc_157 : location_info := LocationInfo file_0 237 20 237 40. + Definition loc_158 : location_info := LocationInfo file_0 237 20 237 22. + Definition loc_159 : location_info := LocationInfo file_0 237 20 237 22. + Definition loc_160 : location_info := LocationInfo file_0 237 25 237 40. + Definition loc_161 : location_info := LocationInfo file_0 237 25 237 32. + Definition loc_162 : location_info := LocationInfo file_0 237 25 237 32. + Definition loc_163 : location_info := LocationInfo file_0 237 33 237 35. + Definition loc_164 : location_info := LocationInfo file_0 237 37 237 39. + Definition loc_169 : location_info := LocationInfo file_0 256 4 256 79. + Definition loc_170 : location_info := LocationInfo file_0 257 4 257 33. + Definition loc_171 : location_info := LocationInfo file_0 258 4 258 18. + Definition loc_172 : location_info := LocationInfo file_0 259 4 259 33. + Definition loc_173 : location_info := LocationInfo file_0 261 1 261 13. + Definition loc_174 : location_info := LocationInfo file_0 261 1 261 6. + Definition loc_175 : location_info := LocationInfo file_0 261 2 261 6. + Definition loc_176 : location_info := LocationInfo file_0 261 2 261 6. + Definition loc_177 : location_info := LocationInfo file_0 261 9 261 12. + Definition loc_178 : location_info := LocationInfo file_0 261 9 261 12. + Definition loc_179 : location_info := LocationInfo file_0 259 12 259 30. + Definition loc_180 : location_info := LocationInfo file_0 259 12 259 25. + Definition loc_181 : location_info := LocationInfo file_0 259 12 259 25. + Definition loc_182 : location_info := LocationInfo file_0 259 26 259 29. + Definition loc_183 : location_info := LocationInfo file_0 259 26 259 29. + Definition loc_184 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_185 : location_info := LocationInfo file_0 258 4 258 17. + Definition loc_186 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_187 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_188 : location_info := LocationInfo file_0 258 11 258 17. + Definition loc_189 : location_info := LocationInfo file_0 258 11 258 14. + Definition loc_190 : location_info := LocationInfo file_0 258 11 258 14. + Definition loc_191 : location_info := LocationInfo file_0 258 15 258 16. + Definition loc_192 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_193 : location_info := LocationInfo file_0 257 4 257 32. + Definition loc_194 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_195 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_196 : location_info := LocationInfo file_0 257 11 257 32. + Definition loc_197 : location_info := LocationInfo file_0 257 11 257 21. + Definition loc_198 : location_info := LocationInfo file_0 257 11 257 21. + Definition loc_199 : location_info := LocationInfo file_0 257 22 257 28. + Definition loc_200 : location_info := LocationInfo file_0 257 22 257 25. + Definition loc_201 : location_info := LocationInfo file_0 257 22 257 25. + Definition loc_202 : location_info := LocationInfo file_0 257 26 257 27. + Definition loc_203 : location_info := LocationInfo file_0 257 30 257 31. + Definition loc_204 : location_info := LocationInfo file_0 256 33 256 78. + Definition loc_205 : location_info := LocationInfo file_0 256 33 256 48. + Definition loc_206 : location_info := LocationInfo file_0 256 33 256 48. + Definition loc_207 : location_info := LocationInfo file_0 256 49 256 77. + Definition loc_208 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_209 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_210 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_211 : location_info := LocationInfo file_0 256 49 256 55. + Definition loc_212 : location_info := LocationInfo file_0 256 49 256 55. + Definition loc_213 : location_info := LocationInfo file_0 256 70 256 76. + Definition loc_214 : location_info := LocationInfo file_0 256 70 256 76. + Definition loc_217 : location_info := LocationInfo file_0 256 20 256 25. + Definition loc_218 : location_info := LocationInfo file_0 256 20 256 25. + Definition loc_219 : location_info := LocationInfo file_0 256 21 256 25. + Definition loc_220 : location_info := LocationInfo file_0 256 21 256 25. + Definition loc_225 : location_info := LocationInfo file_0 276 4 276 53. + Definition loc_226 : location_info := LocationInfo file_0 277 4 278 33. + Definition loc_227 : location_info := LocationInfo file_0 279 4 279 53. + Definition loc_228 : location_info := LocationInfo file_0 280 4 280 36. + Definition loc_229 : location_info := LocationInfo file_0 281 4 281 18. + Definition loc_230 : location_info := LocationInfo file_0 283 4 284 26. + Definition loc_231 : location_info := LocationInfo file_0 286 1 286 13. + Definition loc_232 : location_info := LocationInfo file_0 287 4 287 13. + Definition loc_233 : location_info := LocationInfo file_0 287 11 287 12. + Definition loc_234 : location_info := LocationInfo file_0 286 1 286 6. + Definition loc_235 : location_info := LocationInfo file_0 286 2 286 6. + Definition loc_236 : location_info := LocationInfo file_0 286 2 286 6. + Definition loc_237 : location_info := LocationInfo file_0 286 9 286 12. + Definition loc_238 : location_info := LocationInfo file_0 286 9 286 12. + Definition loc_239 : location_info := LocationInfo file_0 284 8 284 26. + Definition loc_240 : location_info := LocationInfo file_0 284 15 284 25. + Definition loc_241 : location_info := LocationInfo file_0 284 15 284 18. + Definition loc_242 : location_info := LocationInfo file_0 284 15 284 18. + Definition loc_243 : location_info := LocationInfo file_0 284 22 284 25. + Definition loc_244 : location_info := LocationInfo file_0 284 22 284 25. + Definition loc_246 : location_info := LocationInfo file_0 283 8 283 26. + Definition loc_247 : location_info := LocationInfo file_0 283 8 283 21. + Definition loc_248 : location_info := LocationInfo file_0 283 8 283 21. + Definition loc_249 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_250 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_251 : location_info := LocationInfo file_0 281 4 281 7. + Definition loc_252 : location_info := LocationInfo file_0 281 4 281 17. + Definition loc_253 : location_info := LocationInfo file_0 281 4 281 7. + Definition loc_254 : location_info := LocationInfo file_0 281 4 281 7. + Definition loc_255 : location_info := LocationInfo file_0 281 11 281 17. + Definition loc_256 : location_info := LocationInfo file_0 281 11 281 14. + Definition loc_257 : location_info := LocationInfo file_0 281 11 281 14. + Definition loc_258 : location_info := LocationInfo file_0 281 15 281 16. + Definition loc_259 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_260 : location_info := LocationInfo file_0 280 4 280 35. + Definition loc_261 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_262 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_263 : location_info := LocationInfo file_0 280 11 280 35. + Definition loc_264 : location_info := LocationInfo file_0 280 11 280 21. + Definition loc_265 : location_info := LocationInfo file_0 280 11 280 21. + Definition loc_266 : location_info := LocationInfo file_0 280 22 280 28. + Definition loc_267 : location_info := LocationInfo file_0 280 22 280 25. + Definition loc_268 : location_info := LocationInfo file_0 280 22 280 25. + Definition loc_269 : location_info := LocationInfo file_0 280 26 280 27. + Definition loc_270 : location_info := LocationInfo file_0 280 30 280 34. + Definition loc_271 : location_info := LocationInfo file_0 280 30 280 34. + Definition loc_272 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_273 : location_info := LocationInfo file_0 279 4 279 52. + Definition loc_274 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_275 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_276 : location_info := LocationInfo file_0 279 11 279 52. + Definition loc_277 : location_info := LocationInfo file_0 279 11 279 15. + Definition loc_278 : location_info := LocationInfo file_0 279 11 279 15. + Definition loc_279 : location_info := LocationInfo file_0 279 18 279 52. + Definition loc_280 : location_info := LocationInfo file_0 279 19 279 33. + Definition loc_281 : location_info := LocationInfo file_0 279 19 279 26. + Definition loc_282 : location_info := LocationInfo file_0 279 19 279 26. + Definition loc_283 : location_info := LocationInfo file_0 279 27 279 29. + Definition loc_284 : location_info := LocationInfo file_0 279 31 279 32. + Definition loc_285 : location_info := LocationInfo file_0 279 36 279 51. + Definition loc_286 : location_info := LocationInfo file_0 279 36 279 43. + Definition loc_287 : location_info := LocationInfo file_0 279 36 279 43. + Definition loc_288 : location_info := LocationInfo file_0 279 44 279 46. + Definition loc_289 : location_info := LocationInfo file_0 279 48 279 50. + Definition loc_290 : location_info := LocationInfo file_0 277 15 278 32. + Definition loc_291 : location_info := LocationInfo file_0 277 15 277 32. + Definition loc_292 : location_info := LocationInfo file_0 277 16 277 21. + Definition loc_293 : location_info := LocationInfo file_0 277 16 277 21. + Definition loc_294 : location_info := LocationInfo file_0 277 25 277 31. + Definition loc_295 : location_info := LocationInfo file_0 277 25 277 27. + Definition loc_296 : location_info := LocationInfo file_0 277 30 277 31. + Definition loc_297 : location_info := LocationInfo file_0 277 35 277 36. + Definition loc_298 : location_info := LocationInfo file_0 278 31 278 32. + Definition loc_301 : location_info := LocationInfo file_0 276 33 276 52. + Definition loc_302 : location_info := LocationInfo file_0 276 33 276 48. + Definition loc_303 : location_info := LocationInfo file_0 276 33 276 48. + Definition loc_304 : location_info := LocationInfo file_0 276 49 276 51. + Definition loc_305 : location_info := LocationInfo file_0 276 49 276 51. + Definition loc_308 : location_info := LocationInfo file_0 276 20 276 25. + Definition loc_309 : location_info := LocationInfo file_0 276 20 276 25. + Definition loc_310 : location_info := LocationInfo file_0 276 21 276 25. + Definition loc_311 : location_info := LocationInfo file_0 276 21 276 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| @@ -565,8 +300,75 @@ Section code. |}. Solve Obligations with solve_struct_obligations. + (* Definition of function [BIT]. *) + Definition impl_BIT : function := {| + f_args := [ + ("i", it_layout i32) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_2 ; + Return (LocInfoE loc_3 ((LocInfoE loc_4 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_5 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_5 (use{it_layout i32} (LocInfoE loc_6 ("i")))))))) + ]> $∅ + )%E + |}. + + (* Definition of function [GENMASK]. *) + Definition impl_GENMASK : function := {| + f_args := [ + ("h", it_layout i32); + ("l", it_layout i32) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_9 ; + Return (LocInfoE loc_10 ((LocInfoE loc_11 ((LocInfoE loc_12 ((LocInfoE loc_13 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_14 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_15 ((LocInfoE loc_16 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_17 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_17 (use{it_layout i32} (LocInfoE loc_18 ("l")))))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_19 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_19 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_20 ((LocInfoE loc_21 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_22 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_23 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_23 ((LocInfoE loc_24 ((LocInfoE loc_25 ((LocInfoE loc_26 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_27 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_27 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_28 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_28 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_29 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_29 (use{it_layout i32} (LocInfoE loc_30 ("h")))))))))))))) + ]> $∅ + )%E + |}. + + (* Definition of function [FIELD_GET]. *) + Definition impl_FIELD_GET (global___builtin_ffsll : loc): function := {| + f_args := [ + ("_mask", it_layout u64); + ("_reg", it_layout u64) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_33 ; + Return (LocInfoE loc_34 ((LocInfoE loc_35 ((LocInfoE loc_36 (use{it_layout u64} (LocInfoE loc_37 ("_reg")))) &{IntOp u64, IntOp u64} (LocInfoE loc_38 (use{it_layout u64} (LocInfoE loc_39 ("_mask")))))) >>{IntOp u64, IntOp u64} (LocInfoE loc_40 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_40 ((LocInfoE loc_41 (Call (LocInfoE loc_43 (global___builtin_ffsll)) [@{expr} LocInfoE loc_44 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_44 (use{it_layout u64} (LocInfoE loc_45 ("_mask"))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_46 (i2v 1 i32)))))))) + ]> $∅ + )%E + |}. + + (* Definition of function [FIELD_PREP]. *) + Definition impl_FIELD_PREP (global___builtin_ffsll : loc): function := {| + f_args := [ + ("_mask", it_layout u64); + ("_val", it_layout u64) + ]; + f_local_vars := [ + ]; + f_init := "#0"; + f_code := ( + <[ "#0" := + locinfo: loc_49 ; + Return (LocInfoE loc_50 ((LocInfoE loc_51 ((LocInfoE loc_52 (use{it_layout u64} (LocInfoE loc_53 ("_val")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_54 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_54 ((LocInfoE loc_55 (Call (LocInfoE loc_57 (global___builtin_ffsll)) [@{expr} LocInfoE loc_58 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_58 (use{it_layout u64} (LocInfoE loc_59 ("_mask"))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_60 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_61 (use{it_layout u64} (LocInfoE loc_62 ("_mask")))))) + ]> $∅ + )%E + |}. + (* Definition of function [kvm_pte_valid]. *) - Definition impl_kvm_pte_valid : function := {| + Definition impl_kvm_pte_valid (global_BIT : loc): function := {| f_args := [ ("pte", it_layout u64) ]; @@ -575,14 +377,14 @@ Section code. f_init := "#0"; f_code := ( <[ "#0" := - locinfo: loc_2 ; - Return (LocInfoE loc_3 (UnOp (CastOp $ IntOp bool_it) (IntOp u64) (LocInfoE loc_3 ((LocInfoE loc_4 (use{it_layout u64} (LocInfoE loc_5 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_6 ((LocInfoE loc_7 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_8 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_8 (i2v 0 i32)))))))))) + locinfo: loc_65 ; + Return (LocInfoE loc_66 (UnOp (CastOp $ IntOp bool_it) (IntOp u64) (LocInfoE loc_66 ((LocInfoE loc_67 (use{it_layout u64} (LocInfoE loc_68 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_69 (Call (LocInfoE loc_71 (global_BIT)) [@{expr} LocInfoE loc_72 (i2v 0 i32) ])))))) ]> $∅ )%E |}. (* Definition of function [kvm_pte_table]. *) - Definition impl_kvm_pte_table (global___builtin_ffsll global_kvm_pte_valid : loc): function := {| + Definition impl_kvm_pte_table (global_BIT global_FIELD_GET global_kvm_pte_valid : loc): function := {| f_args := [ ("pte", it_layout u64); ("level", it_layout u32) @@ -592,50 +394,51 @@ Section code. f_init := "#0"; f_code := ( <[ "#0" := - locinfo: loc_44 ; - if: LocInfoE loc_44 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_44 ((LocInfoE loc_45 (use{it_layout u32} (LocInfoE loc_46 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_47 ((LocInfoE loc_48 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_49 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_49 (i2v 1 i32))))))))) + locinfo: loc_102 ; + if: LocInfoE loc_102 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_102 ((LocInfoE loc_103 (use{it_layout u32} (LocInfoE loc_104 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_105 ((LocInfoE loc_106 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_107 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_107 (i2v 1 i32))))))))) then - locinfo: loc_41 ; + locinfo: loc_99 ; Goto "#5" else - locinfo: loc_34 ; + locinfo: loc_92 ; Goto "#6" ]> $ <[ "#1" := - locinfo: loc_34 ; - if: LocInfoE loc_34 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_34 ((i2v 0 i32) ={IntOp i32, IntOp i32} (LocInfoE loc_36 (UnOp (CastOp $ IntOp i32) (IntOp bool_it) (LocInfoE loc_36 (Call (LocInfoE loc_38 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_39 (use{it_layout u64} (LocInfoE loc_40 ("pte"))) ]))))))) + locinfo: loc_92 ; + if: LocInfoE loc_92 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_92 ((i2v 0 i32) ={IntOp i32, IntOp i32} (LocInfoE loc_94 (UnOp (CastOp $ IntOp i32) (IntOp bool_it) (LocInfoE loc_94 (Call (LocInfoE loc_96 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_97 (use{it_layout u64} (LocInfoE loc_98 ("pte"))) ]))))))) then - locinfo: loc_31 ; + locinfo: loc_89 ; Goto "#3" else - locinfo: loc_13 ; + locinfo: loc_77 ; Goto "#4" ]> $ <[ "#2" := - locinfo: loc_13 ; - Return (LocInfoE loc_14 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_14 ((LocInfoE loc_15 ((LocInfoE loc_16 ((LocInfoE loc_17 (use{it_layout u64} (LocInfoE loc_18 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_19 ((LocInfoE loc_20 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_21 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_21 (i2v 1 i32)))))))) >>{IntOp u64, IntOp u64} (LocInfoE loc_22 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_22 ((LocInfoE loc_23 (Call (LocInfoE loc_25 (global___builtin_ffsll)) [@{expr} LocInfoE loc_26 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_26 ((LocInfoE loc_27 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_28 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_28 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_29 (i2v 1 i32)))))))) ={IntOp u64, IntOp u64} (LocInfoE loc_30 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_30 (i2v 1 i32)))))))) + locinfo: loc_77 ; + Return (LocInfoE loc_78 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_78 ((LocInfoE loc_79 (Call (LocInfoE loc_81 (global_FIELD_GET)) [@{expr} LocInfoE loc_82 (Call (LocInfoE loc_84 (global_BIT)) [@{expr} LocInfoE loc_85 (i2v 1 i32) ]) ; + LocInfoE loc_86 (use{it_layout u64} (LocInfoE loc_87 ("pte"))) ])) ={IntOp u64, IntOp u64} (LocInfoE loc_88 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_88 (i2v 1 i32)))))))) ]> $ <[ "#3" := - locinfo: loc_31 ; - Return (LocInfoE loc_32 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_32 (i2v 0 i32)))) + locinfo: loc_89 ; + Return (LocInfoE loc_90 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_90 (i2v 0 i32)))) ]> $ <[ "#4" := - locinfo: loc_13 ; + locinfo: loc_77 ; Goto "#2" ]> $ <[ "#5" := - locinfo: loc_41 ; - Return (LocInfoE loc_42 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_42 (i2v 0 i32)))) + locinfo: loc_99 ; + Return (LocInfoE loc_100 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_100 (i2v 0 i32)))) ]> $ <[ "#6" := - locinfo: loc_34 ; + locinfo: loc_92 ; Goto "#1" ]> $∅ )%E |}. (* Definition of function [kvm_set_invalid_pte]. *) - Definition impl_kvm_set_invalid_pte : function := {| + Definition impl_kvm_set_invalid_pte (global_BIT : loc): function := {| f_args := [ ("ptep", void*) ]; @@ -646,17 +449,17 @@ Section code. f_code := ( <[ "#0" := "pte" <-{ it_layout u64 } - LocInfoE loc_64 (use{it_layout u64} (LocInfoE loc_66 (!{void*} (LocInfoE loc_67 ("ptep"))))) ; - locinfo: loc_53 ; - LocInfoE loc_55 (!{void*} (LocInfoE loc_56 ("ptep"))) <-{ it_layout u64 } - LocInfoE loc_57 ((LocInfoE loc_58 (use{it_layout u64} (LocInfoE loc_59 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_60 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_61 ((LocInfoE loc_62 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_63 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_63 (i2v 0 i32))))))))) ; + LocInfoE loc_123 (use{it_layout u64} (LocInfoE loc_125 (!{void*} (LocInfoE loc_126 ("ptep"))))) ; + locinfo: loc_111 ; + LocInfoE loc_113 (!{void*} (LocInfoE loc_114 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_115 ((LocInfoE loc_116 (use{it_layout u64} (LocInfoE loc_117 ("pte")))) &{IntOp u64, IntOp u64} (LocInfoE loc_118 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_119 (Call (LocInfoE loc_121 (global_BIT)) [@{expr} LocInfoE loc_122 (i2v 0 i32) ]))))) ; Return (VOID) ]> $∅ )%E |}. (* Definition of function [kvm_phys_to_pte]. *) - Definition impl_kvm_phys_to_pte (global___builtin_ffsll : loc): function := {| + Definition impl_kvm_phys_to_pte (global_FIELD_PREP global_GENMASK : loc): function := {| f_args := [ ("pa", it_layout u64) ]; @@ -667,36 +470,39 @@ Section code. f_code := ( <[ "#0" := "pte" <-{ it_layout u64 } - LocInfoE loc_135 ((LocInfoE loc_136 (use{it_layout u64} (LocInfoE loc_137 ("pa")))) &{IntOp u64, IntOp u64} (LocInfoE loc_138 ((LocInfoE loc_139 ((LocInfoE loc_140 ((LocInfoE loc_141 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_142 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_143 ((LocInfoE loc_144 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_145 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_145 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_146 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_146 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_147 ((LocInfoE loc_148 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_149 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_150 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_150 ((LocInfoE loc_151 ((LocInfoE loc_152 ((LocInfoE loc_153 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_154 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_154 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_155 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_155 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_156 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_156 (i2v 47 i32))))))))))))) ; - locinfo: loc_132 ; - if: LocInfoE loc_132 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_132 ((LocInfoE loc_133 (i2v 12 i32)) ={IntOp i32, IntOp i32} (LocInfoE loc_134 (i2v 16 i32))))) + LocInfoE loc_157 ((LocInfoE loc_158 (use{it_layout u64} (LocInfoE loc_159 ("pa")))) &{IntOp u64, IntOp u64} (LocInfoE loc_160 (Call (LocInfoE loc_162 (global_GENMASK)) [@{expr} LocInfoE loc_163 (i2v 47 i32) ; + LocInfoE loc_164 (i2v 12 i32) ]))) ; + locinfo: loc_154 ; + if: LocInfoE loc_154 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_154 ((LocInfoE loc_155 (i2v 12 i32)) ={IntOp i32, IntOp i32} (LocInfoE loc_156 (i2v 16 i32))))) then - locinfo: loc_77 ; + locinfo: loc_136 ; Goto "#2" else - locinfo: loc_74 ; + locinfo: loc_133 ; Goto "#3" ]> $ <[ "#1" := - locinfo: loc_74 ; - Return (LocInfoE loc_75 (use{it_layout u64} (LocInfoE loc_76 ("pte")))) + locinfo: loc_133 ; + Return (LocInfoE loc_134 (use{it_layout u64} (LocInfoE loc_135 ("pte")))) ]> $ <[ "#2" := - locinfo: loc_77 ; - LocInfoE loc_78 ("pte") <-{ it_layout u64 } - LocInfoE loc_79 ((LocInfoE loc_80 (use{it_layout u64} (LocInfoE loc_81 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_82 ((LocInfoE loc_83 ((LocInfoE loc_84 ((LocInfoE loc_85 (use{it_layout u64} (LocInfoE loc_86 ("pa")))) >>{IntOp u64, IntOp u64} (LocInfoE loc_87 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_87 (i2v 48 i32)))))) <<{IntOp u64, IntOp u64} (LocInfoE loc_88 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_88 ((LocInfoE loc_89 (Call (LocInfoE loc_91 (global___builtin_ffsll)) [@{expr} LocInfoE loc_92 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_92 ((LocInfoE loc_93 ((LocInfoE loc_94 ((LocInfoE loc_95 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_96 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_97 ((LocInfoE loc_98 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_99 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_99 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_100 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_100 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_101 ((LocInfoE loc_102 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_103 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_104 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_104 ((LocInfoE loc_105 ((LocInfoE loc_106 ((LocInfoE loc_107 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_108 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_108 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_109 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_109 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_110 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_110 (i2v 15 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_111 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_112 ((LocInfoE loc_113 ((LocInfoE loc_114 ((LocInfoE loc_115 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_116 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_117 ((LocInfoE loc_118 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_119 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_119 (i2v 12 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_120 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_120 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_121 ((LocInfoE loc_122 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_123 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_124 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_124 ((LocInfoE loc_125 ((LocInfoE loc_126 ((LocInfoE loc_127 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_128 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_128 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_129 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_129 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_130 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_130 (i2v 15 i32))))))))))))))) ; - locinfo: loc_74 ; + locinfo: loc_136 ; + LocInfoE loc_137 ("pte") <-{ it_layout u64 } + LocInfoE loc_138 ((LocInfoE loc_139 (use{it_layout u64} (LocInfoE loc_140 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_141 (Call (LocInfoE loc_143 (global_FIELD_PREP)) [@{expr} LocInfoE loc_144 (Call (LocInfoE loc_146 (global_GENMASK)) [@{expr} LocInfoE loc_147 (i2v 15 i32) ; + LocInfoE loc_148 (i2v 12 i32) ]) ; + LocInfoE loc_149 ((LocInfoE loc_150 (use{it_layout u64} (LocInfoE loc_151 ("pa")))) >>{IntOp u64, IntOp u64} (LocInfoE loc_152 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_152 (i2v 48 i32))))) ]))) ; + locinfo: loc_133 ; Goto "#1" ]> $ <[ "#3" := - locinfo: loc_74 ; + locinfo: loc_133 ; Goto "#1" ]> $∅ )%E |}. (* Definition of function [kvm_set_table_pte]. *) - Definition impl_kvm_set_table_pte (global___builtin_ffsll global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| + Definition impl_kvm_set_table_pte (global_BIT global_FIELD_PREP global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| f_args := [ ("ptep", void*); ("childp", void*); @@ -710,27 +516,28 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_214 (use{it_layout u64} (LocInfoE loc_216 (!{void*} (LocInfoE loc_217 ("ptep"))))) ; + LocInfoE loc_217 (use{it_layout u64} (LocInfoE loc_219 (!{void*} (LocInfoE loc_220 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_201 (Call (LocInfoE loc_203 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_204 (Call (LocInfoE loc_206 (use{void*} (LocInfoE loc_207 ((LocInfoE loc_208 (!{void*} (LocInfoE loc_209 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_210 (use{void*} (LocInfoE loc_211 ("childp"))) ]) ]) ; - locinfo: loc_162 ; - LocInfoE loc_183 ("pte") <-{ it_layout u64 } - LocInfoE loc_184 ((LocInfoE loc_185 (use{it_layout u64} (LocInfoE loc_186 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_187 ((LocInfoE loc_188 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_188 ((LocInfoE loc_189 (i2v 1 i32)) <<{IntOp i32, IntOp i32} (LocInfoE loc_190 ((LocInfoE loc_191 (Call (LocInfoE loc_193 (global___builtin_ffsll)) [@{expr} LocInfoE loc_194 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_194 ((LocInfoE loc_195 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_196 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_196 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_197 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_198 ((LocInfoE loc_199 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_200 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_200 (i2v 1 i32))))))))) ; - locinfo: loc_163 ; - LocInfoE loc_176 ("pte") <-{ it_layout u64 } - LocInfoE loc_177 ((LocInfoE loc_178 (use{it_layout u64} (LocInfoE loc_179 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_180 ((LocInfoE loc_181 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_182 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_182 (i2v 0 i32))))))) ; - locinfo: loc_164 ; - assert: (LocInfoE loc_171 (Call (LocInfoE loc_173 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_174 (use{it_layout u64} (LocInfoE loc_175 ("old"))) ])) ; - locinfo: loc_165 ; - LocInfoE loc_167 (!{void*} (LocInfoE loc_168 ("ptep"))) <-{ it_layout u64 } - LocInfoE loc_169 (use{it_layout u64} (LocInfoE loc_170 ("pte"))) ; + LocInfoE loc_204 (Call (LocInfoE loc_206 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_207 (Call (LocInfoE loc_209 (use{void*} (LocInfoE loc_210 ((LocInfoE loc_211 (!{void*} (LocInfoE loc_212 ("mm_ops")))) at{struct_kvm_pgtable_mm_ops} "virt_to_phys")))) [@{expr} LocInfoE loc_213 (use{void*} (LocInfoE loc_214 ("childp"))) ]) ]) ; + locinfo: loc_170 ; + LocInfoE loc_192 ("pte") <-{ it_layout u64 } + LocInfoE loc_193 ((LocInfoE loc_194 (use{it_layout u64} (LocInfoE loc_195 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_196 (Call (LocInfoE loc_198 (global_FIELD_PREP)) [@{expr} LocInfoE loc_199 (Call (LocInfoE loc_201 (global_BIT)) [@{expr} LocInfoE loc_202 (i2v 1 i32) ]) ; + LocInfoE loc_203 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_203 (i2v 1 i32))) ]))) ; + locinfo: loc_171 ; + LocInfoE loc_184 ("pte") <-{ it_layout u64 } + LocInfoE loc_185 ((LocInfoE loc_186 (use{it_layout u64} (LocInfoE loc_187 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_188 (Call (LocInfoE loc_190 (global_BIT)) [@{expr} LocInfoE loc_191 (i2v 0 i32) ]))) ; + locinfo: loc_172 ; + assert: (LocInfoE loc_179 (Call (LocInfoE loc_181 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_182 (use{it_layout u64} (LocInfoE loc_183 ("old"))) ])) ; + locinfo: loc_173 ; + LocInfoE loc_175 (!{void*} (LocInfoE loc_176 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_177 (use{it_layout u64} (LocInfoE loc_178 ("pte"))) ; Return (VOID) ]> $∅ )%E |}. (* Definition of function [kvm_set_valid_leaf_pte]. *) - Definition impl_kvm_set_valid_leaf_pte (global___builtin_ffsll global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| + Definition impl_kvm_set_valid_leaf_pte (global_BIT global_FIELD_PREP global_GENMASK global_kvm_phys_to_pte global_kvm_pte_valid : loc): function := {| f_args := [ ("ptep", void*); ("pa", it_layout u64); @@ -746,167 +553,49 @@ Section code. f_code := ( <[ "#0" := "old" <-{ it_layout u64 } - LocInfoE loc_338 (use{it_layout u64} (LocInfoE loc_340 (!{void*} (LocInfoE loc_341 ("ptep"))))) ; + LocInfoE loc_308 (use{it_layout u64} (LocInfoE loc_310 (!{void*} (LocInfoE loc_311 ("ptep"))))) ; "pte" <-{ it_layout u64 } - LocInfoE loc_331 (Call (LocInfoE loc_333 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_334 (use{it_layout u64} (LocInfoE loc_335 ("pa"))) ]) ; + LocInfoE loc_301 (Call (LocInfoE loc_303 (global_kvm_phys_to_pte)) [@{expr} LocInfoE loc_304 (use{it_layout u64} (LocInfoE loc_305 ("pa"))) ]) ; "type" <-{ it_layout u64 } - LocInfoE loc_320 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_320 (IfE + LocInfoE loc_290 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_290 (IfE (IntOp i32) - (LocInfoE loc_321 ((LocInfoE loc_322 (use{it_layout u32} (LocInfoE loc_323 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_324 ((LocInfoE loc_325 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_326 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_326 (i2v 1 i32)))))))) - (LocInfoE loc_327 (i2v 1 i32)) (LocInfoE loc_328 (i2v 0 i32))))) ; - locinfo: loc_224 ; - LocInfoE loc_274 ("pte") <-{ it_layout u64 } - LocInfoE loc_275 ((LocInfoE loc_276 (use{it_layout u64} (LocInfoE loc_277 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_278 ((LocInfoE loc_279 (use{it_layout u64} (LocInfoE loc_280 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_281 ((LocInfoE loc_282 ((LocInfoE loc_283 ((LocInfoE loc_284 ((LocInfoE loc_285 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_286 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_287 ((LocInfoE loc_288 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_289 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_289 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_290 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_290 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_291 ((LocInfoE loc_292 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_293 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_294 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_294 ((LocInfoE loc_295 ((LocInfoE loc_296 ((LocInfoE loc_297 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_298 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_298 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_299 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_299 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_300 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_300 (i2v 11 i32)))))))))))) |{IntOp u64, IntOp u64} (LocInfoE loc_301 ((LocInfoE loc_302 ((LocInfoE loc_303 ((LocInfoE loc_304 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_305 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_306 ((LocInfoE loc_307 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_308 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_308 (i2v 51 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_309 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_309 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_310 ((LocInfoE loc_311 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_312 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_313 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_313 ((LocInfoE loc_314 ((LocInfoE loc_315 ((LocInfoE loc_316 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_317 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_317 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_318 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_318 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_319 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_319 (i2v 63 i32))))))))))))))))) ; - locinfo: loc_225 ; - LocInfoE loc_255 ("pte") <-{ it_layout u64 } - LocInfoE loc_256 ((LocInfoE loc_257 (use{it_layout u64} (LocInfoE loc_258 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_259 ((LocInfoE loc_260 ((LocInfoE loc_261 (use{it_layout u64} (LocInfoE loc_262 ("type")))) <<{IntOp u64, IntOp u64} (LocInfoE loc_263 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_263 ((LocInfoE loc_264 (Call (LocInfoE loc_266 (global___builtin_ffsll)) [@{expr} LocInfoE loc_267 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_267 ((LocInfoE loc_268 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_269 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_269 (i2v 1 i32))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_270 (i2v 1 i32)))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_271 ((LocInfoE loc_272 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_273 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_273 (i2v 1 i32))))))))) ; - locinfo: loc_226 ; - LocInfoE loc_248 ("pte") <-{ it_layout u64 } - LocInfoE loc_249 ((LocInfoE loc_250 (use{it_layout u64} (LocInfoE loc_251 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_252 ((LocInfoE loc_253 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_254 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_254 (i2v 0 i32))))))) ; - locinfo: loc_243 ; - if: LocInfoE loc_243 (Call (LocInfoE loc_245 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_246 (use{it_layout u64} (LocInfoE loc_247 ("old"))) ]) + (LocInfoE loc_291 ((LocInfoE loc_292 (use{it_layout u32} (LocInfoE loc_293 ("level")))) ={IntOp u32, IntOp u32} (LocInfoE loc_294 ((LocInfoE loc_295 (i2v 4 u32)) -{IntOp u32, IntOp u32} (LocInfoE loc_296 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_296 (i2v 1 i32)))))))) + (LocInfoE loc_297 (i2v 1 i32)) (LocInfoE loc_298 (i2v 0 i32))))) ; + locinfo: loc_227 ; + LocInfoE loc_272 ("pte") <-{ it_layout u64 } + LocInfoE loc_273 ((LocInfoE loc_274 (use{it_layout u64} (LocInfoE loc_275 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_276 ((LocInfoE loc_277 (use{it_layout u64} (LocInfoE loc_278 ("attr")))) &{IntOp u64, IntOp u64} (LocInfoE loc_279 ((LocInfoE loc_280 (Call (LocInfoE loc_282 (global_GENMASK)) [@{expr} LocInfoE loc_283 (i2v 11 i32) ; + LocInfoE loc_284 (i2v 2 i32) ])) |{IntOp u64, IntOp u64} (LocInfoE loc_285 (Call (LocInfoE loc_287 (global_GENMASK)) [@{expr} LocInfoE loc_288 (i2v 63 i32) ; + LocInfoE loc_289 (i2v 51 i32) ]))))))) ; + locinfo: loc_228 ; + LocInfoE loc_259 ("pte") <-{ it_layout u64 } + LocInfoE loc_260 ((LocInfoE loc_261 (use{it_layout u64} (LocInfoE loc_262 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_263 (Call (LocInfoE loc_265 (global_FIELD_PREP)) [@{expr} LocInfoE loc_266 (Call (LocInfoE loc_268 (global_BIT)) [@{expr} LocInfoE loc_269 (i2v 1 i32) ]) ; + LocInfoE loc_270 (use{it_layout u64} (LocInfoE loc_271 ("type"))) ]))) ; + locinfo: loc_229 ; + LocInfoE loc_251 ("pte") <-{ it_layout u64 } + LocInfoE loc_252 ((LocInfoE loc_253 (use{it_layout u64} (LocInfoE loc_254 ("pte")))) |{IntOp u64, IntOp u64} (LocInfoE loc_255 (Call (LocInfoE loc_257 (global_BIT)) [@{expr} LocInfoE loc_258 (i2v 0 i32) ]))) ; + locinfo: loc_246 ; + if: LocInfoE loc_246 (Call (LocInfoE loc_248 (global_kvm_pte_valid)) [@{expr} LocInfoE loc_249 (use{it_layout u64} (LocInfoE loc_250 ("old"))) ]) then - locinfo: loc_236 ; + locinfo: loc_239 ; Goto "#2" else - locinfo: loc_228 ; + locinfo: loc_231 ; Goto "#3" ]> $ <[ "#1" := - locinfo: loc_228 ; - LocInfoE loc_232 (!{void*} (LocInfoE loc_233 ("ptep"))) <-{ it_layout u64 } - LocInfoE loc_234 (use{it_layout u64} (LocInfoE loc_235 ("pte"))) ; - locinfo: loc_229 ; - Return (LocInfoE loc_230 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_230 (i2v 1 i32)))) + locinfo: loc_231 ; + LocInfoE loc_235 (!{void*} (LocInfoE loc_236 ("ptep"))) <-{ it_layout u64 } + LocInfoE loc_237 (use{it_layout u64} (LocInfoE loc_238 ("pte"))) ; + locinfo: loc_232 ; + Return (LocInfoE loc_233 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_233 (i2v 1 i32)))) ]> $ <[ "#2" := - locinfo: loc_236 ; - Return (LocInfoE loc_237 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_237 ((LocInfoE loc_238 (use{it_layout u64} (LocInfoE loc_239 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_240 (use{it_layout u64} (LocInfoE loc_241 ("pte")))))))) + locinfo: loc_239 ; + Return (LocInfoE loc_240 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_240 ((LocInfoE loc_241 (use{it_layout u64} (LocInfoE loc_242 ("old")))) ={IntOp u64, IntOp u64} (LocInfoE loc_243 (use{it_layout u64} (LocInfoE loc_244 ("pte")))))))) ]> $ <[ "#3" := - locinfo: loc_228 ; - Goto "#1" - ]> $∅ - )%E - |}. - - (* Definition of function [hyp_map_set_prot_attr]. *) - Definition impl_hyp_map_set_prot_attr (global___builtin_ffsll : loc): function := {| - f_args := [ - ("prot", it_layout u32); - ("data", void*) - ]; - f_local_vars := [ - ("mtype", it_layout u32); - ("sh", it_layout u32); - ("ap", it_layout u32); - ("attr", it_layout u64); - ("device", it_layout bool_it) - ]; - f_init := "#0"; - f_code := ( - <[ "#0" := - "device" <-{ it_layout bool_it } - LocInfoE loc_581 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_581 ((LocInfoE loc_582 (use{it_layout u32} (LocInfoE loc_583 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_584 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_584 (i2v 8 i32))))))) ; - "mtype" <-{ it_layout u32 } - LocInfoE loc_574 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_574 (IfE - (IntOp bool_it) - (LocInfoE loc_575 (use{it_layout bool_it} (LocInfoE loc_576 ("device")))) - (LocInfoE loc_577 (i2v 5 i32)) (LocInfoE loc_578 (i2v 0 i32))))) ; - "attr" <-{ it_layout u64 } - LocInfoE loc_525 ((LocInfoE loc_526 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_526 ((LocInfoE loc_527 (use{it_layout u32} (LocInfoE loc_528 ("mtype")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_529 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_529 ((LocInfoE loc_530 (Call (LocInfoE loc_532 (global___builtin_ffsll)) [@{expr} LocInfoE loc_533 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_533 ((LocInfoE loc_534 ((LocInfoE loc_535 ((LocInfoE loc_536 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_537 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_538 ((LocInfoE loc_539 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_540 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_540 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_541 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_541 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_542 ((LocInfoE loc_543 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_544 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_545 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_545 ((LocInfoE loc_546 ((LocInfoE loc_547 ((LocInfoE loc_548 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_549 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_549 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_550 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_550 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_551 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_551 (i2v 4 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_552 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_553 ((LocInfoE loc_554 ((LocInfoE loc_555 ((LocInfoE loc_556 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_557 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_558 ((LocInfoE loc_559 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_560 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_560 (i2v 2 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_561 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_561 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_562 ((LocInfoE loc_563 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_564 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_565 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_565 ((LocInfoE loc_566 ((LocInfoE loc_567 ((LocInfoE loc_568 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_569 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_569 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_570 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_570 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_571 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_571 (i2v 4 i32))))))))))))) ; - "sh" <-{ it_layout u32 } - LocInfoE loc_522 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_522 (i2v 3 i32))) ; - "ap" <-{ it_layout u32 } - LocInfoE loc_513 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_513 (IfE - (IntOp u32) - (LocInfoE loc_514 ((LocInfoE loc_515 (use{it_layout u32} (LocInfoE loc_516 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_517 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_517 (i2v 2 i32)))))) - (LocInfoE loc_518 (i2v 1 i32)) (LocInfoE loc_519 (i2v 3 i32))))) ; - locinfo: loc_507 ; - if: LocInfoE loc_507 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_507 ((UnOp (CastOp $ IntOp u32) (IntOp i32) (i2v 0 i32)) ={IntOp u32, IntOp u32} (LocInfoE loc_509 ((LocInfoE loc_510 (use{it_layout u32} (LocInfoE loc_511 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_512 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_512 (i2v 4 i32))))))))) - then - locinfo: loc_503 ; - Goto "#10" - else - locinfo: loc_499 ; - Goto "#11" - ]> $ - <[ "#1" := - locinfo: loc_499 ; - if: LocInfoE loc_499 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_499 ((LocInfoE loc_500 (use{it_layout u32} (LocInfoE loc_501 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_502 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_502 (i2v 1 i32))))))) - then - locinfo: loc_486 ; - Goto "#3" - else - locinfo: loc_491 ; - Goto "#9" - ]> $ - <[ "#10" := - locinfo: loc_503 ; - Return (LocInfoE loc_504 (UnOp NegOp (IntOp i32) (LocInfoE loc_505 (i2v 22 i32)))) - ]> $ - <[ "#11" := - locinfo: loc_499 ; + locinfo: loc_231 ; Goto "#1" - ]> $ - <[ "#2" := - locinfo: loc_353 ; - LocInfoE loc_422 ("attr") <-{ it_layout u64 } - LocInfoE loc_423 ((LocInfoE loc_424 (use{it_layout u64} (LocInfoE loc_425 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_426 ((LocInfoE loc_427 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_427 ((LocInfoE loc_428 (use{it_layout u32} (LocInfoE loc_429 ("ap")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_430 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_430 ((LocInfoE loc_431 (Call (LocInfoE loc_433 (global___builtin_ffsll)) [@{expr} LocInfoE loc_434 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_434 ((LocInfoE loc_435 ((LocInfoE loc_436 ((LocInfoE loc_437 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_438 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_439 ((LocInfoE loc_440 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_441 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_441 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_442 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_442 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_443 ((LocInfoE loc_444 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_445 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_446 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_446 ((LocInfoE loc_447 ((LocInfoE loc_448 ((LocInfoE loc_449 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_450 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_450 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_451 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_451 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_452 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_452 (i2v 7 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_453 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_454 ((LocInfoE loc_455 ((LocInfoE loc_456 ((LocInfoE loc_457 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_458 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_459 ((LocInfoE loc_460 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_461 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_461 (i2v 6 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_462 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_462 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_463 ((LocInfoE loc_464 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_465 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_466 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_466 ((LocInfoE loc_467 ((LocInfoE loc_468 ((LocInfoE loc_469 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_470 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_470 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_471 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_471 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_472 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_472 (i2v 7 i32))))))))))))))) ; - locinfo: loc_354 ; - LocInfoE loc_371 ("attr") <-{ it_layout u64 } - LocInfoE loc_372 ((LocInfoE loc_373 (use{it_layout u64} (LocInfoE loc_374 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_375 ((LocInfoE loc_376 (UnOp (CastOp $ IntOp u64) (IntOp u32) (LocInfoE loc_376 ((LocInfoE loc_377 (use{it_layout u32} (LocInfoE loc_378 ("sh")))) <<{IntOp u32, IntOp u32} (LocInfoE loc_379 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_379 ((LocInfoE loc_380 (Call (LocInfoE loc_382 (global___builtin_ffsll)) [@{expr} LocInfoE loc_383 (UnOp (CastOp $ IntOp i64) (IntOp u64) (LocInfoE loc_383 ((LocInfoE loc_384 ((LocInfoE loc_385 ((LocInfoE loc_386 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_387 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_388 ((LocInfoE loc_389 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_390 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_390 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_391 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_391 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_392 ((LocInfoE loc_393 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_394 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_395 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_395 ((LocInfoE loc_396 ((LocInfoE loc_397 ((LocInfoE loc_398 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_399 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_399 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_400 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_400 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_401 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_401 (i2v 9 i32))))))))))))) ])) -{IntOp i32, IntOp i32} (LocInfoE loc_402 (i2v 1 i32)))))))))) &{IntOp u64, IntOp u64} (LocInfoE loc_403 ((LocInfoE loc_404 ((LocInfoE loc_405 ((LocInfoE loc_406 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_407 (i2v 0 u64)))) -{IntOp u64, IntOp u64} (LocInfoE loc_408 ((LocInfoE loc_409 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_410 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_410 (i2v 8 i32)))))))) +{IntOp u64, IntOp u64} (LocInfoE loc_411 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_411 (i2v 1 i32)))))) &{IntOp u64, IntOp u64} (LocInfoE loc_412 ((LocInfoE loc_413 (UnOp NotIntOp (IntOp u64) (LocInfoE loc_414 (i2v 0 u64)))) >>{IntOp u64, IntOp u64} (LocInfoE loc_415 (UnOp (CastOp $ IntOp u64) (IntOp size_t) (LocInfoE loc_415 ((LocInfoE loc_416 ((LocInfoE loc_417 ((LocInfoE loc_418 (i2v (it_layout i64).(ly_size) size_t)) ×{IntOp size_t, IntOp size_t} (LocInfoE loc_419 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_419 (i2v 8 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_420 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_420 (i2v 1 i32)))))) -{IntOp size_t, IntOp size_t} (LocInfoE loc_421 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_421 (i2v 9 i32))))))))))))))) ; - locinfo: loc_355 ; - LocInfoE loc_364 ("attr") <-{ it_layout u64 } - LocInfoE loc_365 ((LocInfoE loc_366 (use{it_layout u64} (LocInfoE loc_367 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_368 ((LocInfoE loc_369 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_370 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_370 (i2v 10 i32))))))) ; - locinfo: loc_356 ; - LocInfoE loc_359 ((LocInfoE loc_360 (!{void*} (LocInfoE loc_361 ("data")))) at{struct_hyp_map_data} "attr") <-{ it_layout u64 } - LocInfoE loc_362 (use{it_layout u64} (LocInfoE loc_363 ("attr"))) ; - locinfo: loc_357 ; - Return (LocInfoE loc_358 (i2v 0 i32)) - ]> $ - <[ "#3" := - locinfo: loc_486 ; - if: LocInfoE loc_486 (UnOp (CastOp $ IntOp bool_it) (IntOp u32) (LocInfoE loc_486 ((LocInfoE loc_487 (use{it_layout u32} (LocInfoE loc_488 ("prot")))) &{IntOp u32, IntOp u32} (LocInfoE loc_489 (UnOp (CastOp $ IntOp u32) (IntOp i32) (LocInfoE loc_489 (i2v 2 i32))))))) - then - locinfo: loc_482 ; - Goto "#7" - else - locinfo: loc_480 ; - Goto "#8" - ]> $ - <[ "#4" := - locinfo: loc_480 ; - if: LocInfoE loc_480 (use{it_layout bool_it} (LocInfoE loc_481 ("device"))) - then - locinfo: loc_476 ; - Goto "#5" - else - locinfo: loc_353 ; - Goto "#6" - ]> $ - <[ "#5" := - locinfo: loc_476 ; - Return (LocInfoE loc_477 (UnOp NegOp (IntOp i32) (LocInfoE loc_478 (i2v 22 i32)))) - ]> $ - <[ "#6" := - locinfo: loc_353 ; - Goto "#2" - ]> $ - <[ "#7" := - locinfo: loc_482 ; - Return (LocInfoE loc_483 (UnOp NegOp (IntOp i32) (LocInfoE loc_484 (i2v 22 i32)))) - ]> $ - <[ "#8" := - locinfo: loc_480 ; - Goto "#4" - ]> $ - <[ "#9" := - locinfo: loc_491 ; - LocInfoE loc_492 ("attr") <-{ it_layout u64 } - LocInfoE loc_493 ((LocInfoE loc_494 (use{it_layout u64} (LocInfoE loc_495 ("attr")))) |{IntOp u64, IntOp u64} (LocInfoE loc_496 ((LocInfoE loc_497 (i2v 1 u64)) <<{IntOp u64, IntOp u64} (LocInfoE loc_498 (UnOp (CastOp $ IntOp u64) (IntOp i32) (LocInfoE loc_498 (i2v 54 i32))))))) ; - locinfo: loc_353 ; - Goto "#2" ]> $∅ )%E |}. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_BIT.v b/linux/casestudies/proofs/pgtable/generated_proof_BIT.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_BIT.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_FIELD_GET.v b/linux/casestudies/proofs/pgtable/generated_proof_FIELD_GET.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_FIELD_GET.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_FIELD_PREP.v b/linux/casestudies/proofs/pgtable/generated_proof_FIELD_PREP.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_FIELD_PREP.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_GENMASK.v b/linux/casestudies/proofs/pgtable/generated_proof_GENMASK.v new file mode 100644 index 00000000..2cdc798b --- /dev/null +++ b/linux/casestudies/proofs/pgtable/generated_proof_GENMASK.v @@ -0,0 +1 @@ +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v b/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v deleted file mode 100644 index 7afb1f35..00000000 --- a/linux/casestudies/proofs/pgtable/generated_proof_hyp_map_set_prot_attr.v +++ /dev/null @@ -1 +0,0 @@ -(* You were too lazy to even write a spec for this function. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 536dd966..14847907 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -58,42 +58,60 @@ Section spec. (* Type definitions. *) + (* Specifications for function [BIT]. *) + Definition type_of_BIT := + fn(∀ i : nat; (i @ (int (i32))); ⌜i < 64⌝) + → ∃ () : (), (((i, 1)%nat) @ (bmask (u64))); True. + + (* Specifications for function [GENMASK]. *) + Definition type_of_GENMASK := + fn(∀ (h, l) : nat * nat; (h @ (int (i32))), (l @ (int (i32))); ⌜h < 64⌝ ∗ ⌜l <= h⌝) + → ∃ () : (), (((l, h - l + 1)%nat) @ (bmask (u64))); True. + (* Specifications for function [__builtin_ffsll]. *) Definition type_of___builtin_ffsll := fn(∀ x : Z; (x @ (int (i64))); True) → ∃ i : nat, ((1 + i) @ (int (i32))); ⌜i < 64⌝ ∗ ⌜Z.testbit x i = true⌝ ∗ ⌜∀ j, j < i -> Z.testbit x j = false⌝. + (* Specifications for function [FIELD_GET]. *) + Definition type_of_FIELD_GET := + fn(∀ (r, a, k) : bin * nat * nat; (((a, k)) @ (bmask (u64))), (r @ (binary (u64))); True) + → ∃ () : (), ((bin_slice a k r ++ replicate (64 - k) false) @ (binary (u64))); True. + + (* Specifications for function [FIELD_PREP]. *) + Definition type_of_FIELD_PREP := + fn(∀ (a, k, v) : nat * nat * bin; (((a, k)) @ (bmask (u64))), (v @ (binary (u64))); True) + → ∃ () : (), (((a, k, take k v)) @ (bdata (u64))); True. + (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := - fn(∀ pte : (bvec Pte); (pte @ (bitvec (Pte))); True) + fn(∀ pte : bin; (pte @ (binary (u64))); True) → ∃ () : (), ((pte.[valid]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := - fn(∀ (pte, level) : (bvec Pte) * Z; (pte @ (bitvec (Pte))), (level @ (int (u32))); True) + fn(∀ (pte, level) : bin * Z; (pte @ (binary (u64))), (level @ (int (u32))); True) → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := - fn(∀ (pte, p) : (bvec Pte) * loc; (p @ (&own (pte @ (bitvec (Pte))))); True) - → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (bitvec (Pte)))). + fn(∀ (pte, p) : bin * loc; (p @ (&own (pte @ (binary (u64))))); True) + → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (binary (u64)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ () : (), ((0%%Pte.[addr := pa%%Pte.[addr]]) @ (bitvec (Pte))); True. + → ∃ () : (), ((0%%Pte.[addr := pa%%Pte.[addr]]) @ (binary (u64))); True. (* Specifications for function [kvm_set_table_pte]. *) Definition type_of_kvm_set_table_pte := - fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * (bvec Pte) * Z * mm_ops; (p @ (&own (pte @ (bitvec (Pte))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte.[valid] = true⌝) - → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]) @ (bitvec (Pte)))). + fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * bin * Z * mm_ops; (p @ (&own (pte @ (binary (u64))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte.[valid] = true⌝) + → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]) @ (binary (u64)))). (* Specifications for function [kvm_set_valid_leaf_pte]. *) Definition type_of_kvm_set_valid_leaf_pte := - fn(∀ (p, pte, pa, attr, level) : loc * (bvec Pte) * Z * (bvec Pte) * Z; (p @ (&own (pte @ (bitvec (Pte))))), (pa @ (int (u64))), (attr @ (bitvec (Pte))), (level @ (int (u32))); True) - → ∃ (is_page, pte1) : bool * (bvec Pte), ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (bitvec (Pte)))). - - (* Function [hyp_map_set_prot_attr] has been skipped. *) + fn(∀ (p, pte, pa, attr, level) : loc * bin * Z * bin * Z; (p @ (&own (pte @ (binary (u64))))), (pa @ (int (u64))), (attr @ (binary (u64))), (level @ (int (u32))); True) + → ∃ (is_page, pte1) : bool * bin, ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (binary (u64)))). End spec. Typeclasses Opaque kvm_pgtable_mm_ops_rec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 12121a14..08ce7e5a 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -8,17 +8,21 @@ Definition KVM_PGTABLE_MAX_LEVELS := 4. (* pte *) +Definition valid := bool_field 0. (* 0 *) +Definition page_or_table := bool_field 1. (* 1 *) +Definition leaf_attr_lo := data_field 2 10. (* 2..11 *) +Definition addr := data_field 12 36. (* 12..47 *) +(* 48..50 : undef *) +Definition leaf_attr_hi := data_field 51 13. (* 51..63 *) + Definition Pte : bitvec_type := {| bt_byte_size_log := 3; (* 2^3 * 8 = 64 *) - bt_spec := [# bool_field; bool_field; data_field 10; data_field 36; undef_field 3; data_field 13]; - bt_length_eq := ltac:(done); + bt_spec := [valid; page_or_table; leaf_attr_lo; leaf_attr_hi]; |}. +(* +Global Instance simpl_check_mask N k x y : + SimplAnd (check_mask (Z_to_bin N (1 ≪ k)) = Some (x, y)) + (λ T, x = Z.to_nat k ∧ y = 1%nat ∧ T). +Admitted. *) -(* interesting fields *) -Definition valid : fin 6 := 0%fin. (* 0 *) -Definition page_or_table : fin 6 := 1%fin. (* 1 *) -Definition leaf_attr_lo : fin 6 := 2%fin. (* 2..11 *) -Definition addr : fin 6 := 3%fin. (* 12..47 *) -(* 48..50 : undef *) -Definition leaf_attr_hi : fin 6 := 5%fin. (* 51..63 *) - +Arguments replicate : simpl never. diff --git a/linux/casestudies/proofs/pgtable/proof_files b/linux/casestudies/proofs/pgtable/proof_files index ba90f13a..2e996ca6 100644 --- a/linux/casestudies/proofs/pgtable/proof_files +++ b/linux/casestudies/proofs/pgtable/proof_files @@ -1,5 +1,8 @@ +generated_proof_BIT.v +generated_proof_FIELD_GET.v +generated_proof_FIELD_PREP.v +generated_proof_GENMASK.v generated_proof___builtin_ffsll.v -generated_proof_hyp_map_set_prot_attr.v generated_proof_kvm_phys_to_pte.v generated_proof_kvm_pte_table.v generated_proof_kvm_pte_valid.v diff --git a/theories/typing/binary.v b/theories/typing/binary.v new file mode 100644 index 00000000..e87d1ccc --- /dev/null +++ b/theories/typing/binary.v @@ -0,0 +1,188 @@ +From refinedc.typing Require Export type. +From refinedc.typing Require Import programs. +Set Default Proof Using "Type". + +Section bin. + + (* The first element is the least significant bit. *) + Definition bin : Type := list bool. + + Definition bin_to_bool (v : bin) : bool := + match v with + | [] => false + | b :: _ => b + end. + + Declare Scope bin_scope. + + Definition bin_and (lhs rhs : bin) : bin := zip_with (&&) lhs rhs. + + Definition bin_or (lhs rhs : bin) : bin := zip_with (||) lhs rhs. + + Definition bin_xor (lhs rhs : bin) : bin := zip_with xorb lhs rhs. + + Definition bin_neg (v : bin) : bin := negb <$> v. + + Definition bin_shl (v : bin) (k : nat) : bin := + if bool_decide (k ≤ length v) + then replicate k false ++ take (length v - k) v + else replicate (length v) false. + Infix "<<" := bin_shl (at level 60) : bin_scope. + + Definition bin_shr (v : bin) (k : nat) : bin := + if bool_decide (k ≤ length v) + then drop k v ++ replicate k false + else replicate (length v) false. + Infix ">>" := bin_shr (at level 60) : bin_scope. + + Open Scope bin_scope. + + (* Operands are assumed to have the same length, and the output should be length-preserved. *) + + Lemma bin_and_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_and v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_or_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_or v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_xor_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_xor v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_neg_length v : + length (bin_neg v) = length v. + Proof. by rewrite fmap_length. Qed. + + Lemma bin_shl_length v n : + length (v << n) = length v. + Proof. + rewrite /bin_shl. case_bool_decide. + - rewrite app_length replicate_length take_length min_l; lia. + - by rewrite replicate_length. + Qed. + + Lemma bin_shr_length v n : + length (v >> n) = length v. + Proof. + rewrite /bin_shr. case_bool_decide. + - rewrite app_length replicate_length drop_length. lia. + - by rewrite replicate_length. + Qed. + + (* Z <-> bin *) + Fixpoint Z_slice (i len : nat) (n : Z) : list bool := + match len with + | O => [] + | S k => Z.testbit n i :: Z_slice (S i) k n + end. + + Definition Z_to_bin (len : nat) (int : Z) : bin := + Z_slice 0 len int. + + Fixpoint rev_bin_to_Z (v : bin) : Z := + match v with + | [] => 0 + | true :: v' => 2 ^ (length v - 1) + rev_bin_to_Z v' + | false :: v' => rev_bin_to_Z v' + end. + + Lemma rev_bin_to_Z_range v : + -1 < rev_bin_to_Z v < 2 ^ length v. + Proof. + induction v as [|[|] v IHv]; cbn; split; try lia. + all: move: IHv; move: (length v) => n. + - suff : 0 < 2 ^ (S n - 1) by lia. + apply Z.pow_pos_nonneg; lia. + - suff : 2 ^ (S n - 1) + 2 ^ n ≤ 2 ^ S n by lia. + have -> : S n - 1 = n by lia. + have -> : 2 ^ S n = 2 ^ (n + 1) by lia. + rewrite Zpower_exp; lia. + - suff : 2 ^ n < 2 ^ S n by lia. + apply Z.pow_lt_mono_r; lia. + Qed. + + Definition bin_to_Z (v : bin) : Z := rev_bin_to_Z (reverse v). + + Lemma bin_to_Z_to_bin v : + Z_to_bin (length v) (bin_to_Z v) = v. + Admitted. + + (* range operations *) + Definition bin_slice (start len : nat) (v : bin) : bin := + drop start (take (start + len) v). + + Definition bin_update (start len : nat) (new : bin) (v : bin) : bin := + take start v ++ new ++ drop (start + len) v. + + (* A mask is a special `bin` with the following form: + least significant <-- 0..01..10..0 --> most significant + | | | + 0 a a+k-1 + *) + (* This function checks if a `bin` is a mask: if so, returns `(a, k)`. *) + (* NOTE: stdpp.list has a `mask` function which does a "generic land" on list. *) + Definition check_mask (v : bin) : option (nat * nat) := + p1 ← list_find (λ b, b = true) v ; + p2 ← list_find (λ b, b = true) (reverse v) ; + let start := p1.1 in + let len := (length v - p2.1 - p1.1)%nat in + if bool_decide (Forall (λ b, b = true) (bin_slice start len v)) + then Some (start, len) + else None. + + Definition mk_mask (a k : nat) (len : nat) : bin := + replicate a false ++ replicate k true ++ replicate (len - a - k) false. + + Definition mk_data (a k : nat) (v : bin) (len : nat) : bin := + replicate a false ++ v ++ replicate (len - a - k) false. + + (* val <-> bin *) + Fixpoint bool_vec_to_nat {n} (v : vec bool n) : nat := + match v with + | [#] => 0 + | true ::: v => 2 * (bool_vec_to_nat v) + 1 + | false ::: v => 2 * (bool_vec_to_nat v) + end. + + Lemma bool_vec_to_nat_range n (v : vec bool n) : + bool_vec_to_nat v < 2 ^ n. + Proof. + Admitted. + + Program Definition byte_of_bool_vec (v : vec bool 8) : byte := {| + byte_val := bool_vec_to_nat v; + |}. + Next Obligation. + move => v. split; [ lia | by apply bool_vec_to_nat_range ]. + Qed. + + Fixpoint val_of_bin (bv : bin) : option val := + match bv with + | [] => Some [] + | b0 :: b1 :: b2 :: b3 :: b4 :: b5 :: b6 :: b7 :: v => + bytes ← val_of_bin v; + Some (MByte (byte_of_bool_vec [# b0; b1; b2; b3; b4; b5; b6; b7]) :: bytes) + | _ => None + end. + + Definition b2v (bv : bin) : val := + default [MPoison] (val_of_bin bv). + + Definition bin_of_val (v : val) : bin. + Admitted. + + Definition bin_to_int (bv : bin) (it : int_type) : option Z := + if decide (bits_per_int it = length bv) then + let z := Z.of_nat (bool_vec_to_nat (list_to_vec bv)) in + if it.(it_signed) && bool_decide (int_half_modulus it ≤ z) + then Some (z - int_modulus it) + else Some z + else None. + + (* NOTE: this just returns a "data" *) + Definition bin_mask_and (v : bin) (a k : nat) : bin := + replicate a false ++ bin_slice a k v ++ replicate (length v - a - k) false. + +End bin. diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 949deb24..8cc22b63 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -1,65 +1,42 @@ From refinedc.typing Require Export type. -From refinedc.typing Require Import programs. +From refinedc.typing Require Import programs binary int. Set Default Proof Using "Type". -(** Representation of a bit vector type (specification of fields). *) - -(* TODO: only keep user-needed definitions in this file? *) - -Record field_desc := - FieldDesc { - fd_len : nat; - fd_type : Type; - fd_encode : fd_type → vec bool fd_len; - fd_decode : vec bool fd_len → fd_type; - encode_decode : ∀ x, fd_decode (fd_encode x) = x; +Record field := + Field { + field_offset : nat; + field_len : nat; + field_type : Type; + field_encode : field_type → bin; + field_decode : bin → field_type; + encode_decode : ∀ x, field_decode (field_encode x) = x; }. -Program Definition bool_field := {| - fd_len := 1; - fd_type := bool; - fd_encode b := [# b]; - fd_decode v := v !!! 0%fin; +Program Definition bool_field (offset : nat) := {| + field_offset := offset; + field_len := 1; + field_type := bool; + field_encode b := [b]; + field_decode v := match head v with Some b => b | None => false end; |}. Next Obligation. done. Qed. -Program Definition data_field (len : nat) := {| - fd_len := len; - fd_type := vec bool len; - fd_encode := id; - fd_decode := id; +Program Definition data_field (offset len : nat) := {| + field_offset := offset; + field_len := len; + field_type := bin; + field_encode := id; + field_decode := id; |}. Next Obligation. done. Qed. Program Definition undef_field := data_field. -Fixpoint length_fields (l : list field_desc) : nat := - match l with - | [] => 0 - | x :: xs => fd_len x + length_fields xs - end. - -Lemma length_fields_take l i fd : - l !! i = Some fd → - (length_fields (take i l) + fd_len fd ≤ length_fields l)%nat. -Proof. - move: i. - induction l as [|x l IH]; first done. - destruct i; move => ?. - - have -> : x = fd by naive_solver. - cbn. lia. - - have Hl : l !! i = Some fd by naive_solver. - have := IH i Hl. - cbn. lia. -Qed. - Record bitvec_type := BitvecType { bt_byte_size_log : nat; bt_length : nat := 8 * 2 ^ bt_byte_size_log; - bt_fields : nat; - bt_spec : vec field_desc bt_fields; - bt_length_eq : bt_length = length_fields bt_spec; + bt_spec : list field; }. Definition bt_layout (bt : bitvec_type) : layout := {| @@ -183,36 +160,28 @@ Section bool_vec. by rewrite map_length vec_to_list_length. Qed. - Fixpoint Z_slice (i len : nat) (n : Z) : vec bool len := + Fixpoint Z_slice_v (i len : nat) (n : Z) : vec bool len := match len with | O => [#] - | S k => Z.testbit n i ::: Z_slice (S i) k n + | S k => Z.testbit n i ::: Z_slice_v (S i) k n end. End bool_vec. Section bitvec_op. - Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bvec bt := + Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bin := Z_slice 0 (bt_length bt) n. - Program Definition fd_range (bt : bitvec_type) (i : fin (bt_fields bt)) : vec_range (bt_length bt) (fd_len (bt_spec bt !!! i)) := - {| range_start := length_fields (take i (bt_spec bt)) |}. - Next Obligation. - move => ? ?. - rewrite bt_length_eq. - by apply length_fields_take, vlookup_lookup. - Qed. - (* TODO: maybe not needed? *) (* Global Instance bvec_eq_dec {bt : bitvec_type} : EqDecision (bvec bt). *) (* Proof. solve_decision. Qed. *) - Definition bvec_get {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) : fd_type (bt_spec bt !!! i) := - fd_decode (bt_spec bt !!! i) (vec_slice bv (fd_range bt i)). + Definition bvec_get (bv : bin) (f : field) : field_type f := + field_decode f (bin_slice (field_offset f) (field_len f) bv). - Definition bvec_put {bt : bitvec_type} (bv : bvec bt) (i : fin (bt_fields bt)) (x : fd_type (bt_spec bt !!! i)) : bvec bt := - vec_update bv (fd_encode (bt_spec bt !!! i) x) (fd_range bt i). + Definition bvec_put (bv : bin) (f : field) (x : field_type f) : bin := + bin_update (field_offset f) (field_len f) (field_encode f x) bv. End bitvec_op. @@ -244,32 +213,439 @@ Proof. rewrite /bvec_get /bvec_put. case_match => //. Qed. *) +(* +Section bin. + + (* The first element is the least significant bit. *) + Definition bin : Type := list bool. + + Declare Scope bin_scope. + + Definition bin_and (lhs rhs : bin) : bin := zip_with (&&) lhs rhs. + + Definition bin_or (lhs rhs : bin) : bin := zip_with (||) lhs rhs. + + Definition bin_xor (lhs rhs : bin) : bin := zip_with xorb lhs rhs. + + Definition bin_neg (v : bin) : bin := negb <$> v. + + Definition bin_shl (v : bin) (k : nat) : bin := + if bool_decide (k ≤ length v) + then replicate k false ++ take (length v - k) v + else replicate (length v) false. + Infix "<<" := bin_shl (at level 60) : bin_scope. + + Definition bin_shr (v : bin) (k : nat) : bin := + if bool_decide (k ≤ length v) + then drop k v ++ replicate k false + else replicate (length v) false. + Infix ">>" := bin_shr (at level 60) : bin_scope. + + Open Scope bin_scope. + + (* Operands are assumed to have the same length, and the output should be length-preserved. *) + + Lemma bin_and_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_and v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_or_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_or v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_xor_length v1 v2 n : + length v1 = n → length v2 = n → length (bin_xor v1 v2) = n. + Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. + + Lemma bin_neg_length v : + length (bin_neg v) = length v. + Proof. by rewrite fmap_length. Qed. + + Lemma bin_shl_length v n : + length (v << n) = length v. + Proof. + rewrite /bin_shl. case_bool_decide. + - rewrite app_length replicate_length take_length min_l; lia. + - by rewrite replicate_length. + Qed. + + Lemma bin_shr_length v n : + length (v >> n) = length v. + Proof. + rewrite /bin_shr. case_bool_decide. + - rewrite app_length replicate_length drop_length. lia. + - by rewrite replicate_length. + Qed. + + (* Z <-> bin *) + Fixpoint Z_slice (i len : nat) (n : Z) : list bool := + match len with + | O => [] + | S k => Z.testbit n i :: Z_slice (S i) k n + end. + + Definition Z_to_bin (len : nat) (int : Z) : bin := + Z_slice 0 len int. + + Fixpoint rev_bin_to_Z (v : bin) : Z := + match v with + | [] => 0 + | true :: v' => 2 ^ (length v - 1) + rev_bin_to_Z v' + | false :: v' => rev_bin_to_Z v' + end. + + Lemma rev_bin_to_Z_range v : + -1 < rev_bin_to_Z v < 2 ^ length v. + Proof. + induction v as [|[|] v IHv]; cbn; split; try lia. + all: move: IHv; move: (length v) => n. + - suff : 0 < 2 ^ (S n - 1) by lia. + apply Z.pow_pos_nonneg; lia. + - suff : 2 ^ (S n - 1) + 2 ^ n ≤ 2 ^ S n by lia. + have -> : S n - 1 = n by lia. + have -> : 2 ^ S n = 2 ^ (n + 1) by lia. + rewrite Zpower_exp; lia. + - suff : 2 ^ n < 2 ^ S n by lia. + apply Z.pow_lt_mono_r; lia. + Qed. + + Definition bin_to_Z (v : bin) : Z := rev_bin_to_Z (reverse v). + + Lemma bin_to_Z_to_bin v : + Z_to_bin (length v) (bin_to_Z v) = v. + Admitted. + + Fixpoint Z_range (start : Z) (len : nat) : list Z := + match len with + | 0%nat => [] + | S k => start :: Z_range (start + 1) k + end. + + Lemma Z_range_length k : + ∀ a, length (Z_range a k) = k. + Proof. + induction k => // a. + cbn. by apply f_equal. + Qed. + + Lemma Z_range_lookup_Some a k i : + (i < k)%nat → (Z_range a k) !! i = Some (a + i). + Admitted. + + Lemma Z_range_elem a k x : + x ∈ Z_range a k ↔ a ≤ x < a + k. + Admitted. + + Lemma Z_range_take a n k : + (n ≤ k)%nat → take n (Z_range a k) = Z_range a n. + Admitted. + + Lemma Z_range_drop a n k : + (n ≤ k)%nat → drop n (Z_range a k) = Z_range (a + n) (k - n). + Admitted. + + Lemma Z_range_app a k l : + Z_range a k ++ Z_range (a + k) l = Z_range a (k + l). + Admitted. *) + + (* Fixpoint indices (len : nat) : list nat := + match len with + | 0%nat => [] + | S k => indices k ++ [k] + end. + + Lemma indices_length n : + length (indices n) = n. + Proof. + induction n. + - done. + - cbn. rewrite app_length. cbn. lia. + Qed. + + Lemma indices_lookup n i: + (i < n)%nat → indices n !! i = Some i. + Proof. + (* split; move => ?. *) + move => ?. + (* - have <- : length (indices n) = n by apply indices_length. *) + (* by apply: lookup_lt_Some. *) + induction n as [|n IHn]; first lia. + cbn. destruct (decide (i = n)) as [->|]. + + rewrite lookup_app_r indices_length; last lia. + by have -> : (n - n = 0)%nat by lia. + + have ? : (i < n)%nat by lia. + rewrite lookup_app_l ?indices_length => //. + by apply IHn. + Qed. *) + + (* Z -> bin *) + (* Definition Z_to_bin' (len : nat) (int : Z) : bin := + Z.testbit int <$> Z_range 0 len. + + Lemma Z_to_bin_length n x : + length (Z_to_bin' n x) = n. + Proof. + by rewrite fmap_length Z_range_length. + Qed. + + (* Z_to_bin is a homomorphism from Z to bin, i.e. preserves all operations *) + Lemma Z_land_to_bin_and n x y : + Z_to_bin' n (Z.land x y) = bin_and (Z_to_bin' n x) (Z_to_bin' n y). + Proof. + rewrite /Z_to_bin /bin_and. + rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. + apply Forall_fmap_ext, Forall_forall => ? _. + by rewrite Z.land_spec. + Qed. + + Lemma Z_lor_to_bin_or n x y : + Z_to_bin' n (Z.lor x y) = bin_or (Z_to_bin n x) (Z_to_bin n y). + Proof. + rewrite /Z_to_bin /bin_or. + rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. + apply Forall_fmap_ext, Forall_forall => ? _. + by rewrite Z.lor_spec. + Qed. + + Lemma Z_lxor_to_bin_xor n x y : + Z_to_bin n (Z.lxor x y) = bin_xor (Z_to_bin n x) (Z_to_bin n y). + Proof. + rewrite /Z_to_bin /bin_xor. + rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. + apply Forall_fmap_ext, Forall_forall => ? _. + by rewrite Z.lxor_spec. + Qed. + + Lemma Z_lnot_to_bin_and n x : + Z_to_bin n (Z.lnot x) = bin_neg (Z_to_bin n x). + Proof. + rewrite /Z_to_bin /bin_neg -list_fmap_compose. + apply Forall_fmap_ext, Forall_forall => ? /Z_range_elem ?. + cbn. rewrite Z.lnot_spec; [done | lia]. + Qed. + + Lemma app_eq A (xs1 xs2 ys1 ys2 : list A): + xs1 = xs2 → ys1 = ys2 → xs1 ++ ys1 = xs2 ++ ys2. + Proof. congruence. Qed. + + Lemma Z_shiftl_to_bin_shl n x k : + Z_to_bin n (x ≪ Z.of_nat k) = (Z_to_bin n x) << k. + Proof. + rewrite /Z_to_bin /bin_shl fmap_length Z_range_length. + case_bool_decide. + - have {1}-> : (n = k + (n - k))%nat by lia. + rewrite -Z_range_app fmap_app. + apply app_eq. + + eapply list_eq_same_length. + by rewrite replicate_length. + by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. + rewrite Z.shiftl_spec_low; [congruence|lia]. + + rewrite -fmap_take Z_range_take; last lia. + eapply list_eq_same_length. + 1, 2: by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite !list_lookup_fmap !Z_range_lookup_Some; [cbn|lia..]. + have ? : (0 + k + i - k) = 0 + i by lia. + rewrite Z.shiftl_spec; [congruence | lia]. + - eapply list_eq_same_length. + by rewrite replicate_length. + by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. + rewrite Z.shiftl_spec_low; [congruence|lia]. + Qed. + + Lemma Z_shiftr_to_bin_shr n x k : + Z_to_bin n (x ≫ Z.of_nat k) = (Z_to_bin n x) >> k. + Proof. + rewrite /Z_to_bin /bin_shr fmap_length Z_range_length. + case_bool_decide. + - rewrite -fmap_drop Z_range_drop; last lia. + have {1}-> : (n = (n - k) + k)%nat by lia. + rewrite -Z_range_app fmap_app. + apply app_eq. + + eapply list_eq_same_length. + 1, 2: by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite !list_lookup_fmap !Z_range_lookup_Some; [cbn|lia..]. + have ? : 0 + i + k = 0 + k + i by lia. + rewrite Z.shiftr_spec; [congruence | lia]. + + eapply list_eq_same_length. + by rewrite replicate_length. + by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. + rewrite Z.shiftr_spec; admit. + - eapply list_eq_same_length. + by rewrite replicate_length. + by rewrite fmap_length Z_range_length. + move => i b1 b2 ?. + rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. + rewrite Z.shiftl_spec; admit. + Admitted. + *) + + (* + Definition mask (v : bin) : Prop := + ∃ a k, v = replicate a false ++ replicate k true ++ replicate (length v - a - k) false. + + Lemma bin_and_zero v n : + (n = length v)%nat → + bin_and v (replicate n false) = replicate n false. + Proof. + move => ->. + rewrite /bin_and zip_with_replicate_r ?/flip => //. + apply const_fmap, andb_false_r. + Qed. + + Lemma bin_and_neg_zero v n : + (length v ≤ n)%nat → + bin_and v (replicate n true) = v. + Proof. + move => ?. + rewrite /bin_and zip_with_replicate_r ?/flip => //. + Admitted. + +*) + (* mask a k = 000..0111..1 + | | + a a+k-1 *) + (* Inductive mask : Type := mk_mask : nat → nat → mask. + + Definition mask_to_bin (m : mask) : bin := + match m with + | mk_mask a k => replicate a false ++ replicate k true + end. + + Coercion mask_to_bin : mask >-> bin. + + Definition mask_zero : mask := mk_mask 0 0. + + Definition mask_one : mask := mk_mask 0 1. + + (* ~0 = 111..1 *) + Definition mask_neg_zero (len : nat) : mask := mk_mask 0 len. + + Definition mask_shl (lhs : mask) (rhs : nat) : mask := + match lhs with + | mk_mask a k => mk_mask (a + rhs) k + end. + + (* BIT(i) := 1 << i ==> mask_shl mask_one i = mk_mask i 1 *) + Example BIT_spec i : + mask_shl mask_one i = mk_mask i 1. + Proof. done. Qed. + + Definition mask_shr (lhs : mask) (rhs : nat) : mask := + match lhs with + | mk_mask a k => + if bool_decide (rhs ≤ a)%nat then mk_mask (a - rhs) k + else mk_mask 0 (k - (rhs - a)) + end. + + (* GENMASK(h,0) := ~0 >> (N-1-h) *) + Example GENMASK_h_spec N h : + (h < N)%nat → + mask_shr (mask_neg_zero N) (N - 1 - h) = mk_mask 0 (h + 1). + Proof. + move => ?. + cbn. case_bool_decide. + - have -> : (N - 1 - h = 0)%nat by lia. + by have -> : (N = h + 1)%nat by lia. + - by have -> : (N - (N - 1 - h - 0) = h + 1)%nat by lia. + Qed. + + Definition mask_clear (lhs : mask) (rhs : nat) : mask := + match lhs with + | mk_mask a k => + if bool_decide (rhs ≤ k)%nat then mk_mask (a + rhs) (k - rhs) + else mask_zero + end. + + (* GENMASK(N-1,l) := ~0 - (1 << l) + 1 *) + Example GENMASK_l_spec N l : + (l ≤ N)%nat → + mask_clear (mask_neg_zero N) l = mk_mask l (N - l). + Proof. + move => ?. + cbn. case_bool_decide => //. + Qed. + + Definition mask_and (lhs rhs : mask) : mask := + match lhs, rhs with + | mk_mask a k, mk_mask b l => mk_mask (a `max` b) (min (a + k) (b + l) - a `max` b) + end. + + (* GENMASK(h,l) := GENMASK(N-1,l) & GENMASK(h,0) *) + Example GENMASK_spec N l h : + (h < N)%nat → + mask_and (mk_mask l (N - l)) (mk_mask 0 (h + 1)) = mk_mask l (h + 1 - l). + Proof. + move => ?. cbn. + rewrite max_l ?min_r => //; lia. + Qed. + + Definition bin_slice (offset len : nat) (v : bin) : bin := + drop offset (take (offset + len) v). + + Lemma bin_and_mask a k v : + bin_and v (mk_mask a k) = replicate a false ++ bin_slice a k v. + Proof. + (* cbn. rewrite /bin_and /bin_slice. *) + (* Search zip_with app. *) + Admitted. + + + (* FIELD_GET(m,v) := (v & m) >> __bf_shf(m) *) + Example FIELD_GET_spec a k v : + bin_shr (bin_and v (mk_mask a k)) a = bin_slice a k v. + Proof. + cbn. + rewrite /bin_shr /bin_slice /bin_and. + rewrite zip_with_app_r replicate_length. + Search (drop _ (take (_ + _) _)). + + zip_with_app_r. replicate_length. + length_replicate. + + Check drop_take_drop. + Search (drop _ = drop _ _). + + Example FIELD_GET_0_spec k v : + bin_and v (mk_mask 0 k) = bin_slice 0 k v. + Proof. + apply (FIELD_GET_spec 0 k v). + Qed. *) + + Section bitvec. Context `{!typeG Σ}. - Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bvec bt) : type := {| - ty_own β l := (∃ v, ⌜val_of_bool_vec bv = v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I + Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bin) : type := {| + ty_own β l := (∃ v, ⌜val_of_bin bv = Some v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I |}. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. Qed. Program Definition bitvec (bt : bitvec_type) : rtype := {| - rty_type := bvec bt; + rty_type := bin; rty := bitvec_inner_type bt; |}. Global Program Instance rmovable_bitvec bt : RMovable (bitvec bt) := {| rmovable bv := {| ty_layout := bt_layout bt; - ty_own_val v := ⌜val_of_bool_vec bv = v⌝%I; + ty_own_val v := ⌜val_of_bin bv = Some v⌝%I; |} |}. Next Obligation. iIntros (bt bv l). by iDestruct 1 as (???)"?". Qed. Next Obligation. - iIntros (bt bv v <-). iPureIntro. - by rewrite /has_layout_val val_of_bool_vec_length. - Qed. + (* iIntros (bt bv v <-). iPureIntro. *) + (* by rewrite /has_layout_val val_of_bool_vec_length. *) + Admitted. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hl Hv) "Hl". iExists _. by iFrame. @@ -277,7 +653,7 @@ Section bitvec. Next Obligation. iIntros (it bv l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. Next Obligation. iIntros (bt x1 x2). done. Qed. - Global Program Instance bitvec_copyable bt v : Copyable (v @ bitvec bt). + Global Program Instance bitvec_copyable bt bv : Copyable (bv @ bitvec bt). Next Obligation. iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. @@ -287,3 +663,219 @@ Section bitvec. End bitvec. Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. + +Section binary. + + Context `{!typeG Σ}. + + Program Definition binary_inner_type (it : int_type) (bv : bin) : type := {| + ty_own β l := (∃ v, ⌜val_of_bin bv = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + |}. + Next Obligation. + iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. + Qed. + + Program Definition binary (it : int_type) : rtype := {| + rty_type := bin; + rty := binary_inner_type it + |}. + + Global Program Instance binary_rmovable it : RMovable (binary it) := {| + rmovable bv := {| + ty_layout := it_layout it; + ty_own_val v := ⌜val_of_bin bv = Some v⌝%I; + |} |}. + Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. + Next Obligation. Admitted. + (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) + Next Obligation. + iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". + iExists _. by iFrame. + Qed. + Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. + Next Obligation. iIntros (it x1 x2). done. Qed. + + Global Program Instance binary_copyable it bv : Copyable (bv @ binary it). + Next Obligation. + iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". + iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. + iExists _, _. iFrame. iModIntro. iSplit => //. + by iIntros "_". + Qed. + +End binary. +Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'") : printing_sugar. + +(* TODO: better names like: bits, bits_mask, bits_data?*) + +Section bmask. + + Context `{!typeG Σ}. + + Program Definition bmask_inter_type (it : int_type) (p : nat * nat) : type := {| + ty_own β l := (∃ v, ⌜val_of_bin (mk_mask p.1 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + |}. + Next Obligation. + iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. + Qed. + + Program Definition bmask (it : int_type) : rtype := {| + rty_type := nat * nat; + rty := bmask_inter_type it + |}. + + Global Program Instance bmask_rmovable it : RMovable (bmask it) := {| + rmovable p := {| + ty_layout := it_layout it; + ty_own_val v := ⌜val_of_bin (mk_mask p.1 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝%I; + |} |}. + Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. + Next Obligation. Admitted. + (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) + Next Obligation. + iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". + iExists _. by iFrame. + Qed. + Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. + Next Obligation. iIntros (it x1 x2). done. Qed. + + Global Program Instance bmask_copyable it p : Copyable (p @ bmask it). + Next Obligation. + iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". + iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. + iExists _, _. iFrame. iModIntro. iSplit => //. + by iIntros "_". + Qed. + +End bmask. +Notation "bmask< it >" := (bmask it) (only printing, format "'bmask<' it '>'") : printing_sugar. + +Section bdata. + + Context `{!typeG Σ}. + + Program Definition bdata_inter_type (it : int_type) (p : nat * nat * bin) : type := {| + ty_own β l := (∃ v, ⌜val_of_bin (mk_data p.1.1 p.1.2 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + |}. + Next Obligation. + iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. + Qed. + + Program Definition bdata (it : int_type) : rtype := {| + rty_type := nat * nat * bin; + rty := bdata_inter_type it + |}. + + Global Program Instance bdata_rmovable it : RMovable (bdata it) := {| + rmovable p := {| + ty_layout := it_layout it; + ty_own_val v := ⌜val_of_bin (mk_data p.1.1 p.1.2 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝%I; + |} |}. + Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. + Next Obligation. Admitted. + (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) + Next Obligation. + iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". + iExists _. by iFrame. + Qed. + Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. + Next Obligation. iIntros (it x1 x2). done. Qed. + + Global Program Instance bdata_copyable it p : Copyable (p @ bdata it). + Next Obligation. + iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". + iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. + iExists _, _. iFrame. iModIntro. iSplit => //. + by iIntros "_". + Qed. + +End bdata. +Notation "bdata< it >" := (bdata it) (only printing, format "'bdata<' it '>'") : printing_sugar. + +Section programs. + Context `{!typeG Σ}. + + Lemma subsume_int_binary T v it n bv : + (⌜bv = Z_to_bin (Z.to_nat (bits_per_int it)) n⌝ ∗ T) + -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. + Admitted. + Global Instance subsume_int_binary_inst v it n bv : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ bv @ binary it)%I := + λ T, i2p (subsume_int_binary T v it n bv). + + Lemma subsume_bitvec_binary T v bt it x y : + (⌜y = x⌝ ∗ T) -∗ subsume (v ◁ᵥ x @ bitvec bt) (v ◁ᵥ y @ binary it) T. + Admitted. + Global Instance subsume_bitvec_binary_inst v bt it x y : Subsume (v ◁ᵥ x @ bitvec bt)%I (v ◁ᵥ y @ binary it)%I := + λ T, i2p (subsume_bitvec_binary T v bt it x y). +(* + Lemma subsume_int_bmask T v it n a k : + (⌜check_mask (Z_to_bin (Z.to_nat (bits_per_int it)) n) = Some (a, k)⌝ ∗ T) + -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ (a, k) @ bmask it) T. + Admitted. + Global Instance subsume_int_bmask_inst v it n a k : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ (a, k) @ bmask it)%I := + λ T, i2p (subsume_int_bmask T v it n a k). *) + + Lemma type_cast_binary_to_bool bv it1 it2 v T: + let b := bin_to_bool bv in + T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ + typed_un_op v (v ◁ᵥ bv @ binary it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + Admitted. + Global Instance type_cast_binary_to_bool_inst bv it1 it2 v: + TypedUnOpVal v (bv @ binary it1) (CastOp (IntOp it2)) (IntOp it1) := + λ T, i2p (type_cast_binary_to_bool bv it1 it2 v T). + + Lemma type_binary_int_eq it v1 bv v2 n T : + let b := bool_decide (Z_to_bin (Z.to_nat (bits_per_int it)) n = bv) in + T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv @ binary it) v2 (v2 ◁ᵥ n @ int it) EqOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_binary_int_eq_inst it v1 bv v2 n: + TypedBinOpVal v1 (bv @ (binary it))%I v2 (n @ (int it))%I EqOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_int_eq it v1 bv v2 n T). + + Lemma type_binary_mask_and it v1 bv1 v2 a k T: + let bv := bin_mask_and bv1 a k in + T (b2v bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_binary_mask_and_inst it v1 bv1 v2 a k: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k) @ (bmask it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_mask_and it v1 bv1 v2 a k T). + + Lemma type_int_mask_and it v1 n1 v2 a k T: + let N := Z.to_nat (bits_per_int it) in + typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T -∗ + typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_int_mask_and_inst it v1 n1 v2 a k : + TypedBinOpVal v1 (n1 @ int it)%I v2 ((a, k) @ (bmask it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). + + Lemma type_binary_data_or it v1 bv1 v2 a k d T: + let bv := bin_update a k d bv1 in + (⌜Forall (λ b, b = false) (bin_slice a k bv1)⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k, d) @ bdata it) OrOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_binary_data_or_inst it v1 bv1 v2 a k d: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k, d) @ (bdata it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_data_or it v1 bv1 v2 a k d T). + + Lemma type_binary_mask_or it v1 bv1 v2 a k T: + let d := replicate k true in + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k, d) @ bdata it) OrOp (IntOp it) (IntOp it) T -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) OrOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_binary_mask_or_inst it v1 bv1 v2 a k: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k) @ (bmask it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_mask_or it v1 bv1 v2 a k T). + + Lemma type_mask_neg it v k T : + let N := Z.to_nat (bits_per_int it) in + T (b2v (mk_mask k (N - k) N)) (t2mt ((k, N - k)%nat @ bmask it)) -∗ + typed_un_op v (v ◁ᵥ (0, k)%nat @ bmask it) NotIntOp (IntOp it) T. + Admitted. + Global Program Instance type_mask_neg_inst it v k: + TypedUnOpVal v ((0, k)%nat @ bmask it) NotIntOp (IntOp it) := + λ T, i2p (type_mask_neg it v k T). + +End programs. -- GitLab From 0bace3694882c4d9d5b048378d4324b5bc5eaefb Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 6 Apr 2021 18:07:29 +0800 Subject: [PATCH 10/71] draft impl for mask union --- linux/casestudies/pgtable.c | 24 ++- .../proofs/pgtable/generated_code.v | 164 ++++++++-------- .../generated_proof_kvm_set_valid_leaf_pte.v | 33 +++- .../proofs/pgtable/generated_spec.v | 14 +- .../proofs/pgtable/pgtable_lemmas.v | 6 + theories/typing/binary.v | 57 +++++- theories/typing/bitvec.v | 184 ++++++++++-------- 7 files changed, 290 insertions(+), 192 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 2374eaad..f92cf276 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -20,7 +20,7 @@ typedef uint32_t u32; [[rc::parameters("i : nat")]] [[rc::args("i @ int")]] [[rc::requires("{i < 64}")]] -[[rc::returns("{(i, 1)%nat} @ bmask")]] +[[rc::returns("{MASK i 1} @ bmask")]] [[rc::trust_me]] u64 BIT(int i) { @@ -37,7 +37,7 @@ u64 BIT(int i) [[rc::parameters("h : nat", "l : nat")]] [[rc::args("h @ int", "l @ int")]] [[rc::requires("{h < 64}", "{l <= h}")]] -[[rc::returns("{(l, h - l + 1)%nat} @ bmask")]] +[[rc::returns("{MASK l (h - l + 1)%nat} @ bmask")]] [[rc::trust_me]] u64 GENMASK(int h, int l) { @@ -84,7 +84,7 @@ int __builtin_ffsll (long long x); // #define FIELD_GET(_mask, _reg) \ (((_reg) & (_mask)) >> __bf_shf(_mask)) [[rc::parameters("r : bin", "a : nat", "k : nat")]] -[[rc::args("{(a, k)} @ bmask", "r @ binary")]] +[[rc::args("{MASK a k} @ bmask", "r @ binary")]] [[rc::returns("{bin_slice a k r ++ replicate (64 - k) false} @ binary")]] [[rc::trust_me]] u64 FIELD_GET(u64 _mask, u64 _reg) @@ -112,8 +112,8 @@ u64 FIELD_GET(u64 _mask, u64 _reg) // #define FIELD_PREP(_mask, _val) \ (((_val) << __bf_shf(_mask)) & (_mask)) [[rc::parameters("a : nat", "k : nat", "v : bin")]] -[[rc::args("{(a, k)} @ bmask", "v @ binary")]] -[[rc::returns("{(a, k, take k v)} @ bdata")]] +[[rc::args("{MASK a k} @ bmask", "v @ binary")]] +[[rc::returns("{DATA a (take k v)} @ bdata")]] [[rc::trust_me]] u64 FIELD_PREP(u64 _mask, u64 _val) { @@ -221,7 +221,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : bin", "p : loc")]] [[rc::args("p @ &own>")]] [[rc::ensures("own p : {pte.[valid := false]} @ binary")]] -[[rc::trust_me]] +[[rc::trust_me]] // NOTE: type system stuck, need a rule: ty1 <: ty2, then &own <: &own static void kvm_set_invalid_pte(kvm_pte_t *ptep) { kvm_pte_t pte = *ptep; @@ -261,15 +261,13 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, *ptep = pte; } -[[rc::parameters("p : loc", "pte : bin", "pa : Z", "attr : bin", "level : Z")]] +[[rc::parameters("p : loc", "pte : bin", "pa : Z", "attr : bin", "level : Z", "pte1 : bin", "is_page : bool")]] [[rc::args("p @ &own>", "pa @ int", "attr @ binary", "level @ int")]] -[[rc::exists("is_page : bool")]] -[[rc::ensures("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] -[[rc::exists("pte1 : bin")]] -[[rc::ensures("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]}")]] -[[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ binary")]] +[[rc::requires("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] +[[rc::requires("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]}")]] [[rc::returns("{if pte.[valid] then bool_decide (pte = pte1) else true} @ boolean")]] -[[rc::trust_me]] +[[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ binary")]] +// [[rc::trust_me]] // takes long static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, u32 level) { diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 81a04e37..8102823e 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -199,88 +199,88 @@ Section code. Definition loc_218 : location_info := LocationInfo file_0 256 20 256 25. Definition loc_219 : location_info := LocationInfo file_0 256 21 256 25. Definition loc_220 : location_info := LocationInfo file_0 256 21 256 25. - Definition loc_225 : location_info := LocationInfo file_0 276 4 276 53. - Definition loc_226 : location_info := LocationInfo file_0 277 4 278 33. - Definition loc_227 : location_info := LocationInfo file_0 279 4 279 53. - Definition loc_228 : location_info := LocationInfo file_0 280 4 280 36. - Definition loc_229 : location_info := LocationInfo file_0 281 4 281 18. - Definition loc_230 : location_info := LocationInfo file_0 283 4 284 26. - Definition loc_231 : location_info := LocationInfo file_0 286 1 286 13. - Definition loc_232 : location_info := LocationInfo file_0 287 4 287 13. - Definition loc_233 : location_info := LocationInfo file_0 287 11 287 12. - Definition loc_234 : location_info := LocationInfo file_0 286 1 286 6. - Definition loc_235 : location_info := LocationInfo file_0 286 2 286 6. - Definition loc_236 : location_info := LocationInfo file_0 286 2 286 6. - Definition loc_237 : location_info := LocationInfo file_0 286 9 286 12. - Definition loc_238 : location_info := LocationInfo file_0 286 9 286 12. - Definition loc_239 : location_info := LocationInfo file_0 284 8 284 26. - Definition loc_240 : location_info := LocationInfo file_0 284 15 284 25. - Definition loc_241 : location_info := LocationInfo file_0 284 15 284 18. - Definition loc_242 : location_info := LocationInfo file_0 284 15 284 18. - Definition loc_243 : location_info := LocationInfo file_0 284 22 284 25. - Definition loc_244 : location_info := LocationInfo file_0 284 22 284 25. - Definition loc_246 : location_info := LocationInfo file_0 283 8 283 26. - Definition loc_247 : location_info := LocationInfo file_0 283 8 283 21. - Definition loc_248 : location_info := LocationInfo file_0 283 8 283 21. - Definition loc_249 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_250 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_251 : location_info := LocationInfo file_0 281 4 281 7. - Definition loc_252 : location_info := LocationInfo file_0 281 4 281 17. - Definition loc_253 : location_info := LocationInfo file_0 281 4 281 7. - Definition loc_254 : location_info := LocationInfo file_0 281 4 281 7. - Definition loc_255 : location_info := LocationInfo file_0 281 11 281 17. - Definition loc_256 : location_info := LocationInfo file_0 281 11 281 14. - Definition loc_257 : location_info := LocationInfo file_0 281 11 281 14. - Definition loc_258 : location_info := LocationInfo file_0 281 15 281 16. - Definition loc_259 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_260 : location_info := LocationInfo file_0 280 4 280 35. - Definition loc_261 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_262 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_263 : location_info := LocationInfo file_0 280 11 280 35. - Definition loc_264 : location_info := LocationInfo file_0 280 11 280 21. - Definition loc_265 : location_info := LocationInfo file_0 280 11 280 21. - Definition loc_266 : location_info := LocationInfo file_0 280 22 280 28. - Definition loc_267 : location_info := LocationInfo file_0 280 22 280 25. - Definition loc_268 : location_info := LocationInfo file_0 280 22 280 25. - Definition loc_269 : location_info := LocationInfo file_0 280 26 280 27. - Definition loc_270 : location_info := LocationInfo file_0 280 30 280 34. - Definition loc_271 : location_info := LocationInfo file_0 280 30 280 34. - Definition loc_272 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_273 : location_info := LocationInfo file_0 279 4 279 52. - Definition loc_274 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_275 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_276 : location_info := LocationInfo file_0 279 11 279 52. - Definition loc_277 : location_info := LocationInfo file_0 279 11 279 15. - Definition loc_278 : location_info := LocationInfo file_0 279 11 279 15. - Definition loc_279 : location_info := LocationInfo file_0 279 18 279 52. - Definition loc_280 : location_info := LocationInfo file_0 279 19 279 33. - Definition loc_281 : location_info := LocationInfo file_0 279 19 279 26. - Definition loc_282 : location_info := LocationInfo file_0 279 19 279 26. - Definition loc_283 : location_info := LocationInfo file_0 279 27 279 29. - Definition loc_284 : location_info := LocationInfo file_0 279 31 279 32. - Definition loc_285 : location_info := LocationInfo file_0 279 36 279 51. - Definition loc_286 : location_info := LocationInfo file_0 279 36 279 43. - Definition loc_287 : location_info := LocationInfo file_0 279 36 279 43. - Definition loc_288 : location_info := LocationInfo file_0 279 44 279 46. - Definition loc_289 : location_info := LocationInfo file_0 279 48 279 50. - Definition loc_290 : location_info := LocationInfo file_0 277 15 278 32. - Definition loc_291 : location_info := LocationInfo file_0 277 15 277 32. - Definition loc_292 : location_info := LocationInfo file_0 277 16 277 21. - Definition loc_293 : location_info := LocationInfo file_0 277 16 277 21. - Definition loc_294 : location_info := LocationInfo file_0 277 25 277 31. - Definition loc_295 : location_info := LocationInfo file_0 277 25 277 27. - Definition loc_296 : location_info := LocationInfo file_0 277 30 277 31. - Definition loc_297 : location_info := LocationInfo file_0 277 35 277 36. - Definition loc_298 : location_info := LocationInfo file_0 278 31 278 32. - Definition loc_301 : location_info := LocationInfo file_0 276 33 276 52. - Definition loc_302 : location_info := LocationInfo file_0 276 33 276 48. - Definition loc_303 : location_info := LocationInfo file_0 276 33 276 48. - Definition loc_304 : location_info := LocationInfo file_0 276 49 276 51. - Definition loc_305 : location_info := LocationInfo file_0 276 49 276 51. - Definition loc_308 : location_info := LocationInfo file_0 276 20 276 25. - Definition loc_309 : location_info := LocationInfo file_0 276 20 276 25. - Definition loc_310 : location_info := LocationInfo file_0 276 21 276 25. - Definition loc_311 : location_info := LocationInfo file_0 276 21 276 25. + Definition loc_225 : location_info := LocationInfo file_0 274 4 274 53. + Definition loc_226 : location_info := LocationInfo file_0 275 4 276 33. + Definition loc_227 : location_info := LocationInfo file_0 277 4 277 53. + Definition loc_228 : location_info := LocationInfo file_0 278 4 278 36. + Definition loc_229 : location_info := LocationInfo file_0 279 4 279 18. + Definition loc_230 : location_info := LocationInfo file_0 281 4 282 26. + Definition loc_231 : location_info := LocationInfo file_0 284 1 284 13. + Definition loc_232 : location_info := LocationInfo file_0 285 4 285 13. + Definition loc_233 : location_info := LocationInfo file_0 285 11 285 12. + Definition loc_234 : location_info := LocationInfo file_0 284 1 284 6. + Definition loc_235 : location_info := LocationInfo file_0 284 2 284 6. + Definition loc_236 : location_info := LocationInfo file_0 284 2 284 6. + Definition loc_237 : location_info := LocationInfo file_0 284 9 284 12. + Definition loc_238 : location_info := LocationInfo file_0 284 9 284 12. + Definition loc_239 : location_info := LocationInfo file_0 282 8 282 26. + Definition loc_240 : location_info := LocationInfo file_0 282 15 282 25. + Definition loc_241 : location_info := LocationInfo file_0 282 15 282 18. + Definition loc_242 : location_info := LocationInfo file_0 282 15 282 18. + Definition loc_243 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_244 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_246 : location_info := LocationInfo file_0 281 8 281 26. + Definition loc_247 : location_info := LocationInfo file_0 281 8 281 21. + Definition loc_248 : location_info := LocationInfo file_0 281 8 281 21. + Definition loc_249 : location_info := LocationInfo file_0 281 22 281 25. + Definition loc_250 : location_info := LocationInfo file_0 281 22 281 25. + Definition loc_251 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_252 : location_info := LocationInfo file_0 279 4 279 17. + Definition loc_253 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_254 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_255 : location_info := LocationInfo file_0 279 11 279 17. + Definition loc_256 : location_info := LocationInfo file_0 279 11 279 14. + Definition loc_257 : location_info := LocationInfo file_0 279 11 279 14. + Definition loc_258 : location_info := LocationInfo file_0 279 15 279 16. + Definition loc_259 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_260 : location_info := LocationInfo file_0 278 4 278 35. + Definition loc_261 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_262 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_263 : location_info := LocationInfo file_0 278 11 278 35. + Definition loc_264 : location_info := LocationInfo file_0 278 11 278 21. + Definition loc_265 : location_info := LocationInfo file_0 278 11 278 21. + Definition loc_266 : location_info := LocationInfo file_0 278 22 278 28. + Definition loc_267 : location_info := LocationInfo file_0 278 22 278 25. + Definition loc_268 : location_info := LocationInfo file_0 278 22 278 25. + Definition loc_269 : location_info := LocationInfo file_0 278 26 278 27. + Definition loc_270 : location_info := LocationInfo file_0 278 30 278 34. + Definition loc_271 : location_info := LocationInfo file_0 278 30 278 34. + Definition loc_272 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_273 : location_info := LocationInfo file_0 277 4 277 52. + Definition loc_274 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_275 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_276 : location_info := LocationInfo file_0 277 11 277 52. + Definition loc_277 : location_info := LocationInfo file_0 277 11 277 15. + Definition loc_278 : location_info := LocationInfo file_0 277 11 277 15. + Definition loc_279 : location_info := LocationInfo file_0 277 18 277 52. + Definition loc_280 : location_info := LocationInfo file_0 277 19 277 33. + Definition loc_281 : location_info := LocationInfo file_0 277 19 277 26. + Definition loc_282 : location_info := LocationInfo file_0 277 19 277 26. + Definition loc_283 : location_info := LocationInfo file_0 277 27 277 29. + Definition loc_284 : location_info := LocationInfo file_0 277 31 277 32. + Definition loc_285 : location_info := LocationInfo file_0 277 36 277 51. + Definition loc_286 : location_info := LocationInfo file_0 277 36 277 43. + Definition loc_287 : location_info := LocationInfo file_0 277 36 277 43. + Definition loc_288 : location_info := LocationInfo file_0 277 44 277 46. + Definition loc_289 : location_info := LocationInfo file_0 277 48 277 50. + Definition loc_290 : location_info := LocationInfo file_0 275 15 276 32. + Definition loc_291 : location_info := LocationInfo file_0 275 15 275 32. + Definition loc_292 : location_info := LocationInfo file_0 275 16 275 21. + Definition loc_293 : location_info := LocationInfo file_0 275 16 275 21. + Definition loc_294 : location_info := LocationInfo file_0 275 25 275 31. + Definition loc_295 : location_info := LocationInfo file_0 275 25 275 27. + Definition loc_296 : location_info := LocationInfo file_0 275 30 275 31. + Definition loc_297 : location_info := LocationInfo file_0 275 35 275 36. + Definition loc_298 : location_info := LocationInfo file_0 276 31 276 32. + Definition loc_301 : location_info := LocationInfo file_0 274 33 274 52. + Definition loc_302 : location_info := LocationInfo file_0 274 33 274 48. + Definition loc_303 : location_info := LocationInfo file_0 274 33 274 48. + Definition loc_304 : location_info := LocationInfo file_0 274 49 274 51. + Definition loc_305 : location_info := LocationInfo file_0 274 49 274 51. + Definition loc_308 : location_info := LocationInfo file_0 274 20 274 25. + Definition loc_309 : location_info := LocationInfo file_0 274 20 274 25. + Definition loc_310 : location_info := LocationInfo file_0 274 21 274 25. + Definition loc_311 : location_info := LocationInfo file_0 274 21 274 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v index 2cdc798b..7ae41c21 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v @@ -1 +1,32 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_set_valid_leaf_pte. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_set_valid_leaf_pte]. *) + Lemma type_kvm_set_valid_leaf_pte (global_BIT global_FIELD_PREP global_GENMASK global_kvm_phys_to_pte global_kvm_pte_valid : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ + global_GENMASK ◁ᵥ global_GENMASK @ function_ptr type_of_GENMASK -∗ + global_kvm_phys_to_pte ◁ᵥ global_kvm_phys_to_pte @ function_ptr type_of_kvm_phys_to_pte -∗ + global_kvm_pte_valid ◁ᵥ global_kvm_pte_valid @ function_ptr type_of_kvm_pte_valid -∗ + typed_function (impl_kvm_set_valid_leaf_pte global_BIT global_FIELD_PREP global_GENMASK global_kvm_phys_to_pte global_kvm_pte_valid) type_of_kvm_set_valid_leaf_pte. + Proof. + Open Scope printing_sugar. + start_function "kvm_set_valid_leaf_pte" ([[[[[[p pte] pa] attr] level] pte1] is_page]) => arg_ptep arg_pa arg_attr arg_level local_old local_type local_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_set_valid_leaf_pte" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_set_valid_leaf_pte". + Qed. +End proof_kvm_set_valid_leaf_pte. diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 14847907..d80a0907 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -61,12 +61,12 @@ Section spec. (* Specifications for function [BIT]. *) Definition type_of_BIT := fn(∀ i : nat; (i @ (int (i32))); ⌜i < 64⌝) - → ∃ () : (), (((i, 1)%nat) @ (bmask (u64))); True. + → ∃ () : (), ((MASK i 1) @ (bmask (u64))); True. (* Specifications for function [GENMASK]. *) Definition type_of_GENMASK := fn(∀ (h, l) : nat * nat; (h @ (int (i32))), (l @ (int (i32))); ⌜h < 64⌝ ∗ ⌜l <= h⌝) - → ∃ () : (), (((l, h - l + 1)%nat) @ (bmask (u64))); True. + → ∃ () : (), ((MASK l (h - l + 1)%nat) @ (bmask (u64))); True. (* Specifications for function [__builtin_ffsll]. *) Definition type_of___builtin_ffsll := @@ -75,13 +75,13 @@ Section spec. (* Specifications for function [FIELD_GET]. *) Definition type_of_FIELD_GET := - fn(∀ (r, a, k) : bin * nat * nat; (((a, k)) @ (bmask (u64))), (r @ (binary (u64))); True) + fn(∀ (r, a, k) : bin * nat * nat; ((MASK a k) @ (bmask (u64))), (r @ (binary (u64))); True) → ∃ () : (), ((bin_slice a k r ++ replicate (64 - k) false) @ (binary (u64))); True. (* Specifications for function [FIELD_PREP]. *) Definition type_of_FIELD_PREP := - fn(∀ (a, k, v) : nat * nat * bin; (((a, k)) @ (bmask (u64))), (v @ (binary (u64))); True) - → ∃ () : (), (((a, k, take k v)) @ (bdata (u64))); True. + fn(∀ (a, k, v) : nat * nat * bin; ((MASK a k) @ (bmask (u64))), (v @ (binary (u64))); True) + → ∃ () : (), ((DATA a (take k v)) @ (bdata (u64))); True. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := @@ -110,8 +110,8 @@ Section spec. (* Specifications for function [kvm_set_valid_leaf_pte]. *) Definition type_of_kvm_set_valid_leaf_pte := - fn(∀ (p, pte, pa, attr, level) : loc * bin * Z * bin * Z; (p @ (&own (pte @ (binary (u64))))), (pa @ (int (u64))), (attr @ (binary (u64))), (level @ (int (u32))); True) - → ∃ (is_page, pte1) : bool * bin, ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝ ∗ (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (binary (u64)))). + fn(∀ (p, pte, pa, attr, level, pte1, is_page) : loc * bin * Z * bin * Z * bin * bool; (p @ (&own (pte @ (binary (u64))))), (pa @ (int (u64))), (attr @ (binary (u64))), (level @ (int (u32))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝) + → ∃ () : (), ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (binary (u64)))). End spec. Typeclasses Opaque kvm_pgtable_mm_ops_rec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 08ce7e5a..0bd4c716 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -25,4 +25,10 @@ Global Instance simpl_check_mask N k x y : (λ T, x = Z.to_nat k ∧ y = 1%nat ∧ T). Admitted. *) +Definition MASK (a k : nat) : list (nat * nat) := + [(a, k)]. + +Definition DATA (a : nat) (v : bin) : list (nat * bin) := + [(a, v)]. + Arguments replicate : simpl never. diff --git a/theories/typing/binary.v b/theories/typing/binary.v index e87d1ccc..aad1cea5 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -113,6 +113,7 @@ Section bin. Definition bin_slice (start len : nat) (v : bin) : bin := drop start (take (start + len) v). + (* TODO: len is redundent *) Definition bin_update (start len : nat) (new : bin) (v : bin) : bin := take start v ++ new ++ drop (start + len) v. @@ -132,11 +133,55 @@ Section bin. then Some (start, len) else None. - Definition mk_mask (a k : nat) (len : nat) : bin := - replicate a false ++ replicate k true ++ replicate (len - a - k) false. + Definition mk_data_1 (start : nat) (v : bin) (len : nat) : bin := + replicate start false ++ v ++ replicate (len - start - length v) false. + + Definition mk_mask_1 (start : nat) (k : nat) (len : nat) : bin := + mk_data_1 start (replicate k true) len. + + Definition mk_zero (len : nat) := replicate len false. + + Definition mk_data (shapes : list (nat * bin)) (len : nat) : bin := + foldl bin_or (mk_zero len) ((λ p, mk_data_1 p.1 p.2 len) <$> shapes). + + Definition mk_mask (shapes : list (nat * nat)) (len : nat) : bin := + foldl bin_or (mk_zero len) ((λ p, mk_mask_1 p.1 p.2 len) <$> shapes). - Definition mk_data (a k : nat) (v : bin) (len : nat) : bin := - replicate a false ++ v ++ replicate (len - a - k) false. + Definition mask_to_data (shapes : list (nat * nat)) : list (nat * bin) := + (λ p, (p.1, replicate p.2 true)) <$> shapes. + + Definition bin_mask_and (v : bin) (shapes : list (nat * nat)) : list (nat * bin) := + (λ p, (p.1, bin_slice p.1 p.2 v)) <$> shapes. + + (* TODO *) + Definition bin_data_or_precond (v : bin) (shape : list (nat * bin)) : Prop := + False. + + Fixpoint bin_data_or (v : bin) (shape : list (nat * bin)) : bin := + match shape with + | [] => v + | (a, v') :: rest => bin_data_or (bin_update a (length v') v' v) rest + end. + + Definition mask_or_precond (lhs rhs : list (nat * nat)) : Prop := + False. + + (* TODO: to make mask or easier, a mask should be represented by (offset, nat) *) + Definition mask_or (lhs rhs : list (nat * nat)) : list (nat * nat) := + lhs ++ rhs. + + Fixpoint mask_neg_go (shapes : list (nat * nat)) (offset : nat) (len : nat) : list (nat * nat) := + match shapes with + | [] => [(offset, len - offset)%nat] + | (a, k) :: rest => (offset, a - offset)%nat :: mask_neg_go rest (a + k) len + end. + + Definition mask_neg (shapes : list (nat * nat)) (len : nat) : list (nat * nat) := + match shapes with + | [] => [(0, len)%nat] + | (0%nat, k) :: rest => mask_neg_go rest k len + | (a, k) :: rest => (0, a)%nat :: mask_neg_go rest k len + end. (* val <-> bin *) Fixpoint bool_vec_to_nat {n} (v : vec bool n) : nat := @@ -181,8 +226,4 @@ Section bin. else Some z else None. - (* NOTE: this just returns a "data" *) - Definition bin_mask_and (v : bin) (a k : nat) : bin := - replicate a false ++ bin_slice a k v ++ replicate (length v - a - k) false. - End bin. diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 8cc22b63..996636f9 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -171,11 +171,10 @@ End bool_vec. Section bitvec_op. Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bin := - Z_slice 0 (bt_length bt) n. - - (* TODO: maybe not needed? *) - (* Global Instance bvec_eq_dec {bt : bitvec_type} : EqDecision (bvec bt). *) - (* Proof. solve_decision. Qed. *) + match n with + | 0 => replicate (bt_length bt) false + | _ => Z_slice 0 (bt_length bt) n + end. Definition bvec_get (bv : bin) (f : field) : field_type f := field_decode f (bin_slice (field_offset f) (field_len f) bv). @@ -708,26 +707,29 @@ Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'" (* TODO: better names like: bits, bits_mask, bits_data?*) -Section bmask. +Section bdata. Context `{!typeG Σ}. - Program Definition bmask_inter_type (it : int_type) (p : nat * nat) : type := {| - ty_own β l := (∃ v, ⌜val_of_bin (mk_mask p.1 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + Program Definition bdata_inner_type (it : int_type) (shapes : list (nat * bin)) : type := {| + ty_own β l := + let N := Z.to_nat (bits_per_int it) in + (∃ v, ⌜val_of_bin (mk_data shapes N) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I |}. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. Qed. - Program Definition bmask (it : int_type) : rtype := {| - rty_type := nat * nat; - rty := bmask_inter_type it + Program Definition bdata (it : int_type) : rtype := {| + rty_type := list (nat * bin); + rty := bdata_inner_type it |}. - Global Program Instance bmask_rmovable it : RMovable (bmask it) := {| - rmovable p := {| + Global Program Instance bdata_rmovable it : RMovable (bdata it) := {| + rmovable shapes := {| ty_layout := it_layout it; - ty_own_val v := ⌜val_of_bin (mk_mask p.1 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝%I; + ty_own_val v := + let N := Z.to_nat (bits_per_int it) in ⌜val_of_bin (mk_data shapes N) = Some v⌝%I; |} |}. Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. Next Obligation. Admitted. @@ -739,7 +741,7 @@ Section bmask. Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. Next Obligation. iIntros (it x1 x2). done. Qed. - Global Program Instance bmask_copyable it p : Copyable (p @ bmask it). + Global Program Instance bdata_copyable it p : Copyable (p @ bdata it). Next Obligation. iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. @@ -747,29 +749,32 @@ Section bmask. by iIntros "_". Qed. -End bmask. -Notation "bmask< it >" := (bmask it) (only printing, format "'bmask<' it '>'") : printing_sugar. +End bdata. +Notation "bdata< it >" := (bdata it) (only printing, format "'bdata<' it '>'") : printing_sugar. -Section bdata. +Section bmask. Context `{!typeG Σ}. - Program Definition bdata_inter_type (it : int_type) (p : nat * nat * bin) : type := {| - ty_own β l := (∃ v, ⌜val_of_bin (mk_data p.1.1 p.1.2 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + Program Definition bmask_inner_type (it : int_type) (shapes : list (nat * nat)) : type := {| + ty_own β l := + let N := Z.to_nat (bits_per_int it) in + (∃ v, ⌜val_of_bin (mk_mask shapes N) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I |}. Next Obligation. iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. Qed. - Program Definition bdata (it : int_type) : rtype := {| - rty_type := nat * nat * bin; - rty := bdata_inter_type it + Program Definition bmask (it : int_type) : rtype := {| + rty_type := list (nat * nat); + rty := bmask_inner_type it |}. - Global Program Instance bdata_rmovable it : RMovable (bdata it) := {| - rmovable p := {| + Global Program Instance bmask_rmovable it : RMovable (bmask it) := {| + rmovable shapes := {| ty_layout := it_layout it; - ty_own_val v := ⌜val_of_bin (mk_data p.1.1 p.1.2 p.2 (Z.to_nat (bits_per_int it))) = Some v⌝%I; + ty_own_val v := + let N := Z.to_nat (bits_per_int it) in ⌜val_of_bin (mk_mask shapes N) = Some v⌝%I; |} |}. Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. Next Obligation. Admitted. @@ -781,7 +786,7 @@ Section bdata. Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. Next Obligation. iIntros (it x1 x2). done. Qed. - Global Program Instance bdata_copyable it p : Copyable (p @ bdata it). + Global Program Instance bmask_copyable it p : Copyable (p @ bmask it). Next Obligation. iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. @@ -789,8 +794,8 @@ Section bdata. by iIntros "_". Qed. -End bdata. -Notation "bdata< it >" := (bdata it) (only printing, format "'bdata<' it '>'") : printing_sugar. +End bmask. +Notation "bmask< it >" := (bmask it) (only printing, format "'bmask<' it '>'") : printing_sugar. Section programs. Context `{!typeG Σ}. @@ -802,27 +807,31 @@ Section programs. Global Instance subsume_int_binary_inst v it n bv : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ bv @ binary it)%I := λ T, i2p (subsume_int_binary T v it n bv). - Lemma subsume_bitvec_binary T v bt it x y : - (⌜y = x⌝ ∗ T) -∗ subsume (v ◁ᵥ x @ bitvec bt) (v ◁ᵥ y @ binary it) T. - Admitted. - Global Instance subsume_bitvec_binary_inst v bt it x y : Subsume (v ◁ᵥ x @ bitvec bt)%I (v ◁ᵥ y @ binary it)%I := - λ T, i2p (subsume_bitvec_binary T v bt it x y). -(* - Lemma subsume_int_bmask T v it n a k : - (⌜check_mask (Z_to_bin (Z.to_nat (bits_per_int it)) n) = Some (a, k)⌝ ∗ T) - -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ (a, k) @ bmask it) T. + Lemma subsume_data_binary T it v shape bv : + let N := Z.to_nat (bits_per_int it) in + (⌜bv = mk_data shape N⌝ ∗ T) -∗ subsume (v ◁ᵥ shape @ bdata it) (v ◁ᵥ bv @ binary it) T. Admitted. - Global Instance subsume_int_bmask_inst v it n a k : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ (a, k) @ bmask it)%I := - λ T, i2p (subsume_int_bmask T v it n a k). *) + Global Instance subsume_data_binary_inst it v shape bv : Subsume (v ◁ᵥ shape @ bdata it)%I (v ◁ᵥ bv @ binary it)%I := + λ T, i2p (subsume_data_binary T it v shape bv). - Lemma type_cast_binary_to_bool bv it1 it2 v T: - let b := bin_to_bool bv in + Lemma type_cast_data_to_bool it1 it2 v shape T: + let N := Z.to_nat (bits_per_int it1) in + let b := bin_to_bool (mk_data shape N) in T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ - typed_un_op v (v ◁ᵥ bv @ binary it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + typed_un_op v (v ◁ᵥ shape @ bdata it1)%I (CastOp (IntOp it2)) (IntOp it1) T. Admitted. - Global Instance type_cast_binary_to_bool_inst bv it1 it2 v: - TypedUnOpVal v (bv @ binary it1) (CastOp (IntOp it2)) (IntOp it1) := - λ T, i2p (type_cast_binary_to_bool bv it1 it2 v T). + Global Instance type_cast_binary_to_bool_inst it1 it2 v shape : + TypedUnOpVal v (shape @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := + λ T, i2p (type_cast_data_to_bool it1 it2 v shape T). + + Lemma type_binary_eq it v1 bv1 v2 bv2 T : + let b := bool_decide (bv1 = bv2) in + T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) EqOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_binary_eq_inst it v1 bv1 v2 bv2: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I EqOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_eq it v1 bv1 v2 bv2 T). Lemma type_binary_int_eq it v1 bv v2 n T : let b := bool_decide (Z_to_bin (Z.to_nat (bits_per_int it)) n = bv) in @@ -833,49 +842,62 @@ Section programs. TypedBinOpVal v1 (bv @ (binary it))%I v2 (n @ (int it))%I EqOp (IntOp it) (IntOp it) := λ T, i2p (type_binary_int_eq it v1 bv v2 n T). - Lemma type_binary_mask_and it v1 bv1 v2 a k T: - let bv := bin_mask_and bv1 a k in - T (b2v bv) (t2mt (bv @ binary it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T. + Lemma type_binary_mask_and it v1 bv1 v2 shape T: + let N := Z.to_nat (bits_per_int it) in + let shape' := bin_mask_and bv1 shape in + T (b2v (mk_data shape' N)) (t2mt (shape' @ bdata it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T. Admitted. - Global Program Instance type_binary_mask_and_inst it v1 bv1 v2 a k: - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k) @ (bmask it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_and it v1 bv1 v2 a k T). + Global Program Instance type_binary_mask_and_inst it v1 bv1 v2 shape : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_mask_and it v1 bv1 v2 shape T). - Lemma type_int_mask_and it v1 n1 v2 a k T: + Lemma type_int_mask_and it v1 n1 v2 shape T: let N := Z.to_nat (bits_per_int it) in - typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T -∗ - typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ (a, k) @ bmask it) AndOp (IntOp it) (IntOp it) T. + typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T -∗ + typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_int_mask_and_inst it v1 n1 v2 shape : + TypedBinOpVal v1 (n1 @ int it)%I v2 (shape @ (bmask it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_int_mask_and it v1 n1 v2 shape T). + + Lemma type_binary_data_or it v1 bv1 v2 shape T: + let bv := bin_data_or bv1 shape in + (⌜bin_data_or_precond bv1 shape⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bdata it) OrOp (IntOp it) (IntOp it) T. Admitted. - Global Program Instance type_int_mask_and_inst it v1 n1 v2 a k : - TypedBinOpVal v1 (n1 @ int it)%I v2 ((a, k) @ (bmask it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). - - Lemma type_binary_data_or it v1 bv1 v2 a k d T: - let bv := bin_update a k d bv1 in - (⌜Forall (λ b, b = false) (bin_slice a k bv1)⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k, d) @ bdata it) OrOp (IntOp it) (IntOp it) T. + Global Program Instance type_binary_data_or_inst it v1 bv1 v2 shape : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bdata it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_data_or it v1 bv1 v2 shape T). + + Lemma type_binary_mask_or it v1 bv1 v2 shape T: + let N := Z.to_nat (bits_per_int it) in + let bv := bin_data_or bv1 (mask_to_data shape) in + (⌜bin_data_or_precond bv1 (mask_to_data shape)⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) OrOp (IntOp it) (IntOp it) T. Admitted. - Global Program Instance type_binary_data_or_inst it v1 bv1 v2 a k d: - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k, d) @ (bdata it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_data_or it v1 bv1 v2 a k d T). - - Lemma type_binary_mask_or it v1 bv1 v2 a k T: - let d := replicate k true in - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k, d) @ bdata it) OrOp (IntOp it) (IntOp it) T -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ (a, k) @ bmask it) OrOp (IntOp it) (IntOp it) T. + Global Program Instance type_binary_mask_or_inst it v1 bv1 v2 shape : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_mask_or it v1 bv1 v2 shape T). + + Lemma type_mask_or it v1 shape1 v2 shape2 T: + let N := Z.to_nat (bits_per_int it) in + let shape := mask_or shape1 shape2 in + (⌜mask_or_precond shape1 shape2⌝ ∗ T (b2v (mk_mask shape N)) (t2mt (shape @ bmask it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ shape1 @ bmask it) v2 (v2 ◁ᵥ shape2 @ bmask it) OrOp (IntOp it) (IntOp it) T. Admitted. - Global Program Instance type_binary_mask_or_inst it v1 bv1 v2 a k: - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 ((a, k) @ (bmask it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_or it v1 bv1 v2 a k T). + Global Program Instance type_mask_or_inst it v1 shape1 v2 shape2: + TypedBinOpVal v1 (shape1 @ bmask it)%I v2 (shape2 @ (bmask it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_mask_or it v1 shape1 v2 shape2 T). - Lemma type_mask_neg it v k T : + Lemma type_mask_neg it v shape T : let N := Z.to_nat (bits_per_int it) in - T (b2v (mk_mask k (N - k) N)) (t2mt ((k, N - k)%nat @ bmask it)) -∗ - typed_un_op v (v ◁ᵥ (0, k)%nat @ bmask it) NotIntOp (IntOp it) T. + let shape' := mask_neg shape N in + T (b2v (mk_mask shape' N)) (t2mt (shape' @ bmask it)) -∗ + typed_un_op v (v ◁ᵥ shape @ bmask it) NotIntOp (IntOp it) T. Admitted. - Global Program Instance type_mask_neg_inst it v k: - TypedUnOpVal v ((0, k)%nat @ bmask it) NotIntOp (IntOp it) := - λ T, i2p (type_mask_neg it v k T). + Global Program Instance type_mask_neg_inst it v shape: + TypedUnOpVal v (shape @ bmask it) NotIntOp (IntOp it) := + λ T, i2p (type_mask_neg it v shape T). End programs. -- GitLab From b1e2b171f72b6d61a1f9338a17ebd005c4562825 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 7 Apr 2021 19:36:19 +0800 Subject: [PATCH 11/71] update definitions of bin functions; resolve a few pure sidecond --- linux/casestudies/pgtable.c | 17 +- .../proofs/pgtable/generated_code.v | 264 +++++++++--------- .../pgtable/generated_proof_kvm_phys_to_pte.v | 30 +- .../pgtable/generated_proof_kvm_pte_valid.v | 29 +- .../generated_proof_kvm_set_valid_leaf_pte.v | 33 +-- .../proofs/pgtable/generated_spec.v | 10 +- .../proofs/pgtable/pgtable_lemmas.v | 2 + theories/typing/binary.v | 16 +- theories/typing/bitvec.v | 49 ++-- 9 files changed, 238 insertions(+), 212 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index f92cf276..2a6b0f2e 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -199,7 +199,7 @@ struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { [[rc::parameters("pte : bin")]] [[rc::args("pte @ binary")]] [[rc::returns("{pte.[valid]} @ boolean")]] -[[rc::trust_me]] +// [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; @@ -207,7 +207,7 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : bin", "level : Z")]] [[rc::args("pte @ binary", "level @ int")]] -[[rc::returns("{bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]} @ boolean")]] +[[rc::returns("{if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] then pte.[page_or_table] else false} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -220,7 +220,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : bin", "p : loc")]] [[rc::args("p @ &own>")]] -[[rc::ensures("own p : {pte.[valid := false]} @ binary")]] +[[rc::ensures("own p : {pte.[valid := [false]]} @ binary")]] [[rc::trust_me]] // NOTE: type system stuck, need a rule: ty1 <: ty2, then &own <: &own static void kvm_set_invalid_pte(kvm_pte_t *ptep) { @@ -231,7 +231,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] [[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ binary")]] -[[rc::trust_me]] +// [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; @@ -245,10 +245,11 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) [[rc::parameters("p : loc", "q : loc", "o : loc", "pte : bin", "va : Z", "ops : mm_ops")]] [[rc::args("p @ &own>", "q @ &own>", "o @ &own")]] -[[rc::requires("{pte.[valid] = true}")]] +[[rc::requires("{pte.[valid] = [true]}")]] [[rc::exists("pa : Z")]] [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] -[[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]} @ binary")]] +[[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := [true]; valid := [true]]} @ binary")]] +[[rc::tactics("3: by cbn; rewrite drop_0 H.")]] [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) @@ -264,10 +265,10 @@ static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, [[rc::parameters("p : loc", "pte : bin", "pa : Z", "attr : bin", "level : Z", "pte1 : bin", "is_page : bool")]] [[rc::args("p @ &own>", "pa @ int", "attr @ binary", "level @ int")]] [[rc::requires("{is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)}")]] -[[rc::requires("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]}")]] +[[rc::requires("{pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := [is_page]; valid := [true]]}")]] [[rc::returns("{if pte.[valid] then bool_decide (pte = pte1) else true} @ boolean")]] [[rc::ensures("own p : {if pte.[valid] then pte else pte1} @ binary")]] -// [[rc::trust_me]] // takes long +[[rc::trust_me]] // takes long static bool kvm_set_valid_leaf_pte(kvm_pte_t *ptep, u64 pa, kvm_pte_t attr, u32 level) { diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 8102823e..d20c55fe 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -149,138 +149,138 @@ Section code. Definition loc_162 : location_info := LocationInfo file_0 237 25 237 32. Definition loc_163 : location_info := LocationInfo file_0 237 33 237 35. Definition loc_164 : location_info := LocationInfo file_0 237 37 237 39. - Definition loc_169 : location_info := LocationInfo file_0 256 4 256 79. - Definition loc_170 : location_info := LocationInfo file_0 257 4 257 33. - Definition loc_171 : location_info := LocationInfo file_0 258 4 258 18. - Definition loc_172 : location_info := LocationInfo file_0 259 4 259 33. - Definition loc_173 : location_info := LocationInfo file_0 261 1 261 13. - Definition loc_174 : location_info := LocationInfo file_0 261 1 261 6. - Definition loc_175 : location_info := LocationInfo file_0 261 2 261 6. - Definition loc_176 : location_info := LocationInfo file_0 261 2 261 6. - Definition loc_177 : location_info := LocationInfo file_0 261 9 261 12. - Definition loc_178 : location_info := LocationInfo file_0 261 9 261 12. - Definition loc_179 : location_info := LocationInfo file_0 259 12 259 30. - Definition loc_180 : location_info := LocationInfo file_0 259 12 259 25. - Definition loc_181 : location_info := LocationInfo file_0 259 12 259 25. - Definition loc_182 : location_info := LocationInfo file_0 259 26 259 29. - Definition loc_183 : location_info := LocationInfo file_0 259 26 259 29. - Definition loc_184 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_185 : location_info := LocationInfo file_0 258 4 258 17. - Definition loc_186 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_187 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_188 : location_info := LocationInfo file_0 258 11 258 17. - Definition loc_189 : location_info := LocationInfo file_0 258 11 258 14. - Definition loc_190 : location_info := LocationInfo file_0 258 11 258 14. - Definition loc_191 : location_info := LocationInfo file_0 258 15 258 16. - Definition loc_192 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_193 : location_info := LocationInfo file_0 257 4 257 32. - Definition loc_194 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_195 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_196 : location_info := LocationInfo file_0 257 11 257 32. - Definition loc_197 : location_info := LocationInfo file_0 257 11 257 21. - Definition loc_198 : location_info := LocationInfo file_0 257 11 257 21. - Definition loc_199 : location_info := LocationInfo file_0 257 22 257 28. - Definition loc_200 : location_info := LocationInfo file_0 257 22 257 25. - Definition loc_201 : location_info := LocationInfo file_0 257 22 257 25. - Definition loc_202 : location_info := LocationInfo file_0 257 26 257 27. - Definition loc_203 : location_info := LocationInfo file_0 257 30 257 31. - Definition loc_204 : location_info := LocationInfo file_0 256 33 256 78. - Definition loc_205 : location_info := LocationInfo file_0 256 33 256 48. - Definition loc_206 : location_info := LocationInfo file_0 256 33 256 48. - Definition loc_207 : location_info := LocationInfo file_0 256 49 256 77. - Definition loc_208 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_209 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_210 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_211 : location_info := LocationInfo file_0 256 49 256 55. - Definition loc_212 : location_info := LocationInfo file_0 256 49 256 55. - Definition loc_213 : location_info := LocationInfo file_0 256 70 256 76. - Definition loc_214 : location_info := LocationInfo file_0 256 70 256 76. - Definition loc_217 : location_info := LocationInfo file_0 256 20 256 25. - Definition loc_218 : location_info := LocationInfo file_0 256 20 256 25. - Definition loc_219 : location_info := LocationInfo file_0 256 21 256 25. - Definition loc_220 : location_info := LocationInfo file_0 256 21 256 25. - Definition loc_225 : location_info := LocationInfo file_0 274 4 274 53. - Definition loc_226 : location_info := LocationInfo file_0 275 4 276 33. - Definition loc_227 : location_info := LocationInfo file_0 277 4 277 53. - Definition loc_228 : location_info := LocationInfo file_0 278 4 278 36. - Definition loc_229 : location_info := LocationInfo file_0 279 4 279 18. - Definition loc_230 : location_info := LocationInfo file_0 281 4 282 26. - Definition loc_231 : location_info := LocationInfo file_0 284 1 284 13. - Definition loc_232 : location_info := LocationInfo file_0 285 4 285 13. - Definition loc_233 : location_info := LocationInfo file_0 285 11 285 12. - Definition loc_234 : location_info := LocationInfo file_0 284 1 284 6. - Definition loc_235 : location_info := LocationInfo file_0 284 2 284 6. - Definition loc_236 : location_info := LocationInfo file_0 284 2 284 6. - Definition loc_237 : location_info := LocationInfo file_0 284 9 284 12. - Definition loc_238 : location_info := LocationInfo file_0 284 9 284 12. - Definition loc_239 : location_info := LocationInfo file_0 282 8 282 26. - Definition loc_240 : location_info := LocationInfo file_0 282 15 282 25. - Definition loc_241 : location_info := LocationInfo file_0 282 15 282 18. - Definition loc_242 : location_info := LocationInfo file_0 282 15 282 18. - Definition loc_243 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_244 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_246 : location_info := LocationInfo file_0 281 8 281 26. - Definition loc_247 : location_info := LocationInfo file_0 281 8 281 21. - Definition loc_248 : location_info := LocationInfo file_0 281 8 281 21. - Definition loc_249 : location_info := LocationInfo file_0 281 22 281 25. - Definition loc_250 : location_info := LocationInfo file_0 281 22 281 25. - Definition loc_251 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_252 : location_info := LocationInfo file_0 279 4 279 17. - Definition loc_253 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_254 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_255 : location_info := LocationInfo file_0 279 11 279 17. - Definition loc_256 : location_info := LocationInfo file_0 279 11 279 14. - Definition loc_257 : location_info := LocationInfo file_0 279 11 279 14. - Definition loc_258 : location_info := LocationInfo file_0 279 15 279 16. - Definition loc_259 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_260 : location_info := LocationInfo file_0 278 4 278 35. - Definition loc_261 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_262 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_263 : location_info := LocationInfo file_0 278 11 278 35. - Definition loc_264 : location_info := LocationInfo file_0 278 11 278 21. - Definition loc_265 : location_info := LocationInfo file_0 278 11 278 21. - Definition loc_266 : location_info := LocationInfo file_0 278 22 278 28. - Definition loc_267 : location_info := LocationInfo file_0 278 22 278 25. - Definition loc_268 : location_info := LocationInfo file_0 278 22 278 25. - Definition loc_269 : location_info := LocationInfo file_0 278 26 278 27. - Definition loc_270 : location_info := LocationInfo file_0 278 30 278 34. - Definition loc_271 : location_info := LocationInfo file_0 278 30 278 34. - Definition loc_272 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_273 : location_info := LocationInfo file_0 277 4 277 52. - Definition loc_274 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_275 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_276 : location_info := LocationInfo file_0 277 11 277 52. - Definition loc_277 : location_info := LocationInfo file_0 277 11 277 15. - Definition loc_278 : location_info := LocationInfo file_0 277 11 277 15. - Definition loc_279 : location_info := LocationInfo file_0 277 18 277 52. - Definition loc_280 : location_info := LocationInfo file_0 277 19 277 33. - Definition loc_281 : location_info := LocationInfo file_0 277 19 277 26. - Definition loc_282 : location_info := LocationInfo file_0 277 19 277 26. - Definition loc_283 : location_info := LocationInfo file_0 277 27 277 29. - Definition loc_284 : location_info := LocationInfo file_0 277 31 277 32. - Definition loc_285 : location_info := LocationInfo file_0 277 36 277 51. - Definition loc_286 : location_info := LocationInfo file_0 277 36 277 43. - Definition loc_287 : location_info := LocationInfo file_0 277 36 277 43. - Definition loc_288 : location_info := LocationInfo file_0 277 44 277 46. - Definition loc_289 : location_info := LocationInfo file_0 277 48 277 50. - Definition loc_290 : location_info := LocationInfo file_0 275 15 276 32. - Definition loc_291 : location_info := LocationInfo file_0 275 15 275 32. - Definition loc_292 : location_info := LocationInfo file_0 275 16 275 21. - Definition loc_293 : location_info := LocationInfo file_0 275 16 275 21. - Definition loc_294 : location_info := LocationInfo file_0 275 25 275 31. - Definition loc_295 : location_info := LocationInfo file_0 275 25 275 27. - Definition loc_296 : location_info := LocationInfo file_0 275 30 275 31. - Definition loc_297 : location_info := LocationInfo file_0 275 35 275 36. - Definition loc_298 : location_info := LocationInfo file_0 276 31 276 32. - Definition loc_301 : location_info := LocationInfo file_0 274 33 274 52. - Definition loc_302 : location_info := LocationInfo file_0 274 33 274 48. - Definition loc_303 : location_info := LocationInfo file_0 274 33 274 48. - Definition loc_304 : location_info := LocationInfo file_0 274 49 274 51. - Definition loc_305 : location_info := LocationInfo file_0 274 49 274 51. - Definition loc_308 : location_info := LocationInfo file_0 274 20 274 25. - Definition loc_309 : location_info := LocationInfo file_0 274 20 274 25. - Definition loc_310 : location_info := LocationInfo file_0 274 21 274 25. - Definition loc_311 : location_info := LocationInfo file_0 274 21 274 25. + Definition loc_169 : location_info := LocationInfo file_0 257 4 257 79. + Definition loc_170 : location_info := LocationInfo file_0 258 4 258 33. + Definition loc_171 : location_info := LocationInfo file_0 259 4 259 18. + Definition loc_172 : location_info := LocationInfo file_0 260 4 260 33. + Definition loc_173 : location_info := LocationInfo file_0 262 1 262 13. + Definition loc_174 : location_info := LocationInfo file_0 262 1 262 6. + Definition loc_175 : location_info := LocationInfo file_0 262 2 262 6. + Definition loc_176 : location_info := LocationInfo file_0 262 2 262 6. + Definition loc_177 : location_info := LocationInfo file_0 262 9 262 12. + Definition loc_178 : location_info := LocationInfo file_0 262 9 262 12. + Definition loc_179 : location_info := LocationInfo file_0 260 12 260 30. + Definition loc_180 : location_info := LocationInfo file_0 260 12 260 25. + Definition loc_181 : location_info := LocationInfo file_0 260 12 260 25. + Definition loc_182 : location_info := LocationInfo file_0 260 26 260 29. + Definition loc_183 : location_info := LocationInfo file_0 260 26 260 29. + Definition loc_184 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_185 : location_info := LocationInfo file_0 259 4 259 17. + Definition loc_186 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_187 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_188 : location_info := LocationInfo file_0 259 11 259 17. + Definition loc_189 : location_info := LocationInfo file_0 259 11 259 14. + Definition loc_190 : location_info := LocationInfo file_0 259 11 259 14. + Definition loc_191 : location_info := LocationInfo file_0 259 15 259 16. + Definition loc_192 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_193 : location_info := LocationInfo file_0 258 4 258 32. + Definition loc_194 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_195 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_196 : location_info := LocationInfo file_0 258 11 258 32. + Definition loc_197 : location_info := LocationInfo file_0 258 11 258 21. + Definition loc_198 : location_info := LocationInfo file_0 258 11 258 21. + Definition loc_199 : location_info := LocationInfo file_0 258 22 258 28. + Definition loc_200 : location_info := LocationInfo file_0 258 22 258 25. + Definition loc_201 : location_info := LocationInfo file_0 258 22 258 25. + Definition loc_202 : location_info := LocationInfo file_0 258 26 258 27. + Definition loc_203 : location_info := LocationInfo file_0 258 30 258 31. + Definition loc_204 : location_info := LocationInfo file_0 257 33 257 78. + Definition loc_205 : location_info := LocationInfo file_0 257 33 257 48. + Definition loc_206 : location_info := LocationInfo file_0 257 33 257 48. + Definition loc_207 : location_info := LocationInfo file_0 257 49 257 77. + Definition loc_208 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_209 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_210 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_211 : location_info := LocationInfo file_0 257 49 257 55. + Definition loc_212 : location_info := LocationInfo file_0 257 49 257 55. + Definition loc_213 : location_info := LocationInfo file_0 257 70 257 76. + Definition loc_214 : location_info := LocationInfo file_0 257 70 257 76. + Definition loc_217 : location_info := LocationInfo file_0 257 20 257 25. + Definition loc_218 : location_info := LocationInfo file_0 257 20 257 25. + Definition loc_219 : location_info := LocationInfo file_0 257 21 257 25. + Definition loc_220 : location_info := LocationInfo file_0 257 21 257 25. + Definition loc_225 : location_info := LocationInfo file_0 275 4 275 53. + Definition loc_226 : location_info := LocationInfo file_0 276 4 277 33. + Definition loc_227 : location_info := LocationInfo file_0 278 4 278 53. + Definition loc_228 : location_info := LocationInfo file_0 279 4 279 36. + Definition loc_229 : location_info := LocationInfo file_0 280 4 280 18. + Definition loc_230 : location_info := LocationInfo file_0 282 4 283 26. + Definition loc_231 : location_info := LocationInfo file_0 285 1 285 13. + Definition loc_232 : location_info := LocationInfo file_0 286 4 286 13. + Definition loc_233 : location_info := LocationInfo file_0 286 11 286 12. + Definition loc_234 : location_info := LocationInfo file_0 285 1 285 6. + Definition loc_235 : location_info := LocationInfo file_0 285 2 285 6. + Definition loc_236 : location_info := LocationInfo file_0 285 2 285 6. + Definition loc_237 : location_info := LocationInfo file_0 285 9 285 12. + Definition loc_238 : location_info := LocationInfo file_0 285 9 285 12. + Definition loc_239 : location_info := LocationInfo file_0 283 8 283 26. + Definition loc_240 : location_info := LocationInfo file_0 283 15 283 25. + Definition loc_241 : location_info := LocationInfo file_0 283 15 283 18. + Definition loc_242 : location_info := LocationInfo file_0 283 15 283 18. + Definition loc_243 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_244 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_246 : location_info := LocationInfo file_0 282 8 282 26. + Definition loc_247 : location_info := LocationInfo file_0 282 8 282 21. + Definition loc_248 : location_info := LocationInfo file_0 282 8 282 21. + Definition loc_249 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_250 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_251 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_252 : location_info := LocationInfo file_0 280 4 280 17. + Definition loc_253 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_254 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_255 : location_info := LocationInfo file_0 280 11 280 17. + Definition loc_256 : location_info := LocationInfo file_0 280 11 280 14. + Definition loc_257 : location_info := LocationInfo file_0 280 11 280 14. + Definition loc_258 : location_info := LocationInfo file_0 280 15 280 16. + Definition loc_259 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_260 : location_info := LocationInfo file_0 279 4 279 35. + Definition loc_261 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_262 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_263 : location_info := LocationInfo file_0 279 11 279 35. + Definition loc_264 : location_info := LocationInfo file_0 279 11 279 21. + Definition loc_265 : location_info := LocationInfo file_0 279 11 279 21. + Definition loc_266 : location_info := LocationInfo file_0 279 22 279 28. + Definition loc_267 : location_info := LocationInfo file_0 279 22 279 25. + Definition loc_268 : location_info := LocationInfo file_0 279 22 279 25. + Definition loc_269 : location_info := LocationInfo file_0 279 26 279 27. + Definition loc_270 : location_info := LocationInfo file_0 279 30 279 34. + Definition loc_271 : location_info := LocationInfo file_0 279 30 279 34. + Definition loc_272 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_273 : location_info := LocationInfo file_0 278 4 278 52. + Definition loc_274 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_275 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_276 : location_info := LocationInfo file_0 278 11 278 52. + Definition loc_277 : location_info := LocationInfo file_0 278 11 278 15. + Definition loc_278 : location_info := LocationInfo file_0 278 11 278 15. + Definition loc_279 : location_info := LocationInfo file_0 278 18 278 52. + Definition loc_280 : location_info := LocationInfo file_0 278 19 278 33. + Definition loc_281 : location_info := LocationInfo file_0 278 19 278 26. + Definition loc_282 : location_info := LocationInfo file_0 278 19 278 26. + Definition loc_283 : location_info := LocationInfo file_0 278 27 278 29. + Definition loc_284 : location_info := LocationInfo file_0 278 31 278 32. + Definition loc_285 : location_info := LocationInfo file_0 278 36 278 51. + Definition loc_286 : location_info := LocationInfo file_0 278 36 278 43. + Definition loc_287 : location_info := LocationInfo file_0 278 36 278 43. + Definition loc_288 : location_info := LocationInfo file_0 278 44 278 46. + Definition loc_289 : location_info := LocationInfo file_0 278 48 278 50. + Definition loc_290 : location_info := LocationInfo file_0 276 15 277 32. + Definition loc_291 : location_info := LocationInfo file_0 276 15 276 32. + Definition loc_292 : location_info := LocationInfo file_0 276 16 276 21. + Definition loc_293 : location_info := LocationInfo file_0 276 16 276 21. + Definition loc_294 : location_info := LocationInfo file_0 276 25 276 31. + Definition loc_295 : location_info := LocationInfo file_0 276 25 276 27. + Definition loc_296 : location_info := LocationInfo file_0 276 30 276 31. + Definition loc_297 : location_info := LocationInfo file_0 276 35 276 36. + Definition loc_298 : location_info := LocationInfo file_0 277 31 277 32. + Definition loc_301 : location_info := LocationInfo file_0 275 33 275 52. + Definition loc_302 : location_info := LocationInfo file_0 275 33 275 48. + Definition loc_303 : location_info := LocationInfo file_0 275 33 275 48. + Definition loc_304 : location_info := LocationInfo file_0 275 49 275 51. + Definition loc_305 : location_info := LocationInfo file_0 275 49 275 51. + Definition loc_308 : location_info := LocationInfo file_0 275 20 275 25. + Definition loc_309 : location_info := LocationInfo file_0 275 20 275 25. + Definition loc_310 : location_info := LocationInfo file_0 275 21 275 25. + Definition loc_311 : location_info := LocationInfo file_0 275 21 275 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v index 2cdc798b..bfebd564 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v @@ -1 +1,29 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_phys_to_pte. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_phys_to_pte]. *) + Lemma type_kvm_phys_to_pte (global_FIELD_PREP global_GENMASK : loc) : + global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ + global_GENMASK ◁ᵥ global_GENMASK @ function_ptr type_of_GENMASK -∗ + typed_function (impl_kvm_phys_to_pte global_FIELD_PREP global_GENMASK) type_of_kvm_phys_to_pte. + Proof. + Open Scope printing_sugar. + start_function "kvm_phys_to_pte" (pa) => arg_pa local_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_phys_to_pte" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_phys_to_pte". + Qed. +End proof_kvm_phys_to_pte. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v index 2cdc798b..61a5aefa 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v @@ -1 +1,28 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_pte_valid. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_pte_valid]. *) + Lemma type_kvm_pte_valid (global_BIT : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + typed_function (impl_kvm_pte_valid global_BIT) type_of_kvm_pte_valid. + Proof. + Open Scope printing_sugar. + start_function "kvm_pte_valid" (pte) => arg_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_pte_valid" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_pte_valid". + Qed. +End proof_kvm_pte_valid. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v index 7ae41c21..2cdc798b 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_valid_leaf_pte.v @@ -1,32 +1 @@ -From refinedc.typing Require Import typing. -From refinedc.linux.casestudies.pgtable Require Import generated_code. -From refinedc.linux.casestudies.pgtable Require Import generated_spec. -From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. -Set Default Proof Using "Type". - -(* Generated from [linux/casestudies/pgtable.c]. *) -Section proof_kvm_set_valid_leaf_pte. - Context `{!typeG Σ} `{!globalG Σ}. - - (* Typing proof for [kvm_set_valid_leaf_pte]. *) - Lemma type_kvm_set_valid_leaf_pte (global_BIT global_FIELD_PREP global_GENMASK global_kvm_phys_to_pte global_kvm_pte_valid : loc) : - global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ - global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ - global_GENMASK ◁ᵥ global_GENMASK @ function_ptr type_of_GENMASK -∗ - global_kvm_phys_to_pte ◁ᵥ global_kvm_phys_to_pte @ function_ptr type_of_kvm_phys_to_pte -∗ - global_kvm_pte_valid ◁ᵥ global_kvm_pte_valid @ function_ptr type_of_kvm_pte_valid -∗ - typed_function (impl_kvm_set_valid_leaf_pte global_BIT global_FIELD_PREP global_GENMASK global_kvm_phys_to_pte global_kvm_pte_valid) type_of_kvm_set_valid_leaf_pte. - Proof. - Open Scope printing_sugar. - start_function "kvm_set_valid_leaf_pte" ([[[[[[p pte] pa] attr] level] pte1] is_page]) => arg_ptep arg_pa arg_attr arg_level local_old local_type local_pte. - split_blocks (( - ∅ - )%I : gmap label (iProp Σ)) (( - ∅ - )%I : gmap label (iProp Σ)). - - repeat liRStep; liShow. - all: print_typesystem_goal "kvm_set_valid_leaf_pte" "#0". - Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. - all: print_sidecondition_goal "kvm_set_valid_leaf_pte". - Qed. -End proof_kvm_set_valid_leaf_pte. +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index d80a0907..5b09a508 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -91,12 +91,12 @@ Section spec. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : bin * Z; (pte @ (binary (u64))), (level @ (int (u32))); True) - → ∃ () : (), ((bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] && pte.[page_or_table]) @ (boolean (bool_it))); True. + → ∃ () : (), ((if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] then pte.[page_or_table] else false) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := fn(∀ (pte, p) : bin * loc; (p @ (&own (pte @ (binary (u64))))); True) - → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := false]) @ (binary (u64)))). + → ∃ () : (), (void); (p ◁ₗ ((pte.[valid := [false]]) @ (binary (u64)))). (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := @@ -105,12 +105,12 @@ Section spec. (* Specifications for function [kvm_set_table_pte]. *) Definition type_of_kvm_set_table_pte := - fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * bin * Z * mm_ops; (p @ (&own (pte @ (binary (u64))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte.[valid] = true⌝) - → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := true; valid := true]) @ (binary (u64)))). + fn(∀ (p, q, o, pte, va, ops) : loc * loc * loc * bin * Z * mm_ops; (p @ (&own (pte @ (binary (u64))))), (q @ (&own (va @ (int (u64))))), (o @ (&own (ops @ (kvm_pgtable_mm_ops)))); ⌜pte.[valid] = [true]⌝) + → ∃ pa : Z, (void); ⌜ops.(virt_to_phys) va = pa⌝ ∗ (p ◁ₗ ((0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := [true]; valid := [true]]) @ (binary (u64)))). (* Specifications for function [kvm_set_valid_leaf_pte]. *) Definition type_of_kvm_set_valid_leaf_pte := - fn(∀ (p, pte, pa, attr, level, pte1, is_page) : loc * bin * Z * bin * Z * bin * bool; (p @ (&own (pte @ (binary (u64))))), (pa @ (int (u64))), (attr @ (binary (u64))), (level @ (int (u32))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := is_page; valid := true]⌝) + fn(∀ (p, pte, pa, attr, level, pte1, is_page) : loc * bin * Z * bin * Z * bin * bool; (p @ (&own (pte @ (binary (u64))))), (pa @ (int (u64))), (attr @ (binary (u64))), (level @ (int (u32))); ⌜is_page = bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1)⌝ ∗ ⌜pte1 = 0%%Pte.[addr := pa%%Pte.[addr]; leaf_attr_lo := attr.[leaf_attr_lo]; leaf_attr_hi := attr.[leaf_attr_hi]].[page_or_table := [is_page]; valid := [true]]⌝) → ∃ () : (), ((if pte.[valid] then bool_decide (pte = pte1) else true) @ (boolean (bool_it))); (p ◁ₗ ((if pte.[valid] then pte else pte1) @ (binary (u64)))). End spec. diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 0bd4c716..465048c1 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -32,3 +32,5 @@ Definition DATA (a : nat) (v : bin) : list (nat * bin) := [(a, v)]. Arguments replicate : simpl never. + +Coercion bin_to_bool : bin >-> bool. diff --git a/theories/typing/binary.v b/theories/typing/binary.v index aad1cea5..b46fc921 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -8,10 +8,7 @@ Section bin. Definition bin : Type := list bool. Definition bin_to_bool (v : bin) : bool := - match v with - | [] => false - | b :: _ => b - end. + negb (bool_decide (v = replicate (length v) false)). Declare Scope bin_scope. @@ -112,10 +109,14 @@ Section bin. (* range operations *) Definition bin_slice (start len : nat) (v : bin) : bin := drop start (take (start + len) v). + + Lemma bin_slice_spec a k v : + (a + k ≤ length v)%nat → length (bin_slice a k v) = k. + Admitted. (* TODO: len is redundent *) Definition bin_update (start len : nat) (new : bin) (v : bin) : bin := - take start v ++ new ++ drop (start + len) v. + take start v ++ new ++ drop (start + length new) v. (* A mask is a special `bin` with the following form: least significant <-- 0..01..10..0 --> most significant @@ -143,6 +144,11 @@ Section bin. Definition mk_data (shapes : list (nat * bin)) (len : nat) : bin := foldl bin_or (mk_zero len) ((λ p, mk_data_1 p.1 p.2 len) <$> shapes). + + Lemma mk_data_trivial a v len : + (a + length v ≤ len)%nat → + mk_data [(a, v)] len = replicate a false ++ v ++ replicate (len - (a + length v)) false. + Admitted. Definition mk_mask (shapes : list (nat * nat)) (len : nat) : bin := foldl bin_or (mk_zero len) ((λ p, mk_mask_1 p.1 p.2 len) <$> shapes). diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 996636f9..1fb50fc8 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -6,31 +6,24 @@ Record field := Field { field_offset : nat; field_len : nat; - field_type : Type; - field_encode : field_type → bin; - field_decode : bin → field_type; - encode_decode : ∀ x, field_decode (field_encode x) = x; + (* The following seem not very useful now. *) + (* field_type : Type; *) + (* field_encode : field_type → vec bool field_len; *) + (* field_decode : vec bool field_len → field_type; *) + (* encode_decode : ∀ x, field_decode (field_encode x) = x; *) }. -Program Definition bool_field (offset : nat) := {| +Definition bool_field (offset : nat) := {| field_offset := offset; field_len := 1; - field_type := bool; - field_encode b := [b]; - field_decode v := match head v with Some b => b | None => false end; |}. -Next Obligation. done. Qed. -Program Definition data_field (offset len : nat) := {| +Definition data_field (offset len : nat) := {| field_offset := offset; field_len := len; - field_type := bin; - field_encode := id; - field_decode := id; |}. -Next Obligation. done. Qed. -Program Definition undef_field := data_field. +Definition undef_field := data_field. Record bitvec_type := BitvecType { @@ -46,7 +39,7 @@ Definition bt_layout (bt : bitvec_type) : layout := {| Definition bvec (bt : bitvec_type) : Type := vec bool (bt_length bt). -Section vec. +(* Section vec. Fixpoint vec_take {A n} k (Hk : (k ≤ n)%nat) (v : vec A n) : vec A k. Proof. @@ -166,7 +159,7 @@ Section bool_vec. | S k => Z.testbit n i ::: Z_slice_v (S i) k n end. -End bool_vec. +End bool_vec. *) Section bitvec_op. @@ -176,17 +169,17 @@ Section bitvec_op. | _ => Z_slice 0 (bt_length bt) n end. - Definition bvec_get (bv : bin) (f : field) : field_type f := - field_decode f (bin_slice (field_offset f) (field_len f) bv). + Definition bvec_get (bv : bin) (f : field) : bin := + bin_slice (field_offset f) (field_len f) bv. - Definition bvec_put (bv : bin) (f : field) (x : field_type f) : bin := - bin_update (field_offset f) (field_len f) (field_encode f x) bv. + Definition bvec_put (bv : bin) (f : field) (x : bin) : bin := + bin_update (field_offset f) (field_len f) x bv. End bitvec_op. Declare Scope bitvec_scope. -Notation "n %% bt" := (Z_as_bvec bt n) (at level 5, format "n %% bt") : bitvec_scope. +Notation "n %% bt" := (Z_to_bin (bt_length bt) n) (at level 5, format "n %% bt") : bitvec_scope. Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]") : bitvec_scope. @@ -814,15 +807,15 @@ Section programs. Global Instance subsume_data_binary_inst it v shape bv : Subsume (v ◁ᵥ shape @ bdata it)%I (v ◁ᵥ bv @ binary it)%I := λ T, i2p (subsume_data_binary T it v shape bv). - Lemma type_cast_data_to_bool it1 it2 v shape T: + Lemma type_cast_data_to_bool it1 it2 v a x T: let N := Z.to_nat (bits_per_int it1) in - let b := bin_to_bool (mk_data shape N) in + let b := bin_to_bool x in T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ - typed_un_op v (v ◁ᵥ shape @ bdata it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + typed_un_op v (v ◁ᵥ [(a, x)] @ bdata it1)%I (CastOp (IntOp it2)) (IntOp it1) T. Admitted. - Global Instance type_cast_binary_to_bool_inst it1 it2 v shape : - TypedUnOpVal v (shape @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := - λ T, i2p (type_cast_data_to_bool it1 it2 v shape T). + Global Instance type_cast_binary_to_bool_inst it1 it2 v a x : + TypedUnOpVal v ([(a, x)] @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := + λ T, i2p (type_cast_data_to_bool it1 it2 v a x T). Lemma type_binary_eq it v1 bv1 v2 bv2 T : let b := bool_decide (bv1 = bv2) in -- GitLab From 3885e54a0b1fe760b844794fdd675cef713c7bf2 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 8 Apr 2021 20:27:49 +0800 Subject: [PATCH 12/71] binary to rule them all --- linux/casestudies/pgtable.c | 16 +- .../pgtable/generated_proof_kvm_phys_to_pte.v | 30 +-- .../pgtable/generated_proof_kvm_pte_valid.v | 29 +-- .../proofs/pgtable/generated_spec.v | 10 +- .../proofs/pgtable/pgtable_lemmas.v | 6 - theories/typing/binary.v | 22 ++- theories/typing/bitvec.v | 185 ++++++++++++------ 7 files changed, 156 insertions(+), 142 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 2a6b0f2e..7a73c338 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -20,7 +20,7 @@ typedef uint32_t u32; [[rc::parameters("i : nat")]] [[rc::args("i @ int")]] [[rc::requires("{i < 64}")]] -[[rc::returns("{MASK i 1} @ bmask")]] +[[rc::returns("{mk_mask (MASK i 1) 64} @ binary")]] [[rc::trust_me]] u64 BIT(int i) { @@ -37,7 +37,7 @@ u64 BIT(int i) [[rc::parameters("h : nat", "l : nat")]] [[rc::args("h @ int", "l @ int")]] [[rc::requires("{h < 64}", "{l <= h}")]] -[[rc::returns("{MASK l (h - l + 1)%nat} @ bmask")]] +[[rc::returns("{mk_mask (MASK l (h - l + 1)%nat) 64} @ binary")]] [[rc::trust_me]] u64 GENMASK(int h, int l) { @@ -84,7 +84,7 @@ int __builtin_ffsll (long long x); // #define FIELD_GET(_mask, _reg) \ (((_reg) & (_mask)) >> __bf_shf(_mask)) [[rc::parameters("r : bin", "a : nat", "k : nat")]] -[[rc::args("{MASK a k} @ bmask", "r @ binary")]] +[[rc::args("{mk_mask (MASK a k) 64} @ binary", "r @ binary")]] [[rc::returns("{bin_slice a k r ++ replicate (64 - k) false} @ binary")]] [[rc::trust_me]] u64 FIELD_GET(u64 _mask, u64 _reg) @@ -112,8 +112,8 @@ u64 FIELD_GET(u64 _mask, u64 _reg) // #define FIELD_PREP(_mask, _val) \ (((_val) << __bf_shf(_mask)) & (_mask)) [[rc::parameters("a : nat", "k : nat", "v : bin")]] -[[rc::args("{MASK a k} @ bmask", "v @ binary")]] -[[rc::returns("{DATA a (take k v)} @ bdata")]] +[[rc::args("{mk_mask (MASK a k) 64} @ binary", "v @ binary")]] +[[rc::returns("{mk_data (DATA a (take k v)) 64} @ binary")]] [[rc::trust_me]] u64 FIELD_PREP(u64 _mask, u64 _val) { @@ -199,7 +199,7 @@ struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { [[rc::parameters("pte : bin")]] [[rc::args("pte @ binary")]] [[rc::returns("{pte.[valid]} @ boolean")]] -// [[rc::trust_me]] +[[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; @@ -221,7 +221,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : bin", "p : loc")]] [[rc::args("p @ &own>")]] [[rc::ensures("own p : {pte.[valid := [false]]} @ binary")]] -[[rc::trust_me]] // NOTE: type system stuck, need a rule: ty1 <: ty2, then &own <: &own +[[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { kvm_pte_t pte = *ptep; @@ -231,7 +231,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : Z")]] [[rc::args("pa @ int")]] [[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ binary")]] -// [[rc::trust_me]] +[[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v index bfebd564..2cdc798b 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v @@ -1,29 +1 @@ -From refinedc.typing Require Import typing. -From refinedc.linux.casestudies.pgtable Require Import generated_code. -From refinedc.linux.casestudies.pgtable Require Import generated_spec. -From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. -Set Default Proof Using "Type". - -(* Generated from [linux/casestudies/pgtable.c]. *) -Section proof_kvm_phys_to_pte. - Context `{!typeG Σ} `{!globalG Σ}. - - (* Typing proof for [kvm_phys_to_pte]. *) - Lemma type_kvm_phys_to_pte (global_FIELD_PREP global_GENMASK : loc) : - global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ - global_GENMASK ◁ᵥ global_GENMASK @ function_ptr type_of_GENMASK -∗ - typed_function (impl_kvm_phys_to_pte global_FIELD_PREP global_GENMASK) type_of_kvm_phys_to_pte. - Proof. - Open Scope printing_sugar. - start_function "kvm_phys_to_pte" (pa) => arg_pa local_pte. - split_blocks (( - ∅ - )%I : gmap label (iProp Σ)) (( - ∅ - )%I : gmap label (iProp Σ)). - - repeat liRStep; liShow. - all: print_typesystem_goal "kvm_phys_to_pte" "#0". - Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. - all: print_sidecondition_goal "kvm_phys_to_pte". - Qed. -End proof_kvm_phys_to_pte. +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v index 61a5aefa..2cdc798b 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v @@ -1,28 +1 @@ -From refinedc.typing Require Import typing. -From refinedc.linux.casestudies.pgtable Require Import generated_code. -From refinedc.linux.casestudies.pgtable Require Import generated_spec. -From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. -Set Default Proof Using "Type". - -(* Generated from [linux/casestudies/pgtable.c]. *) -Section proof_kvm_pte_valid. - Context `{!typeG Σ} `{!globalG Σ}. - - (* Typing proof for [kvm_pte_valid]. *) - Lemma type_kvm_pte_valid (global_BIT : loc) : - global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ - typed_function (impl_kvm_pte_valid global_BIT) type_of_kvm_pte_valid. - Proof. - Open Scope printing_sugar. - start_function "kvm_pte_valid" (pte) => arg_pte. - split_blocks (( - ∅ - )%I : gmap label (iProp Σ)) (( - ∅ - )%I : gmap label (iProp Σ)). - - repeat liRStep; liShow. - all: print_typesystem_goal "kvm_pte_valid" "#0". - Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. - all: print_sidecondition_goal "kvm_pte_valid". - Qed. -End proof_kvm_pte_valid. +(* Let's skip that, you seem to have some faith. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index 5b09a508..b1d7820a 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -61,12 +61,12 @@ Section spec. (* Specifications for function [BIT]. *) Definition type_of_BIT := fn(∀ i : nat; (i @ (int (i32))); ⌜i < 64⌝) - → ∃ () : (), ((MASK i 1) @ (bmask (u64))); True. + → ∃ () : (), ((mk_mask (MASK i 1) 64) @ (binary (u64))); True. (* Specifications for function [GENMASK]. *) Definition type_of_GENMASK := fn(∀ (h, l) : nat * nat; (h @ (int (i32))), (l @ (int (i32))); ⌜h < 64⌝ ∗ ⌜l <= h⌝) - → ∃ () : (), ((MASK l (h - l + 1)%nat) @ (bmask (u64))); True. + → ∃ () : (), ((mk_mask (MASK l (h - l + 1)%nat) 64) @ (binary (u64))); True. (* Specifications for function [__builtin_ffsll]. *) Definition type_of___builtin_ffsll := @@ -75,13 +75,13 @@ Section spec. (* Specifications for function [FIELD_GET]. *) Definition type_of_FIELD_GET := - fn(∀ (r, a, k) : bin * nat * nat; ((MASK a k) @ (bmask (u64))), (r @ (binary (u64))); True) + fn(∀ (r, a, k) : bin * nat * nat; ((mk_mask (MASK a k) 64) @ (binary (u64))), (r @ (binary (u64))); True) → ∃ () : (), ((bin_slice a k r ++ replicate (64 - k) false) @ (binary (u64))); True. (* Specifications for function [FIELD_PREP]. *) Definition type_of_FIELD_PREP := - fn(∀ (a, k, v) : nat * nat * bin; ((MASK a k) @ (bmask (u64))), (v @ (binary (u64))); True) - → ∃ () : (), ((DATA a (take k v)) @ (bdata (u64))); True. + fn(∀ (a, k, v) : nat * nat * bin; ((mk_mask (MASK a k) 64) @ (binary (u64))), (v @ (binary (u64))); True) + → ∃ () : (), ((mk_data (DATA a (take k v)) 64) @ (binary (u64))); True. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 465048c1..56b11d5c 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -25,12 +25,6 @@ Global Instance simpl_check_mask N k x y : (λ T, x = Z.to_nat k ∧ y = 1%nat ∧ T). Admitted. *) -Definition MASK (a k : nat) : list (nat * nat) := - [(a, k)]. - -Definition DATA (a : nat) (v : bin) : list (nat * bin) := - [(a, v)]. - Arguments replicate : simpl never. Coercion bin_to_bool : bin >-> bool. diff --git a/theories/typing/binary.v b/theories/typing/binary.v index b46fc921..54d40d1e 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -7,8 +7,9 @@ Section bin. (* The first element is the least significant bit. *) Definition bin : Type := list bool. - Definition bin_to_bool (v : bin) : bool := - negb (bool_decide (v = replicate (length v) false)). + Definition bin_eq_zero (v : bin) : Prop := Forall (λ b, b = false) v. + + Definition bin_to_bool (v : bin) : bool := negb (bool_decide (bin_eq_zero v)). Declare Scope bin_scope. @@ -151,7 +152,7 @@ Section bin. Admitted. Definition mk_mask (shapes : list (nat * nat)) (len : nat) : bin := - foldl bin_or (mk_zero len) ((λ p, mk_mask_1 p.1 p.2 len) <$> shapes). + mk_data ((λ p, (p.1, replicate p.2 true)) <$> shapes) len. Definition mask_to_data (shapes : list (nat * nat)) : list (nat * bin) := (λ p, (p.1, replicate p.2 true)) <$> shapes. @@ -159,9 +160,8 @@ Section bin. Definition bin_mask_and (v : bin) (shapes : list (nat * nat)) : list (nat * bin) := (λ p, (p.1, bin_slice p.1 p.2 v)) <$> shapes. - (* TODO *) - Definition bin_data_or_precond (v : bin) (shape : list (nat * bin)) : Prop := - False. + Definition bin_data_or_precond (v : bin) (shapes : list (nat * bin)) : Prop := + Forall bin_eq_zero ((λ p, (bin_slice p.1 (length p.2) v)) <$> shapes). Fixpoint bin_data_or (v : bin) (shape : list (nat * bin)) : bin := match shape with @@ -169,12 +169,18 @@ Section bin. | (a, v') :: rest => bin_data_or (bin_update a (length v') v' v) rest end. + Definition single_masks_disjoint (lhs rhs : nat * nat) : Prop := + let (a, k) := lhs in + let (b, _) := rhs in + (a + k ≤ b)%nat. + +(* Definition mask_or_precond (lhs rhs : list (nat * nat)) : Prop := False. - (* TODO: to make mask or easier, a mask should be represented by (offset, nat) *) Definition mask_or (lhs rhs : list (nat * nat)) : list (nat * nat) := lhs ++ rhs. +*) Fixpoint mask_neg_go (shapes : list (nat * nat)) (offset : nat) (len : nat) : list (nat * nat) := match shapes with @@ -224,7 +230,7 @@ Section bin. Definition bin_of_val (v : val) : bin. Admitted. - Definition bin_to_int (bv : bin) (it : int_type) : option Z := + Definition bin_to_int (it : int_type) (bv : bin) : option Z := if decide (bits_per_int it = length bv) then let z := Z.of_nat (bool_vec_to_nat (list_to_vec bv)) in if it.(it_signed) && bool_decide (int_half_modulus it ≤ z) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 1fb50fc8..f79f02a6 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -612,7 +612,8 @@ Section bin. Qed. *) -Section bitvec. +(* Deprecated *) +(* Section bitvec. Context `{!typeG Σ}. Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bin) : type := {| @@ -654,52 +655,36 @@ Section bitvec. Qed. End bitvec. -Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. +Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. *) Section binary. Context `{!typeG Σ}. Program Definition binary_inner_type (it : int_type) (bv : bin) : type := {| - ty_own β l := (∃ v, ⌜val_of_bin bv = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I + ty_own β l := (l ◁ₗ{β} (bin_to_Z bv) @ int it)%I; + ty_share := ty_share (int_inner_type _ _) |}. - Next Obligation. - iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. - Qed. - Program Definition binary (it : int_type) : rtype := {| + Definition binary (it : int_type) : rtype := {| rty_type := bin; rty := binary_inner_type it |}. - Global Program Instance binary_rmovable it : RMovable (binary it) := {| - rmovable bv := {| - ty_layout := it_layout it; - ty_own_val v := ⌜val_of_bin bv = Some v⌝%I; - |} |}. - Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. - Next Obligation. Admitted. - (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) - Next Obligation. - iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". - iExists _. by iFrame. - Qed. - Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. - Next Obligation. iIntros (it x1 x2). done. Qed. + Global Program Instance rmovable_binary it : RMovable (binary it) := {| + rmovable bv := rmovable (int it) (bin_to_Z bv); + |}. + Next Obligation. done. Qed. - Global Program Instance binary_copyable it bv : Copyable (bv @ binary it). - Next Obligation. - iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". - iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. - iExists _, _. iFrame. iModIntro. iSplit => //. - by iIntros "_". - Qed. + Global Program Instance binary_copyable it bv : Copyable (bv @ binary it) := + int_copyable (bin_to_Z bv) it. End binary. Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'") : printing_sugar. (* TODO: better names like: bits, bits_mask, bits_data?*) +(* Section bdata. Context `{!typeG Σ}. @@ -789,38 +774,82 @@ Section bmask. End bmask. Notation "bmask< it >" := (bmask it) (only printing, format "'bmask<' it '>'") : printing_sugar. +*) Section programs. Context `{!typeG Σ}. + Definition MASK (a k : nat) : list (nat * nat) := + [(a, k)]. + + Definition DATA (a : nat) (v : bin) : list (nat * bin) := + [(a, v)]. + + Lemma subsume_val_int_binary T it v n bv : + let N := Z.to_nat (bits_per_int it) in + (⌜bv = Z_to_bin N n⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. + Proof. + iIntros "[Heq $] Hn". rewrite /ty_own_val /=. + iDestruct "Heq" as %->. iDestruct "Hn" as %<-. iPureIntro. + Admitted. + Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it) (bv @ binary it) := + λ T, i2p (subsume_val_int_binary T it v n bv). + + (* Lemma subsume_int_binary T v it n bv : (⌜bv = Z_to_bin (Z.to_nat (bits_per_int it)) n⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. - Admitted. Global Instance subsume_int_binary_inst v it n bv : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ bv @ binary it)%I := λ T, i2p (subsume_int_binary T v it n bv). + *) - Lemma subsume_data_binary T it v shape bv : + (* TODO: SubsumeVal *) + (* Global Instance simple_subsume_val_data_binary it shape bv: + SubsumeVal (shape @ bdata it)%I (bv @ binary it)%I (⌜bv = mk_data shape (Z.to_nat (bits_per_int it))⌝). + Proof. + iIntros (v) "Heq Hn". rewrite /ty_own_val /=. + by iDestruct "Heq" as %->. + Qed. *) +(* + Lemma subsume_data_binary T it p shape bv : let N := Z.to_nat (bits_per_int it) in - (⌜bv = mk_data shape N⌝ ∗ T) -∗ subsume (v ◁ᵥ shape @ bdata it) (v ◁ᵥ bv @ binary it) T. + (⌜bv = mk_data shape N⌝ ∗ T) -∗ subsume (p ◁ₗ shape @ bdata it) (p ◁ₗ bv @ binary it) T. Admitted. - Global Instance subsume_data_binary_inst it v shape bv : Subsume (v ◁ᵥ shape @ bdata it)%I (v ◁ᵥ bv @ binary it)%I := - λ T, i2p (subsume_data_binary T it v shape bv). + Global Instance subsume_data_binary_inst it p shape bv : SubsumePlace p Own (shape @ bdata it)%I (bv @ binary it)%I := + λ T, i2p (subsume_data_binary T it p shape bv). *) - Lemma type_cast_data_to_bool it1 it2 v a x T: + Lemma type_cast_data_bool it1 it2 v a d T: let N := Z.to_nat (bits_per_int it1) in + let b := bin_to_bool d in + T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ + typed_un_op v (v ◁ᵥ mk_data (DATA a d) N @ binary it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + Proof. + Admitted. + Global Instance type_cast_data_bool_inst it1 it2 v a d : + TypedUnOpVal v (mk_data (DATA a d) (Z.to_nat (bits_per_int it1)) @ binary it1) (CastOp (IntOp it2)) (IntOp it1) := + λ T, i2p (type_cast_data_bool it1 it2 v a d T). + + (* Lemma type_cast_data_to_bool it1 it2 v a x T: let b := bin_to_bool x in T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ typed_un_op v (v ◁ᵥ [(a, x)] @ bdata it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + Proof. Admitted. Global Instance type_cast_binary_to_bool_inst it1 it2 v a x : TypedUnOpVal v ([(a, x)] @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := - λ T, i2p (type_cast_data_to_bool it1 it2 v a x T). + λ T, i2p (type_cast_data_to_bool it1 it2 v a x T). *) Lemma type_binary_eq it v1 bv1 v2 bv2 T : + let N := Z.to_nat (bits_per_int it) in let b := bool_decide (bv1 = bv2) in T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) EqOp (IntOp it) (IntOp it) T. + Proof. + iIntros (Heq) "HT". iIntros (Hv1 Hv2 Φ) "HΦ". + (* move: Hv1 Hv2 => /(val_of_bin_to_int it) Hv1 /(val_of_bin_to_int it) Hv2. *) + iApply (wp_binop_det (i2v (Z_of_bool (bool_decide (bv1 = bv2))) i32)). iSplit. + { iIntros (σ v) "_ !%". admit. } + iApply "HΦ"; last done. iPureIntro. by case_bool_decide. Admitted. Global Program Instance type_binary_eq_inst it v1 bv1 v2 bv2: TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I EqOp (IntOp it) (IntOp it) := @@ -835,35 +864,65 @@ Section programs. TypedBinOpVal v1 (bv @ (binary it))%I v2 (n @ (int it))%I EqOp (IntOp it) (IntOp it) := λ T, i2p (type_binary_int_eq it v1 bv v2 n T). - Lemma type_binary_mask_and it v1 bv1 v2 shape T: - let N := Z.to_nat (bits_per_int it) in + (* Lemma type_binary_mask_and it v1 bv1 v2 shape T: + let N := Z.to_nat (bits_per_int it) in let shape' := bin_mask_and bv1 shape in T (b2v (mk_data shape' N)) (t2mt (shape' @ bdata it)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T. Admitted. Global Program Instance type_binary_mask_and_inst it v1 bv1 v2 shape : TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_and it v1 bv1 v2 shape T). + λ T, i2p (type_binary_mask_and it v1 bv1 v2 shape T). *) +(* + Lemma type_and_binary it v1 bv1 v2 bv2 T: + let bv := bin_and bv1 bv2 in + T (b2v bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_and_binary_inst it v1 bv1 v2 bv2 : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ binary it)%I AndOp (IntOp it) (IntOp it) | 10 := + λ T, i2p (type_and_binary it v1 bv1 v2 bv2 T). *) - Lemma type_int_mask_and it v1 n1 v2 shape T: + Lemma type_binary_and_single_mask it v1 bv1 v2 a k T: let N := Z.to_nat (bits_per_int it) in - typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T -∗ - typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T. + let bv := mk_data (DATA a (bin_slice a k bv1)) N in + T (b2v bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T. Admitted. - Global Program Instance type_int_mask_and_inst it v1 n1 v2 shape : - TypedBinOpVal v1 (n1 @ int it)%I v2 (shape @ (bmask it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_int_mask_and it v1 n1 v2 shape T). + Global Program Instance type_binary_and_single_mask_inst it v1 bv1 v2 a k : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_mask (MASK a k) (Z.to_nat (bits_per_int it)) @ binary it)%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_binary_and_single_mask it v1 bv1 v2 a k T). + + Lemma type_and_binary_mask it v1 bv1 v2 ms T: + let N := Z.to_nat (bits_per_int it) in + let bv := mk_data (bin_mask_and bv1 ms) N in + T (b2v bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_mask ms N @ binary it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_and_binary_mask_inst it v1 bv1 v2 ms : + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_mask ms (Z.to_nat (bits_per_int it)) @ binary it)%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_and_binary_mask it v1 bv1 v2 ms T). + + Lemma type_int_mask_and it v1 n1 v2 a k T: + let N := Z.to_nat (bits_per_int it) in + typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T -∗ + typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_int_mask_and_inst it v1 n1 v2 a k : + TypedBinOpVal v1 (n1 @ int it)%I v2 (mk_mask (MASK a k) (Z.to_nat (bits_per_int it)) @ (binary it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). Lemma type_binary_data_or it v1 bv1 v2 shape T: + let N := Z.to_nat (bits_per_int it) in let bv := bin_data_or bv1 shape in (⌜bin_data_or_precond bv1 shape⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bdata it) OrOp (IntOp it) (IntOp it) T. + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_data shape N @ binary it) OrOp (IntOp it) (IntOp it) T. Admitted. Global Program Instance type_binary_data_or_inst it v1 bv1 v2 shape : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bdata it))%I OrOp (IntOp it) (IntOp it) := + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_data shape (Z.to_nat (bits_per_int it)) @ (binary it))%I OrOp (IntOp it) (IntOp it) := λ T, i2p (type_binary_data_or it v1 bv1 v2 shape T). - - Lemma type_binary_mask_or it v1 bv1 v2 shape T: +(* + (* Lemma type_binary_mask_or it v1 bv1 v2 shape T: let N := Z.to_nat (bits_per_int it) in let bv := bin_data_or bv1 (mask_to_data shape) in (⌜bin_data_or_precond bv1 (mask_to_data shape)⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ @@ -871,9 +930,19 @@ Section programs. Admitted. Global Program Instance type_binary_mask_or_inst it v1 bv1 v2 shape : TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_or it v1 bv1 v2 shape T). + λ T, i2p (type_binary_mask_or it v1 bv1 v2 shape T). *) *) + + Lemma type_mask_single_or it v1 m1 v2 m2 T: + let N := Z.to_nat (bits_per_int it) in + let shape := [m1; m2] in + (⌜single_masks_disjoint m1 m2⌝ ∗ T (b2v (mk_mask shape N)) (t2mt (mk_mask shape N @ binary it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ mk_mask [m1] N @ binary it) v2 (v2 ◁ᵥ mk_mask [m2] N @ binary it) OrOp (IntOp it) (IntOp it) T. + Admitted. + Global Program Instance type_mask_or_inst it v1 m1 v2 m2: + TypedBinOpVal v1 (mk_mask [m1] (Z.to_nat (bits_per_int it)) @ binary it)%I v2 (mk_mask [m2] (Z.to_nat (bits_per_int it)) @ binary it)%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_mask_single_or it v1 m1 v2 m2 T). - Lemma type_mask_or it v1 shape1 v2 shape2 T: + (* Lemma type_mask_or it v1 shape1 v2 shape2 T: let N := Z.to_nat (bits_per_int it) in let shape := mask_or shape1 shape2 in (⌜mask_or_precond shape1 shape2⌝ ∗ T (b2v (mk_mask shape N)) (t2mt (shape @ bmask it))) -∗ @@ -881,16 +950,16 @@ Section programs. Admitted. Global Program Instance type_mask_or_inst it v1 shape1 v2 shape2: TypedBinOpVal v1 (shape1 @ bmask it)%I v2 (shape2 @ (bmask it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_mask_or it v1 shape1 v2 shape2 T). + λ T, i2p (type_mask_or it v1 shape1 v2 shape2 T). *) - Lemma type_mask_neg it v shape T : + Lemma type_mask_neg it v k T : let N := Z.to_nat (bits_per_int it) in - let shape' := mask_neg shape N in - T (b2v (mk_mask shape' N)) (t2mt (shape' @ bmask it)) -∗ - typed_un_op v (v ◁ᵥ shape @ bmask it) NotIntOp (IntOp it) T. + let bv := mk_mask (MASK k (N - k)) N in + T (b2v bv) (t2mt (bv @ binary it)) -∗ + typed_un_op v (v ◁ᵥ mk_mask (MASK 0 k) N @ binary it) NotIntOp (IntOp it) T. Admitted. - Global Program Instance type_mask_neg_inst it v shape: - TypedUnOpVal v (shape @ bmask it) NotIntOp (IntOp it) := - λ T, i2p (type_mask_neg it v shape T). + Global Program Instance type_mask_neg_inst it v k: + TypedUnOpVal v (mk_mask (MASK 0 k) (Z.to_nat (bits_per_int it)) @ binary it) NotIntOp (IntOp it) := + λ T, i2p (type_mask_neg it v k T). End programs. -- GitLab From ba557cff7abe02057bb04d14bbe1f23901b15158 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 13 Apr 2021 11:34:59 +0800 Subject: [PATCH 13/71] general lemmas for typing rules --- linux/casestudies/pgtable.c | 10 +- .../proofs/pgtable/generated_spec.v | 10 +- theories/typing/binary.v | 55 +- theories/typing/bitvec.v | 945 ++++-------------- 4 files changed, 224 insertions(+), 796 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 7a73c338..00b981c1 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -20,7 +20,7 @@ typedef uint32_t u32; [[rc::parameters("i : nat")]] [[rc::args("i @ int")]] [[rc::requires("{i < 64}")]] -[[rc::returns("{mk_mask (MASK i 1) 64} @ binary")]] +[[rc::returns("{bin_mask 64 i 1} @ binary")]] [[rc::trust_me]] u64 BIT(int i) { @@ -37,7 +37,7 @@ u64 BIT(int i) [[rc::parameters("h : nat", "l : nat")]] [[rc::args("h @ int", "l @ int")]] [[rc::requires("{h < 64}", "{l <= h}")]] -[[rc::returns("{mk_mask (MASK l (h - l + 1)%nat) 64} @ binary")]] +[[rc::returns("{bin_mask 64 l (h - l + 1)%nat} @ binary")]] [[rc::trust_me]] u64 GENMASK(int h, int l) { @@ -84,7 +84,7 @@ int __builtin_ffsll (long long x); // #define FIELD_GET(_mask, _reg) \ (((_reg) & (_mask)) >> __bf_shf(_mask)) [[rc::parameters("r : bin", "a : nat", "k : nat")]] -[[rc::args("{mk_mask (MASK a k) 64} @ binary", "r @ binary")]] +[[rc::args("{bin_mask 64 a k} @ binary", "r @ binary")]] [[rc::returns("{bin_slice a k r ++ replicate (64 - k) false} @ binary")]] [[rc::trust_me]] u64 FIELD_GET(u64 _mask, u64 _reg) @@ -112,8 +112,8 @@ u64 FIELD_GET(u64 _mask, u64 _reg) // #define FIELD_PREP(_mask, _val) \ (((_val) << __bf_shf(_mask)) & (_mask)) [[rc::parameters("a : nat", "k : nat", "v : bin")]] -[[rc::args("{mk_mask (MASK a k) 64} @ binary", "v @ binary")]] -[[rc::returns("{mk_data (DATA a (take k v)) 64} @ binary")]] +[[rc::args("{bin_mask 64 a k} @ binary", "v @ binary")]] +[[rc::returns("{bin_data 64 a (take k v)} @ binary")]] [[rc::trust_me]] u64 FIELD_PREP(u64 _mask, u64 _val) { diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index b1d7820a..e7f84b64 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -61,12 +61,12 @@ Section spec. (* Specifications for function [BIT]. *) Definition type_of_BIT := fn(∀ i : nat; (i @ (int (i32))); ⌜i < 64⌝) - → ∃ () : (), ((mk_mask (MASK i 1) 64) @ (binary (u64))); True. + → ∃ () : (), ((bin_mask 64 i 1) @ (binary (u64))); True. (* Specifications for function [GENMASK]. *) Definition type_of_GENMASK := fn(∀ (h, l) : nat * nat; (h @ (int (i32))), (l @ (int (i32))); ⌜h < 64⌝ ∗ ⌜l <= h⌝) - → ∃ () : (), ((mk_mask (MASK l (h - l + 1)%nat) 64) @ (binary (u64))); True. + → ∃ () : (), ((bin_mask 64 l (h - l + 1)%nat) @ (binary (u64))); True. (* Specifications for function [__builtin_ffsll]. *) Definition type_of___builtin_ffsll := @@ -75,13 +75,13 @@ Section spec. (* Specifications for function [FIELD_GET]. *) Definition type_of_FIELD_GET := - fn(∀ (r, a, k) : bin * nat * nat; ((mk_mask (MASK a k) 64) @ (binary (u64))), (r @ (binary (u64))); True) + fn(∀ (r, a, k) : bin * nat * nat; ((bin_mask 64 a k) @ (binary (u64))), (r @ (binary (u64))); True) → ∃ () : (), ((bin_slice a k r ++ replicate (64 - k) false) @ (binary (u64))); True. (* Specifications for function [FIELD_PREP]. *) Definition type_of_FIELD_PREP := - fn(∀ (a, k, v) : nat * nat * bin; ((mk_mask (MASK a k) 64) @ (binary (u64))), (v @ (binary (u64))); True) - → ∃ () : (), ((mk_data (DATA a (take k v)) 64) @ (binary (u64))); True. + fn(∀ (a, k, v) : nat * nat * bin; ((bin_mask 64 a k) @ (binary (u64))), (v @ (binary (u64))); True) + → ∃ () : (), ((bin_data 64 a (take k v)) @ (binary (u64))); True. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := diff --git a/theories/typing/binary.v b/theories/typing/binary.v index 54d40d1e..864d677a 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -76,19 +76,19 @@ Section bin. | S k => Z.testbit n i :: Z_slice (S i) k n end. - Definition Z_to_bin (len : nat) (int : Z) : bin := - Z_slice 0 len int. + Definition Z_to_bin (it : int_type) (n : Z) : option bin := + if bool_decide (n ∈ it) then Some (Z_slice 0 (Z.to_nat (bits_per_int it)) n) else None. - Fixpoint rev_bin_to_Z (v : bin) : Z := + Fixpoint rev_bin_to_nat (v : bin) : nat := match v with | [] => 0 - | true :: v' => 2 ^ (length v - 1) + rev_bin_to_Z v' - | false :: v' => rev_bin_to_Z v' + | true :: v' => 2 ^ (length v - 1) + rev_bin_to_nat v' + | false :: v' => rev_bin_to_nat v' end. - Lemma rev_bin_to_Z_range v : - -1 < rev_bin_to_Z v < 2 ^ length v. - Proof. + Lemma rev_bin_to_nat_range v : + rev_bin_to_nat v < 2 ^ length v. + (* Proof. induction v as [|[|] v IHv]; cbn; split; try lia. all: move: IHv; move: (length v) => n. - suff : 0 < 2 ^ (S n - 1) by lia. @@ -98,15 +98,22 @@ Section bin. have -> : 2 ^ S n = 2 ^ (n + 1) by lia. rewrite Zpower_exp; lia. - suff : 2 ^ n < 2 ^ S n by lia. - apply Z.pow_lt_mono_r; lia. - Qed. - - Definition bin_to_Z (v : bin) : Z := rev_bin_to_Z (reverse v). - - Lemma bin_to_Z_to_bin v : - Z_to_bin (length v) (bin_to_Z v) = v. + apply Z.pow_lt_mono_r; lia. *) Admitted. + Definition bin_to_nat (v : bin) : nat := rev_bin_to_nat (reverse v). + + Definition bin_to_Z (it : int_type) (bv : bin) : option Z := + if decide (bits_per_int it = length bv) then + let z := Z.of_nat (bin_to_nat bv) in + Some (if it_signed it then z - 2 ^ length bv else z) + else None. + + (* Lemma bin_to_Z_to_bin n it : *) + (* let N := Z.to_nat (bits_per_int it) in *) + (* n ∈ it → bin_to_Z (it_signed it) (Z_to_bin N n) = n. *) + (* Admitted. *) + (* range operations *) Definition bin_slice (start len : nat) (v : bin) : bin := drop start (take (start + len) v). @@ -119,6 +126,21 @@ Section bin. Definition bin_update (start len : nat) (new : bin) (v : bin) : bin := take start v ++ new ++ drop (start + length new) v. + (* data and mask *) + Definition bin_data (N : nat) (start : nat) (data : bin) : bin := + replicate start false ++ data ++ replicate (N - start - length data) false. + + Definition bin_mask (N : nat) (start len : nat) : bin := + bin_data N start (replicate len true). + + Definition bin_data_union (N : nat) (shapes : list (nat * bin)) : bin. + Admitted. + + Definition bin_mask_union (N : nat) (shapes : list (nat * nat)) : bin := + bin_data_union N ((λ s, (s.1, replicate s.2 false)) <$> shapes). + + (* The following are deprecated *) + (* A mask is a special `bin` with the following form: least significant <-- 0..01..10..0 --> most significant | | | @@ -224,9 +246,6 @@ Section bin. | _ => None end. - Definition b2v (bv : bin) : val := - default [MPoison] (val_of_bin bv). - Definition bin_of_val (v : val) : bin. Admitted. diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index f79f02a6..ecc4dad1 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -39,128 +39,6 @@ Definition bt_layout (bt : bitvec_type) : layout := {| Definition bvec (bt : bitvec_type) : Type := vec bool (bt_length bt). -(* Section vec. - - Fixpoint vec_take {A n} k (Hk : (k ≤ n)%nat) (v : vec A n) : vec A k. - Proof. - destruct k as [|k']. - - refine [#]. - - destruct n as [|n']. - + have ? : ¬ (S k' ≤ 0)%nat by lia. - contradiction. - + inversion v as [|x ? v']. simplify_eq. - have Hk' : (k' ≤ n')%nat by lia. - refine (x ::: vec_take _ _ _ Hk' v'). - Defined. - - Fixpoint vec_drop {A n} k (Hk : (k ≤ n)%nat) (v : vec A n) : vec A (n - k). - Proof. - destruct k as [|k']. - - have -> : (n - 0 = n)%nat by lia. - refine v. - - destruct n as [|n']. - + have ? : ¬ (S k' ≤ 0)%nat by lia. - contradiction. - + inversion v as [|_ ? v']. simplify_eq. - have Hk' : (k' ≤ n')%nat by lia. - refine (vec_drop _ _ _ Hk' v'). - Defined. - - Fixpoint vec_split {A k m} (v : vec A (k * m)) : vec (vec A k) m. - Proof. - destruct m as [|m']. - - refine [#]. - - have Hk : (k ≤ k * S m')%nat by lia. - have v1 := vec_take _ Hk v. - have v2 := vec_drop _ Hk v. - have Hn' : (k * S m' - k = k * m')%nat by lia. - rewrite Hn' in v2. - refine (v1 ::: vec_split _ _ _ v2). - Defined. - - Record vec_range (n : nat) (len : nat) := - VecRange { - range_start : nat; - range_in_bound : (range_start + len ≤ n)%nat; - }. - - Definition vec_slice {A n k} (v : vec A n) (r : vec_range n k) : vec A k. - Proof. - destruct r as [i Hin]. - have v1 := vec_take _ Hin v. - have Hi : (i ≤ i + k)%nat by lia. - have v2 := vec_drop _ Hi v1. - have -> : (k = i + k - i)%nat by lia. - refine v2. - Defined. - - Definition vec_update {A n k} (v : vec A n) (u : vec A k) (r : vec_range n k) : vec A n. - Proof. - destruct r as [i Hin]. - have Hi : (i ≤ n)%nat by lia. - have v1 := vec_take _ Hi v. - have v2 := vec_drop _ Hin v. - have v' := v1 +++ u +++ v2. - have -> : (n = i + (k + (n - (i + k))))%nat by lia. - refine v'. - Defined. - - Definition vec_rev {A n} (v : vec A n) : vec A n. - Proof. - have v' := list_to_vec (rev (vec_to_list v)). - rewrite rev_length vec_to_list_length in v'. - refine v'. - Defined. - -End vec. - -Section bool_vec. - - (* Assume `v` is Big-Endian .*) - Fixpoint Z_of_bool_vec_BE {n} (v : vec bool n) : Z := - match v with - | [#] => 0 - | true ::: v' => 2 ^ (n - 1) + Z_of_bool_vec_BE v' - | false ::: v' => Z_of_bool_vec_BE v' - end. - - Lemma Z_of_bool_vec_BE_in_range n (v : vec bool n) : - -1 < Z_of_bool_vec_BE v < 2 ^ n. - Proof. - induction v as [|[|] n v [? ?]]; cbn; split; try lia. - - suff : 0 < 2 ^ (S n - 1) by lia. - apply Z.pow_pos_nonneg; lia. - - suff : 2 ^ (S n - 1) + 2 ^ n ≤ 2 ^ S n by lia. - have -> : S n - 1 = n by lia. - have -> : 2 ^ S n = 2 ^ (n + 1) by lia. - rewrite Zpower_exp; lia. - - suff : 2 ^ n < 2 ^ S n by lia. - apply Z.pow_lt_mono_r; lia. - Qed. - - (* By default: `v` is Small-Endian. *) - Definition byte_of_bool_vec (v : vec bool 8) : byte := {| - byte_val := Z_of_bool_vec_BE (vec_rev v); - byte_constr := Z_of_bool_vec_BE_in_range _ _; - |}. - - Definition val_of_bool_vec {sz} (v : vec bool (8 * sz)) : val := - map (MByte ∘ byte_of_bool_vec) (vec_split v). - - Lemma val_of_bool_vec_length {sz} (v : vec bool (8 * sz)) : - length (val_of_bool_vec v) = sz. - Proof. - by rewrite map_length vec_to_list_length. - Qed. - - Fixpoint Z_slice_v (i len : nat) (n : Z) : vec bool len := - match len with - | O => [#] - | S k => Z.testbit n i ::: Z_slice_v (S i) k n - end. - -End bool_vec. *) - Section bitvec_op. Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bin := @@ -179,7 +57,8 @@ End bitvec_op. Declare Scope bitvec_scope. -Notation "n %% bt" := (Z_to_bin (bt_length bt) n) (at level 5, format "n %% bt") : bitvec_scope. +(* TODO *) +Notation "n %% bt" := (Z_slice 0 (bt_length bt) n) (at level 5, format "n %% bt") : bitvec_scope. Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]") : bitvec_scope. @@ -193,478 +72,17 @@ Notation "bv .[ i1 := x1 ; i2 := x2 ; i3 := x3 ]" := (bvec_put (bvec_put (bvec_put bv i1 x1) i2 x2) i3 x3) (at level 5, format "bv .[ i1 := x1 ; i2 := x2 ; i3 := x3 ]") : bitvec_scope. -(* Lemma bvec_get_put {bt : bitvec_type} (bv : bvec bt) i x : - bv[i := x][i] = x. -Proof. - by rewrite /bvec_get /bvec_put decide_left encode_decode. -Qed. - -Lemma bvec_get_put_ne {bt : bitvec_type} (bv : bvec bt) i j x : - i ≠ j → bv[i := x][j] = bv[j]. -Proof. - rewrite /bvec_get /bvec_put. case_match => //. -Qed. *) - -(* -Section bin. - - (* The first element is the least significant bit. *) - Definition bin : Type := list bool. - - Declare Scope bin_scope. - - Definition bin_and (lhs rhs : bin) : bin := zip_with (&&) lhs rhs. - - Definition bin_or (lhs rhs : bin) : bin := zip_with (||) lhs rhs. - - Definition bin_xor (lhs rhs : bin) : bin := zip_with xorb lhs rhs. - - Definition bin_neg (v : bin) : bin := negb <$> v. - - Definition bin_shl (v : bin) (k : nat) : bin := - if bool_decide (k ≤ length v) - then replicate k false ++ take (length v - k) v - else replicate (length v) false. - Infix "<<" := bin_shl (at level 60) : bin_scope. - - Definition bin_shr (v : bin) (k : nat) : bin := - if bool_decide (k ≤ length v) - then drop k v ++ replicate k false - else replicate (length v) false. - Infix ">>" := bin_shr (at level 60) : bin_scope. - - Open Scope bin_scope. - - (* Operands are assumed to have the same length, and the output should be length-preserved. *) - - Lemma bin_and_length v1 v2 n : - length v1 = n → length v2 = n → length (bin_and v1 v2) = n. - Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. - - Lemma bin_or_length v1 v2 n : - length v1 = n → length v2 = n → length (bin_or v1 v2) = n. - Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. - - Lemma bin_xor_length v1 v2 n : - length v1 = n → length v2 = n → length (bin_xor v1 v2) = n. - Proof. move => ? ?. rewrite zip_with_length_l_eq; congruence. Qed. - - Lemma bin_neg_length v : - length (bin_neg v) = length v. - Proof. by rewrite fmap_length. Qed. - - Lemma bin_shl_length v n : - length (v << n) = length v. - Proof. - rewrite /bin_shl. case_bool_decide. - - rewrite app_length replicate_length take_length min_l; lia. - - by rewrite replicate_length. - Qed. - - Lemma bin_shr_length v n : - length (v >> n) = length v. - Proof. - rewrite /bin_shr. case_bool_decide. - - rewrite app_length replicate_length drop_length. lia. - - by rewrite replicate_length. - Qed. - - (* Z <-> bin *) - Fixpoint Z_slice (i len : nat) (n : Z) : list bool := - match len with - | O => [] - | S k => Z.testbit n i :: Z_slice (S i) k n - end. - - Definition Z_to_bin (len : nat) (int : Z) : bin := - Z_slice 0 len int. - - Fixpoint rev_bin_to_Z (v : bin) : Z := - match v with - | [] => 0 - | true :: v' => 2 ^ (length v - 1) + rev_bin_to_Z v' - | false :: v' => rev_bin_to_Z v' - end. - - Lemma rev_bin_to_Z_range v : - -1 < rev_bin_to_Z v < 2 ^ length v. - Proof. - induction v as [|[|] v IHv]; cbn; split; try lia. - all: move: IHv; move: (length v) => n. - - suff : 0 < 2 ^ (S n - 1) by lia. - apply Z.pow_pos_nonneg; lia. - - suff : 2 ^ (S n - 1) + 2 ^ n ≤ 2 ^ S n by lia. - have -> : S n - 1 = n by lia. - have -> : 2 ^ S n = 2 ^ (n + 1) by lia. - rewrite Zpower_exp; lia. - - suff : 2 ^ n < 2 ^ S n by lia. - apply Z.pow_lt_mono_r; lia. - Qed. - - Definition bin_to_Z (v : bin) : Z := rev_bin_to_Z (reverse v). - - Lemma bin_to_Z_to_bin v : - Z_to_bin (length v) (bin_to_Z v) = v. - Admitted. - - Fixpoint Z_range (start : Z) (len : nat) : list Z := - match len with - | 0%nat => [] - | S k => start :: Z_range (start + 1) k - end. - - Lemma Z_range_length k : - ∀ a, length (Z_range a k) = k. - Proof. - induction k => // a. - cbn. by apply f_equal. - Qed. - - Lemma Z_range_lookup_Some a k i : - (i < k)%nat → (Z_range a k) !! i = Some (a + i). - Admitted. - - Lemma Z_range_elem a k x : - x ∈ Z_range a k ↔ a ≤ x < a + k. - Admitted. - - Lemma Z_range_take a n k : - (n ≤ k)%nat → take n (Z_range a k) = Z_range a n. - Admitted. - - Lemma Z_range_drop a n k : - (n ≤ k)%nat → drop n (Z_range a k) = Z_range (a + n) (k - n). - Admitted. - - Lemma Z_range_app a k l : - Z_range a k ++ Z_range (a + k) l = Z_range a (k + l). - Admitted. *) - - (* Fixpoint indices (len : nat) : list nat := - match len with - | 0%nat => [] - | S k => indices k ++ [k] - end. - - Lemma indices_length n : - length (indices n) = n. - Proof. - induction n. - - done. - - cbn. rewrite app_length. cbn. lia. - Qed. - - Lemma indices_lookup n i: - (i < n)%nat → indices n !! i = Some i. - Proof. - (* split; move => ?. *) - move => ?. - (* - have <- : length (indices n) = n by apply indices_length. *) - (* by apply: lookup_lt_Some. *) - induction n as [|n IHn]; first lia. - cbn. destruct (decide (i = n)) as [->|]. - + rewrite lookup_app_r indices_length; last lia. - by have -> : (n - n = 0)%nat by lia. - + have ? : (i < n)%nat by lia. - rewrite lookup_app_l ?indices_length => //. - by apply IHn. - Qed. *) - - (* Z -> bin *) - (* Definition Z_to_bin' (len : nat) (int : Z) : bin := - Z.testbit int <$> Z_range 0 len. - - Lemma Z_to_bin_length n x : - length (Z_to_bin' n x) = n. - Proof. - by rewrite fmap_length Z_range_length. - Qed. - - (* Z_to_bin is a homomorphism from Z to bin, i.e. preserves all operations *) - Lemma Z_land_to_bin_and n x y : - Z_to_bin' n (Z.land x y) = bin_and (Z_to_bin' n x) (Z_to_bin' n y). - Proof. - rewrite /Z_to_bin /bin_and. - rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. - apply Forall_fmap_ext, Forall_forall => ? _. - by rewrite Z.land_spec. - Qed. - - Lemma Z_lor_to_bin_or n x y : - Z_to_bin' n (Z.lor x y) = bin_or (Z_to_bin n x) (Z_to_bin n y). - Proof. - rewrite /Z_to_bin /bin_or. - rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. - apply Forall_fmap_ext, Forall_forall => ? _. - by rewrite Z.lor_spec. - Qed. - - Lemma Z_lxor_to_bin_xor n x y : - Z_to_bin n (Z.lxor x y) = bin_xor (Z_to_bin n x) (Z_to_bin n y). - Proof. - rewrite /Z_to_bin /bin_xor. - rewrite zip_with_fmap_l zip_with_fmap_r zip_with_diag. - apply Forall_fmap_ext, Forall_forall => ? _. - by rewrite Z.lxor_spec. - Qed. - - Lemma Z_lnot_to_bin_and n x : - Z_to_bin n (Z.lnot x) = bin_neg (Z_to_bin n x). - Proof. - rewrite /Z_to_bin /bin_neg -list_fmap_compose. - apply Forall_fmap_ext, Forall_forall => ? /Z_range_elem ?. - cbn. rewrite Z.lnot_spec; [done | lia]. - Qed. - - Lemma app_eq A (xs1 xs2 ys1 ys2 : list A): - xs1 = xs2 → ys1 = ys2 → xs1 ++ ys1 = xs2 ++ ys2. - Proof. congruence. Qed. - - Lemma Z_shiftl_to_bin_shl n x k : - Z_to_bin n (x ≪ Z.of_nat k) = (Z_to_bin n x) << k. - Proof. - rewrite /Z_to_bin /bin_shl fmap_length Z_range_length. - case_bool_decide. - - have {1}-> : (n = k + (n - k))%nat by lia. - rewrite -Z_range_app fmap_app. - apply app_eq. - + eapply list_eq_same_length. - by rewrite replicate_length. - by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. - rewrite Z.shiftl_spec_low; [congruence|lia]. - + rewrite -fmap_take Z_range_take; last lia. - eapply list_eq_same_length. - 1, 2: by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite !list_lookup_fmap !Z_range_lookup_Some; [cbn|lia..]. - have ? : (0 + k + i - k) = 0 + i by lia. - rewrite Z.shiftl_spec; [congruence | lia]. - - eapply list_eq_same_length. - by rewrite replicate_length. - by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. - rewrite Z.shiftl_spec_low; [congruence|lia]. - Qed. - - Lemma Z_shiftr_to_bin_shr n x k : - Z_to_bin n (x ≫ Z.of_nat k) = (Z_to_bin n x) >> k. - Proof. - rewrite /Z_to_bin /bin_shr fmap_length Z_range_length. - case_bool_decide. - - rewrite -fmap_drop Z_range_drop; last lia. - have {1}-> : (n = (n - k) + k)%nat by lia. - rewrite -Z_range_app fmap_app. - apply app_eq. - + eapply list_eq_same_length. - 1, 2: by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite !list_lookup_fmap !Z_range_lookup_Some; [cbn|lia..]. - have ? : 0 + i + k = 0 + k + i by lia. - rewrite Z.shiftr_spec; [congruence | lia]. - + eapply list_eq_same_length. - by rewrite replicate_length. - by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. - rewrite Z.shiftr_spec; admit. - - eapply list_eq_same_length. - by rewrite replicate_length. - by rewrite fmap_length Z_range_length. - move => i b1 b2 ?. - rewrite list_lookup_fmap Z_range_lookup_Some ?lookup_replicate_2; [cbn|lia..]. - rewrite Z.shiftl_spec; admit. - Admitted. - *) - - (* - Definition mask (v : bin) : Prop := - ∃ a k, v = replicate a false ++ replicate k true ++ replicate (length v - a - k) false. - - Lemma bin_and_zero v n : - (n = length v)%nat → - bin_and v (replicate n false) = replicate n false. - Proof. - move => ->. - rewrite /bin_and zip_with_replicate_r ?/flip => //. - apply const_fmap, andb_false_r. - Qed. - - Lemma bin_and_neg_zero v n : - (length v ≤ n)%nat → - bin_and v (replicate n true) = v. - Proof. - move => ?. - rewrite /bin_and zip_with_replicate_r ?/flip => //. - Admitted. - -*) - (* mask a k = 000..0111..1 - | | - a a+k-1 *) - (* Inductive mask : Type := mk_mask : nat → nat → mask. - - Definition mask_to_bin (m : mask) : bin := - match m with - | mk_mask a k => replicate a false ++ replicate k true - end. - - Coercion mask_to_bin : mask >-> bin. - - Definition mask_zero : mask := mk_mask 0 0. - - Definition mask_one : mask := mk_mask 0 1. - - (* ~0 = 111..1 *) - Definition mask_neg_zero (len : nat) : mask := mk_mask 0 len. - - Definition mask_shl (lhs : mask) (rhs : nat) : mask := - match lhs with - | mk_mask a k => mk_mask (a + rhs) k - end. - - (* BIT(i) := 1 << i ==> mask_shl mask_one i = mk_mask i 1 *) - Example BIT_spec i : - mask_shl mask_one i = mk_mask i 1. - Proof. done. Qed. - - Definition mask_shr (lhs : mask) (rhs : nat) : mask := - match lhs with - | mk_mask a k => - if bool_decide (rhs ≤ a)%nat then mk_mask (a - rhs) k - else mk_mask 0 (k - (rhs - a)) - end. - - (* GENMASK(h,0) := ~0 >> (N-1-h) *) - Example GENMASK_h_spec N h : - (h < N)%nat → - mask_shr (mask_neg_zero N) (N - 1 - h) = mk_mask 0 (h + 1). - Proof. - move => ?. - cbn. case_bool_decide. - - have -> : (N - 1 - h = 0)%nat by lia. - by have -> : (N = h + 1)%nat by lia. - - by have -> : (N - (N - 1 - h - 0) = h + 1)%nat by lia. - Qed. - - Definition mask_clear (lhs : mask) (rhs : nat) : mask := - match lhs with - | mk_mask a k => - if bool_decide (rhs ≤ k)%nat then mk_mask (a + rhs) (k - rhs) - else mask_zero - end. - - (* GENMASK(N-1,l) := ~0 - (1 << l) + 1 *) - Example GENMASK_l_spec N l : - (l ≤ N)%nat → - mask_clear (mask_neg_zero N) l = mk_mask l (N - l). - Proof. - move => ?. - cbn. case_bool_decide => //. - Qed. - - Definition mask_and (lhs rhs : mask) : mask := - match lhs, rhs with - | mk_mask a k, mk_mask b l => mk_mask (a `max` b) (min (a + k) (b + l) - a `max` b) - end. - - (* GENMASK(h,l) := GENMASK(N-1,l) & GENMASK(h,0) *) - Example GENMASK_spec N l h : - (h < N)%nat → - mask_and (mk_mask l (N - l)) (mk_mask 0 (h + 1)) = mk_mask l (h + 1 - l). - Proof. - move => ?. cbn. - rewrite max_l ?min_r => //; lia. - Qed. - - Definition bin_slice (offset len : nat) (v : bin) : bin := - drop offset (take (offset + len) v). - - Lemma bin_and_mask a k v : - bin_and v (mk_mask a k) = replicate a false ++ bin_slice a k v. - Proof. - (* cbn. rewrite /bin_and /bin_slice. *) - (* Search zip_with app. *) - Admitted. - - - (* FIELD_GET(m,v) := (v & m) >> __bf_shf(m) *) - Example FIELD_GET_spec a k v : - bin_shr (bin_and v (mk_mask a k)) a = bin_slice a k v. - Proof. - cbn. - rewrite /bin_shr /bin_slice /bin_and. - rewrite zip_with_app_r replicate_length. - Search (drop _ (take (_ + _) _)). - - zip_with_app_r. replicate_length. - length_replicate. - - Check drop_take_drop. - Search (drop _ = drop _ _). - - Example FIELD_GET_0_spec k v : - bin_and v (mk_mask 0 k) = bin_slice 0 k v. - Proof. - apply (FIELD_GET_spec 0 k v). - Qed. *) - - -(* Deprecated *) -(* Section bitvec. - Context `{!typeG Σ}. - - Program Definition bitvec_inner_type (bt : bitvec_type) (bv : bin) : type := {| - ty_own β l := (∃ v, ⌜val_of_bin bv = Some v⌝ ∗ ⌜l `has_layout_loc` bt_layout bt⌝ ∗ l ↦[β] v)%I - |}. - Next Obligation. - iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. - Qed. - - Program Definition bitvec (bt : bitvec_type) : rtype := {| - rty_type := bin; - rty := bitvec_inner_type bt; - |}. - - Global Program Instance rmovable_bitvec bt : RMovable (bitvec bt) := {| - rmovable bv := {| - ty_layout := bt_layout bt; - ty_own_val v := ⌜val_of_bin bv = Some v⌝%I; - |} - |}. - Next Obligation. iIntros (bt bv l). by iDestruct 1 as (???)"?". Qed. - Next Obligation. - (* iIntros (bt bv v <-). iPureIntro. *) - (* by rewrite /has_layout_val val_of_bool_vec_length. *) - Admitted. - Next Obligation. - iIntros (bt bv l). iDestruct 1 as (v Hl Hv) "Hl". - iExists _. by iFrame. - Qed. - Next Obligation. iIntros (it bv l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. - Next Obligation. iIntros (bt x1 x2). done. Qed. - - Global Program Instance bitvec_copyable bt bv : Copyable (bv @ bitvec bt). - Next Obligation. - iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". - iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. - iExists _, _. iFrame. iModIntro. iSplit => //. - by iIntros "_". - Qed. - -End bitvec. -Notation "bitvec< bt >" := (bitvec bt) (only printing, format "'bitvec<' bt '>'") : printing_sugar. *) - Section binary. - Context `{!typeG Σ}. Program Definition binary_inner_type (it : int_type) (bv : bin) : type := {| - ty_own β l := (l ◁ₗ{β} (bin_to_Z bv) @ int it)%I; - ty_share := ty_share (int_inner_type _ _) + ty_own β l := + (∃ z, ⌜bin_to_Z it bv = Some z⌝ ∗ l ◁ₗ{β} z @ int it)%I |}. + Next Obligation. + iIntros (?????). iDestruct 1 as (?)"[% ?]". iExists _. iSplitR => //. + by iApply ty_share. + Qed. Definition binary (it : int_type) : rtype := {| rty_type := bin; @@ -672,126 +90,50 @@ Section binary. |}. Global Program Instance rmovable_binary it : RMovable (binary it) := {| - rmovable bv := rmovable (int it) (bin_to_Z bv); - |}. - Next Obligation. done. Qed. - - Global Program Instance binary_copyable it bv : Copyable (bv @ binary it) := - int_copyable (bin_to_Z bv) it. - -End binary. -Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'") : printing_sugar. - -(* TODO: better names like: bits, bits_mask, bits_data?*) - -(* -Section bdata. - - Context `{!typeG Σ}. - - Program Definition bdata_inner_type (it : int_type) (shapes : list (nat * bin)) : type := {| - ty_own β l := - let N := Z.to_nat (bits_per_int it) in - (∃ v, ⌜val_of_bin (mk_data shapes N) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I - |}. - Next Obligation. - iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. - Qed. - - Program Definition bdata (it : int_type) : rtype := {| - rty_type := list (nat * bin); - rty := bdata_inner_type it - |}. - - Global Program Instance bdata_rmovable it : RMovable (bdata it) := {| - rmovable shapes := {| + rmovable bv := {| ty_layout := it_layout it; - ty_own_val v := - let N := Z.to_nat (bits_per_int it) in ⌜val_of_bin (mk_data shapes N) = Some v⌝%I; - |} |}. - Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. - Next Obligation. Admitted. - (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) + ty_own_val v := (∃ z, ⌜bin_to_Z it bv = Some z⌝ ∗ v ◁ᵥ z @ int it)%I + |} + |}. Next Obligation. - iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". - iExists _. by iFrame. + iIntros (???). iDestruct 1 as (??) "Hl". iApply (ty_aligned with "Hl"). Qed. - Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. - Next Obligation. iIntros (it x1 x2). done. Qed. - - Global Program Instance bdata_copyable it p : Copyable (p @ bdata it). Next Obligation. - iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". - iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. - iExists _, _. iFrame. iModIntro. iSplit => //. - by iIntros "_". + iIntros (???). iDestruct 1 as (??) "Hl". iApply (ty_size_eq with "Hl"). Qed. - -End bdata. -Notation "bdata< it >" := (bdata it) (only printing, format "'bdata<' it '>'") : printing_sugar. - -Section bmask. - - Context `{!typeG Σ}. - - Program Definition bmask_inner_type (it : int_type) (shapes : list (nat * nat)) : type := {| - ty_own β l := - let N := Z.to_nat (bits_per_int it) in - (∃ v, ⌜val_of_bin (mk_mask shapes N) = Some v⌝ ∗ ⌜l `has_layout_loc` it⌝ ∗ l ↦[β] v)%I - |}. Next Obligation. - iIntros (bt bv l). iDestruct 1 as (v Hv Hl) "H". iExists _. do 2 iSplitR => //. by iApply heap_mapsto_own_state_share. + iIntros (???). iDestruct 1 as (??) "Hl". + iDestruct (ty_deref with "Hl") as (v) "[? ?]". + by do 2 (iExists _; iFrame). Qed. - - Program Definition bmask (it : int_type) : rtype := {| - rty_type := list (nat * nat); - rty := bmask_inner_type it - |}. - - Global Program Instance bmask_rmovable it : RMovable (bmask it) := {| - rmovable shapes := {| - ty_layout := it_layout it; - ty_own_val v := - let N := Z.to_nat (bits_per_int it) in ⌜val_of_bin (mk_mask shapes N) = Some v⌝%I; - |} |}. - Next Obligation. iIntros (it n l). by iDestruct 1 as (???)"?". Qed. - Next Obligation. Admitted. - (* Next Obligation. by iIntros (it n v ?%val_of_int_length). Qed. *) Next Obligation. - iIntros (it n l). iDestruct 1 as (v Hl Hv) "Hl". - iExists _. by iFrame. + iIntros (?????) "Hl". iDestruct 1 as (??) "?". + iExists _. iSplitR => //. + iAssert ⌜l `has_layout_loc` ty_layout (z @ int it)⌝%I as "Hly". { done. } + by iApply (ty_ref with "Hly Hl"). Qed. - Next Obligation. iIntros (it n l v Hly) "Hl". iIntros (?). iExists _. by iFrame. Qed. - Next Obligation. iIntros (it x1 x2). done. Qed. + Next Obligation. done. Qed. - Global Program Instance bmask_copyable it p : Copyable (p @ bmask it). + Global Program Instance binary_copyable it bv : Copyable (bv @ binary it). Next Obligation. - iIntros (bt rt E l ?). iDestruct 1 as (v Hv Hl) "Hl". - iMod (heap_mapsto_own_state_to_mt with "Hl") as (q) "[_ Hl]" => //. iSplitR => //. - iExists _, _. iFrame. iModIntro. iSplit => //. - by iIntros "_". - Qed. + Admitted. -End bmask. -Notation "bmask< it >" := (bmask it) (only printing, format "'bmask<' it '>'") : printing_sugar. -*) +End binary. +Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'") : printing_sugar. Section programs. Context `{!typeG Σ}. - Definition MASK (a k : nat) : list (nat * nat) := - [(a, k)]. - - Definition DATA (a : nat) (v : bin) : list (nat * bin) := - [(a, v)]. + Lemma Z_to_bin_to_Z it n bv : + Z_to_bin it n = Some bv → bin_to_Z it bv = Some n. + Admitted. Lemma subsume_val_int_binary T it v n bv : - let N := Z.to_nat (bits_per_int it) in - (⌜bv = Z_to_bin N n⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. + (⌜Z_to_bin it n = Some bv⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. Proof. - iIntros "[Heq $] Hn". rewrite /ty_own_val /=. - iDestruct "Heq" as %->. iDestruct "Hn" as %<-. iPureIntro. - Admitted. + iIntros "[% $] ?". iExists _. iFrame. iPureIntro. + by apply Z_to_bin_to_Z. + Qed. Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it) (bv @ binary it) := λ T, i2p (subsume_val_int_binary T it v n bv). @@ -818,16 +160,19 @@ Section programs. Global Instance subsume_data_binary_inst it p shape bv : SubsumePlace p Own (shape @ bdata it)%I (bv @ binary it)%I := λ T, i2p (subsume_data_binary T it p shape bv). *) - Lemma type_cast_data_bool it1 it2 v a d T: - let N := Z.to_nat (bits_per_int it1) in - let b := bin_to_bool d in - T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ - typed_un_op v (v ◁ᵥ mk_data (DATA a d) N @ binary it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + Lemma type_cast_data_bool it v a x T: + let N := Z.to_nat (bits_per_int it) in + let b := bin_to_bool x in + T (i2v (Z_of_bool b) bool_it) (t2mt (b @ boolean bool_it)) -∗ + typed_un_op v (v ◁ᵥ bin_data N a x @ binary it)%I (CastOp (IntOp bool_it)) (IntOp it) T. Proof. + iIntros "HT". iIntros ([n [Hn Hv]] Φ) "HΦ". + move: Hv => /val_to_of_int Hv. + iApply wp_cast_int => //. Admitted. - Global Instance type_cast_data_bool_inst it1 it2 v a d : - TypedUnOpVal v (mk_data (DATA a d) (Z.to_nat (bits_per_int it1)) @ binary it1) (CastOp (IntOp it2)) (IntOp it1) := - λ T, i2p (type_cast_data_bool it1 it2 v a d T). + Global Instance type_cast_data_bool_inst it v a x : + TypedUnOpVal v (bin_data (Z.to_nat (bits_per_int it)) a x @ binary it) (CastOp (IntOp bool_it)) (IntOp it) := + λ T, i2p (type_cast_data_bool it v a x T). (* Lemma type_cast_data_to_bool it1 it2 v a x T: let b := bin_to_bool x in @@ -839,30 +184,42 @@ Section programs. TypedUnOpVal v ([(a, x)] @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := λ T, i2p (type_cast_data_to_bool it1 it2 v a x T). *) + Lemma bin_to_Z_inj it n bv1 bv2 : + bin_to_Z it bv1 = Some n → + bin_to_Z it bv2 = Some n → + bv1 = bv2. + Admitted. + Lemma type_binary_eq it v1 bv1 v2 bv2 T : - let N := Z.to_nat (bits_per_int it) in let b := bool_decide (bv1 = bv2) in T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) EqOp (IntOp it) (IntOp it) T. Proof. - iIntros (Heq) "HT". iIntros (Hv1 Hv2 Φ) "HΦ". - (* move: Hv1 Hv2 => /(val_of_bin_to_int it) Hv1 /(val_of_bin_to_int it) Hv2. *) - iApply (wp_binop_det (i2v (Z_of_bool (bool_decide (bv1 = bv2))) i32)). iSplit. - { iIntros (σ v) "_ !%". admit. } - iApply "HΦ"; last done. iPureIntro. by case_bool_decide. - Admitted. + iIntros "HT". iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". + move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. + have Heq : bool_decide (n1 = n2) = bool_decide (bv1 = bv2). + { apply bool_decide_iff. split; last congruence. + intros ?. simplify_eq. by apply: bin_to_Z_inj. } + iApply (wp_binop_det (i2v (Z_of_bool (bool_decide (bv1 = bv2))) i32)). + iSplit. + - iIntros (σ v) "_ !%". split. + + inversion 1; simplify_eq/=. by rewrite Heq. + + move => ->. econstructor => //. by rewrite Heq. + - iIntros "!>". iApply "HΦ" => //. + iPureIntro. by apply val_of_int_bool. + Qed. Global Program Instance type_binary_eq_inst it v1 bv1 v2 bv2: TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I EqOp (IntOp it) (IntOp it) := λ T, i2p (type_binary_eq it v1 bv1 v2 bv2 T). - Lemma type_binary_int_eq it v1 bv v2 n T : - let b := bool_decide (Z_to_bin (Z.to_nat (bits_per_int it)) n = bv) in + (* Lemma type_binary_int_eq it v1 bv v2 n T : + let b := bool_decide (Z_to_bin it n = bv) in T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv @ binary it) v2 (v2 ◁ᵥ n @ int it) EqOp (IntOp it) (IntOp it) T. Admitted. Global Program Instance type_binary_int_eq_inst it v1 bv v2 n: TypedBinOpVal v1 (bv @ (binary it))%I v2 (n @ (int it))%I EqOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_int_eq it v1 bv v2 n T). + λ T, i2p (type_binary_int_eq it v1 bv v2 n T). *) (* Lemma type_binary_mask_and it v1 bv1 v2 shape T: let N := Z.to_nat (bits_per_int it) in @@ -883,83 +240,135 @@ Section programs. TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ binary it)%I AndOp (IntOp it) (IntOp it) | 10 := λ T, i2p (type_and_binary it v1 bv1 v2 bv2 T). *) - Lemma type_binary_and_single_mask it v1 bv1 v2 a k T: - let N := Z.to_nat (bits_per_int it) in - let bv := mk_data (DATA a (bin_slice a k bv1)) N in - T (b2v bv) (t2mt (bv @ binary it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T. + Definition b2v (it : int_type) (bv : bin) : val := + default [☠%V] ((λ n, i2v n it) <$> bin_to_Z it bv). + + Lemma bin_and_spec it bv1 bv2 n1 n2: + bin_to_Z it bv1 = Some n1 → + bin_to_Z it bv2 = Some n2 → + bin_to_Z it (bin_and bv1 bv2) = Some (Z.land n1 n2). Admitted. - Global Program Instance type_binary_and_single_mask_inst it v1 bv1 v2 a k : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_mask (MASK a k) (Z.to_nat (bits_per_int it)) @ binary it)%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_and_single_mask it v1 bv1 v2 a k T). - - Lemma type_and_binary_mask it v1 bv1 v2 ms T: - let N := Z.to_nat (bits_per_int it) in - let bv := mk_data (bin_mask_and bv1 ms) N in - T (b2v bv) (t2mt (bv @ binary it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_mask ms N @ binary it) AndOp (IntOp it) (IntOp it) T. + + Lemma type_and_binary it v1 bv1 v2 bv2 bv T: + bin_and bv1 bv2 = bv → + T (b2v it bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. + Proof. + iIntros (Hbv) "HT". iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". + have [n Hn] : is_Some (bin_to_Z it bv). admit. + have Hin : n ∈ it. admit. + move: (Hin) => /val_of_int_is_some [v Hv]. + rewrite /b2v Hn/= /i2v Hv/=. + move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. + iApply (wp_binop_det v). iSplit. + - iIntros (σ v') "_ !%". split. + + inversion 1; simplify_eq. + erewrite bin_and_spec in Hn => //; simplify_eq. + destruct (it_signed it) eqn:Heqn; simplify_eq => //. + by rewrite ->it_in_range_mod in * => //; simplify_eq. + + move => ->. econstructor => //. + destruct (it_signed it) eqn:Heqn; simplify_eq. + all: erewrite bin_and_spec in Hn => //; simplify_eq. + all: by try rewrite it_in_range_mod. + - iIntros "!>". iApply "HΦ"; last done. by iExists _. Admitted. - Global Program Instance type_and_binary_mask_inst it v1 bv1 v2 ms : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_mask ms (Z.to_nat (bits_per_int it)) @ binary it)%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_and_binary_mask it v1 bv1 v2 ms T). - Lemma type_int_mask_and it v1 n1 v2 a k T: + Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : + TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a k @ binary it)%I AndOp (IntOp it) (IntOp it) := + let N := Z.to_nat (bits_per_int it) + in λ T, i2p (type_and_binary it v1 bv v2 (bin_mask N a k) (bin_data N a (bin_slice a k bv)) T _). + Next Obligation. + intros. + Admitted. + (* Even if a + k > N, `bin_mask` can still generate a bin with length `N` by simply trim the extra elements. *) + + (* Lemma type_int_mask_and it v1 n1 v2 a k T: let N := Z.to_nat (bits_per_int it) in typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T -∗ typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T. Admitted. Global Program Instance type_int_mask_and_inst it v1 n1 v2 a k : TypedBinOpVal v1 (n1 @ int it)%I v2 (mk_mask (MASK a k) (Z.to_nat (bits_per_int it)) @ (binary it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). + λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). *) - Lemma type_binary_data_or it v1 bv1 v2 shape T: - let N := Z.to_nat (bits_per_int it) in - let bv := bin_data_or bv1 shape in - (⌜bin_data_or_precond bv1 shape⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ mk_data shape N @ binary it) OrOp (IntOp it) (IntOp it) T. + Lemma bin_or_spec it bv1 bv2 n1 n2: + bin_to_Z it bv1 = Some n1 → + bin_to_Z it bv2 = Some n2 → + bin_to_Z it (bin_or bv1 bv2) = Some (Z.lor n1 n2). Admitted. - Global Program Instance type_binary_data_or_inst it v1 bv1 v2 shape : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (mk_data shape (Z.to_nat (bits_per_int it)) @ (binary it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_data_or it v1 bv1 v2 shape T). -(* - (* Lemma type_binary_mask_or it v1 bv1 v2 shape T: - let N := Z.to_nat (bits_per_int it) in - let bv := bin_data_or bv1 (mask_to_data shape) in - (⌜bin_data_or_precond bv1 (mask_to_data shape)⌝ ∗ T (b2v bv) (t2mt (bv @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) OrOp (IntOp it) (IntOp it) T. + + Lemma type_or_binary it v1 bv1 v2 bv2 bv (sidecond : Prop) T: + (sidecond → bin_or bv1 bv2 = bv) → + (⌜sidecond⌝ ∗ T (b2v it bv) (t2mt (bv @ binary it))) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) OrOp (IntOp it) (IntOp it) T. + Proof. + iIntros (Hsidecond) "[% HT]". move: H => /Hsidecond Hbv. + iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". + have [n Hn] : is_Some (bin_to_Z it bv). admit. + have Hin : n ∈ it. admit. + move: (Hin) => /val_of_int_is_some [v Hv]. + rewrite /b2v Hn/= /i2v Hv/=. + move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. + iApply (wp_binop_det v). iSplit. + - iIntros (σ v') "_ !%". split. + + inversion 1; simplify_eq. + erewrite bin_or_spec in Hn => //; simplify_eq. + destruct (it_signed it) eqn:Heqn; simplify_eq => //. + by rewrite ->it_in_range_mod in * => //; simplify_eq. + + move => ->. econstructor => //. + destruct (it_signed it) eqn:Heqn; simplify_eq. + all: erewrite bin_or_spec in Hn => //; simplify_eq. + all: by try rewrite it_in_range_mod. + - iIntros "!>". iApply "HΦ"; last done. by iExists _. Admitted. - Global Program Instance type_binary_mask_or_inst it v1 bv1 v2 shape : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_or it v1 bv1 v2 shape T). *) *) - Lemma type_mask_single_or it v1 m1 v2 m2 T: - let N := Z.to_nat (bits_per_int it) in - let shape := [m1; m2] in - (⌜single_masks_disjoint m1 m2⌝ ∗ T (b2v (mk_mask shape N)) (t2mt (mk_mask shape N @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ mk_mask [m1] N @ binary it) v2 (v2 ◁ᵥ mk_mask [m2] N @ binary it) OrOp (IntOp it) (IntOp it) T. + Global Program Instance type_binary_data_or_inst it v1 bv v2 a x : + TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_data (Z.to_nat (bits_per_int it)) a x @ (binary it))%I OrOp (IntOp it) (IntOp it) := + let N := Z.to_nat (bits_per_int it) + in λ T, i2p (type_or_binary it v1 bv v2 (bin_data N a x) (bin_update a (length x) x bv) (bin_slice a (length x) bv = replicate (length x) false) T _). + Next Obligation. + intros. Admitted. - Global Program Instance type_mask_or_inst it v1 m1 v2 m2: - TypedBinOpVal v1 (mk_mask [m1] (Z.to_nat (bits_per_int it)) @ binary it)%I v2 (mk_mask [m2] (Z.to_nat (bits_per_int it)) @ binary it)%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_mask_single_or it v1 m1 v2 m2 T). - (* Lemma type_mask_or it v1 shape1 v2 shape2 T: - let N := Z.to_nat (bits_per_int it) in - let shape := mask_or shape1 shape2 in - (⌜mask_or_precond shape1 shape2⌝ ∗ T (b2v (mk_mask shape N)) (t2mt (shape @ bmask it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ shape1 @ bmask it) v2 (v2 ◁ᵥ shape2 @ bmask it) OrOp (IntOp it) (IntOp it) T. + Global Program Instance type_mask_or_inst it v1 a1 k1 v2 a2 k2 : + TypedBinOpVal v1 (bin_mask (Z.to_nat (bits_per_int it)) a1 k1 @ binary it)%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a2 k2 @ binary it)%I OrOp (IntOp it) (IntOp it) := + let N := Z.to_nat (bits_per_int it) + in λ T, i2p (type_or_binary it v1 (bin_mask N a1 k1) v2 (bin_mask N a2 k2) (bin_mask_union N [(a1, k1); (a2, k2)]) (a1 + k1 ≤ a2) T _). + Next Obligation. + intros. Admitted. - Global Program Instance type_mask_or_inst it v1 shape1 v2 shape2: - TypedBinOpVal v1 (shape1 @ bmask it)%I v2 (shape2 @ (bmask it))%I OrOp (IntOp it) (IntOp it) := - λ T, i2p (type_mask_or it v1 shape1 v2 shape2 T). *) - Lemma type_mask_neg it v k T : - let N := Z.to_nat (bits_per_int it) in - let bv := mk_mask (MASK k (N - k)) N in - T (b2v bv) (t2mt (bv @ binary it)) -∗ - typed_un_op v (v ◁ᵥ mk_mask (MASK 0 k) N @ binary it) NotIntOp (IntOp it) T. + Lemma bin_neg_spec it bv n: + bin_to_Z it bv = Some n → + bin_to_Z it (bin_neg bv) = Some (if it_signed it then Z.lnot n else Z_lunot (bits_per_int it) n). + Admitted. + + Lemma type_neg_binary it v1 bv1 bv T: + bin_neg bv1 = bv → + T (b2v it bv) (t2mt (bv @ binary it)) -∗ + typed_un_op v1 (v1 ◁ᵥ bv1 @ binary it) NotIntOp (IntOp it) T. + Proof. + iIntros (Hbv) "HT". iIntros ([n1 [Hn1 Hv1]] Φ) "HΦ". + have [n Hn] : is_Some (bin_to_Z it bv). admit. + have Hin : n ∈ it. admit. + move: (Hin) => /val_of_int_is_some [v Hv]. + rewrite /b2v Hn/= /i2v Hv/=. + move: Hv1 => /val_to_of_int Hv1. + iApply (wp_unop_det v). iSplit. + - iIntros (σ v') "_ !%". split. + + inversion 1; simplify_eq. + by erewrite bin_neg_spec in Hn => //; simplify_eq. + + move => ->. econstructor => //. simplify_eq. + by erewrite bin_neg_spec in Hn => //; simplify_eq. + - iIntros "!>". iApply "HΦ"; last done. by iExists _. Admitted. + Global Program Instance type_mask_neg_inst it v k: - TypedUnOpVal v (mk_mask (MASK 0 k) (Z.to_nat (bits_per_int it)) @ binary it) NotIntOp (IntOp it) := - λ T, i2p (type_mask_neg it v k T). + TypedUnOpVal v (bin_mask (Z.to_nat (bits_per_int it)) 0 k @ binary it) NotIntOp (IntOp it) := + let N := Z.to_nat (bits_per_int it) + in λ T, i2p (type_neg_binary it v (bin_mask N 0 k) (bin_mask N k (N - k)) T _). + Next Obligation. + intros. + Admitted. End programs. -- GitLab From 756cae7a96b327df2366da17fb0441a0aab65e8c Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 15 Apr 2021 00:31:54 +0800 Subject: [PATCH 14/71] proving pure lemmas --- theories/typing/binary.v | 145 +++++++++++++++++++++++++++++++++++++-- theories/typing/bitvec.v | 44 ++++-------- 2 files changed, 154 insertions(+), 35 deletions(-) diff --git a/theories/typing/binary.v b/theories/typing/binary.v index 864d677a..236c7c5c 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -1,5 +1,5 @@ From refinedc.typing Require Export type. -From refinedc.typing Require Import programs. +From refinedc.typing Require Import programs int. Set Default Proof Using "Type". Section bin. @@ -69,6 +69,11 @@ Section bin. - by rewrite replicate_length. Qed. + Lemma bin_and_lookup v1 v2 a b: + ∀ i, v1 !! i = Some a → v2 !! i = Some b → + (bin_and v1 v2) !! i = Some (a && b). + Admitted. + (* Z <-> bin *) Fixpoint Z_slice (i len : nat) (n : Z) : list bool := match len with @@ -101,14 +106,144 @@ Section bin. apply Z.pow_lt_mono_r; lia. *) Admitted. - Definition bin_to_nat (v : bin) : nat := rev_bin_to_nat (reverse v). + (* Maybe this is no longer needed? *) + Lemma Z_bits_inj_bounded it n1 n2 : + n1 ∈ it → + n2 ∈ it → + (∀ i, (0 ≤ i < bits_per_int it) → Z.testbit n1 i = Z.testbit n2 i) → + n1 = n2. + Proof. + move => Hn1 Hn2 Hbits. + apply Z.bits_inj' => i ?. + destruct (decide (i < bits_per_int it)); first by apply Hbits. + unfold elem_of, int_elem_of_it, min_int, max_int in *. + have H : ∀ a x, a ≤ x - 1 ↔ a < x by lia. + have ? := bits_per_int_gt_0 it. + case_match. + - unfold int_half_modulus in *. + rewrite -> H in Hn1, Hn2. + rewrite -> (bounded_iff_bits) in Hn1; last lia. + rewrite -> (bounded_iff_bits) in Hn2; last lia. + rewrite Hn1; last by lia. + rewrite Hn2; last by lia. + rewrite -(Hn1 (bits_per_int it - 1)); last done. + rewrite -(Hn2 (bits_per_int it - 1)); last done. + apply Hbits. lia. + - unfold int_modulus in *. + destruct Hn1 as [? Hn1]. + destruct Hn2 as [? Hn2]. + rewrite -> H in Hn1, Hn2. + rewrite -> (pos_bounded_iff_bits) in Hn1; [|lia ..]. + rewrite -> (pos_bounded_iff_bits) in Hn2; [|lia ..]. + rewrite Hn1; last by lia. + rewrite Hn2; last by lia. + done. + Qed. + + Fixpoint b2z (bv : bin) : Z := + match bv with + | [] => 0 + | b :: bv => Z.b2z b + 2 * (b2z bv) + end. + + Lemma b2z_spec bv : ∀ n, + b2z bv = n ↔ 0 ≤ n < 2 ^ (length bv) + ∧ (∀ i, (i < length bv)%nat → bv !! i = Some (Z.testbit n i)). + Proof. + induction bv as [|b bv IHbv] => /=. + 1: repeat split; try intros; lia. + move => n. split. + - have [? ?] : 0 ≤ Z.b2z b ≤ 1 by destruct b. + have Z_succ_S : ∀ (m : nat), Z.succ m = S m by lia. + move => <-. repeat split. + + suff : 0 ≤ b2z bv by lia. by apply IHbv. + + rewrite -Z_succ_S Z.pow_succ_r; last lia. + suff : b2z bv < 2 ^ length bv by lia. by apply IHbv. + + move => i. destruct i as [|i] => /=. + 1: rewrite Z.add_b2z_double_bit0; naive_solver. + rewrite Z.add_comm -Z_succ_S Z.testbit_succ_r; last lia. + intros. apply IHbv; lia. + - move => [[? ?] Hbv]. rewrite -> Z.div2_odd. + have -> : b = Z.odd n. + { specialize (Hbv O ltac:(lia)). cbn in Hbv. + inversion Hbv => /=. apply Z.bit0_odd. } + suff : b2z bv = n `div` 2 by lia. + apply IHbv; clear IHbv. repeat split. + + by apply Z.div_pos. + + suff : 2 * n `div` 2 < 2 * 2 ^ length bv by lia. + rewrite -Z.pow_succ_r; last lia. + suff : 2 * n `div` 2 ≤ n by lia. + apply Z_mult_div_ge. lia. + + move => i Hi. + specialize (Hbv (S i) ltac:(lia)). cbn in Hbv. + rewrite Hbv Z.div2_bits; last lia. + by have -> : Z.succ i = S i by lia. + Qed. Definition bin_to_Z (it : int_type) (bv : bin) : option Z := - if decide (bits_per_int it = length bv) then - let z := Z.of_nat (bin_to_nat bv) in - Some (if it_signed it then z - 2 ^ length bv else z) + if bool_decide (length bv = Z.to_nat (bits_per_int it)) then Some ( + if it_signed it && bool_decide (last bv = Some true) + then - ((b2z (bin_neg bv)) + 1) + else b2z bv) else None. + Lemma bin_to_Z_Some_spec it bv n : + bin_to_Z it bv = Some n ↔ n ∈ it ∧ + length bv = Z.to_nat (bits_per_int it) ∧ + ∀ i, (i < Z.to_nat (bits_per_int it))%nat → bv !! i = Some (Z.testbit n i). + Proof. + rewrite /bin_to_Z. case_bool_decide. + - have -> : ∀ x y, Some x = Some y ↔ x = y by naive_solver. + case_match. + + admit. + + rewrite b2z_spec H. + split; [intros [? ?] | intros [? [? ?]]]; repeat split. + all: try naive_solver. + all: admit. + - split; first done. + intros [? [? ?]]. contradiction. + Admitted. + + Lemma bin_to_Z_spec it bv n : + bin_to_Z it bv = Some n → + ∀ i, (i < Z.to_nat (bits_per_int it))%nat → bv !! i = Some (Z.testbit n i). + Proof. + rewrite /bin_to_Z. case_bool_decide; last done. + case_match. + (* - rewrite Z.bits_opp; last lia. *) + (* - split. + + split; simplify_eq. admit. split. admit. + move => i b Hb. + rewrite Z.bits_opp; last lia. rewrite Z.pred_succ. + have : (bin_neg bv) !! i = Some (negb b) + by rewrite /bin_neg list_lookup_fmap Hb /=. + move => /b2z_spec ->. by apply negb_involutive. + + move => [_ [? ?]]. f_equal. + admit. + - split. + + split; simplify_eq. admit. split. admit. inversion 1; simplify_eq. by apply b2z_spec. + + move => [_ [? ?]]. f_equal. + - move => [? [? ?]]. *) + Admitted. + + Lemma bin_and_spec it bv1 bv2 n1 n2 : + bin_to_Z it bv1 = Some n1 → + bin_to_Z it bv2 = Some n2 → + bin_to_Z it (bin_and bv1 bv2) = Some (Z.land n1 n2). + Proof. + move => /bin_to_Z_Some_spec [Hn1 [Hbv1 Hspec1]]. + move => /bin_to_Z_Some_spec [Hn2 [Hbv2 Hspec2]]. + apply bin_to_Z_Some_spec. split; last split. + - by apply (arith_op_result_in_range it n1 n2 (Z.land n1 n2) AndOp) => //. + - by apply bin_and_length. + - move => i Hi. + specialize (Hspec1 i Hi). + specialize (Hspec2 i Hi). + erewrite bin_and_lookup => //. f_equal. + by rewrite Z.land_spec. + Qed. + + (* Lemma bin_to_Z_to_bin n it : *) (* let N := Z.to_nat (bits_per_int it) in *) (* n ∈ it → bin_to_Z (it_signed it) (Z_to_bin N n) = n. *) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index ecc4dad1..14c16515 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -57,8 +57,7 @@ End bitvec_op. Declare Scope bitvec_scope. -(* TODO *) -Notation "n %% bt" := (Z_slice 0 (bt_length bt) n) (at level 5, format "n %% bt") : bitvec_scope. +Notation "n %% bt" := (Z_as_bvec bt n) (at level 5, format "n %% bt") : bitvec_scope. Notation "bv .[ i ]" := (bvec_get bv i) (at level 5, format "bv .[ i ]") : bitvec_scope. @@ -195,18 +194,14 @@ Section programs. T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) EqOp (IntOp it) (IntOp it) T. Proof. - iIntros "HT". iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". - move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. - have Heq : bool_decide (n1 = n2) = bool_decide (bv1 = bv2). + iIntros "HT Hv1 Hv2". + iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". + iRevert "Hv1 Hv2". iApply (type_relop_int_int) => //. + iIntros (??). + have -> : bool_decide (n1 = n2) = bool_decide (bv1 = bv2). { apply bool_decide_iff. split; last congruence. intros ?. simplify_eq. by apply: bin_to_Z_inj. } - iApply (wp_binop_det (i2v (Z_of_bool (bool_decide (bv1 = bv2))) i32)). - iSplit. - - iIntros (σ v) "_ !%". split. - + inversion 1; simplify_eq/=. by rewrite Heq. - + move => ->. econstructor => //. by rewrite Heq. - - iIntros "!>". iApply "HΦ" => //. - iPureIntro. by apply val_of_int_bool. + iFrame. Qed. Global Program Instance type_binary_eq_inst it v1 bv1 v2 bv2: TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I EqOp (IntOp it) (IntOp it) := @@ -254,25 +249,14 @@ Section programs. T (b2v it bv) (t2mt (bv @ binary it)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. Proof. - iIntros (Hbv) "HT". iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". - have [n Hn] : is_Some (bin_to_Z it bv). admit. - have Hin : n ∈ it. admit. - move: (Hin) => /val_of_int_is_some [v Hv]. - rewrite /b2v Hn/= /i2v Hv/=. - move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. - iApply (wp_binop_det v). iSplit. - - iIntros (σ v') "_ !%". split. - + inversion 1; simplify_eq. - erewrite bin_and_spec in Hn => //; simplify_eq. - destruct (it_signed it) eqn:Heqn; simplify_eq => //. - by rewrite ->it_in_range_mod in * => //; simplify_eq. - + move => ->. econstructor => //. - destruct (it_signed it) eqn:Heqn; simplify_eq. - all: erewrite bin_and_spec in Hn => //; simplify_eq. - all: by try rewrite it_in_range_mod. - - iIntros "!>". iApply "HΦ"; last done. by iExists _. + iIntros (<-) "HT Hv1 Hv2". + iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". + iRevert "Hv1 Hv2". iApply type_arithop_int_int => //. + iIntros (??). iSplitR => //. + have Hn := bin_and_spec _ _ _ _ _ Hn1 Hn2. + rewrite /b2v Hn /=. Admitted. - + Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a k @ binary it)%I AndOp (IntOp it) (IntOp it) := let N := Z.to_nat (bits_per_int it) -- GitLab From 14cf985a19c553a54593cd6aaf95ec9de7f20f6d Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 19 Apr 2021 15:06:13 +0800 Subject: [PATCH 15/71] pure lemmas proofs --- theories/typing/binary.v | 250 +++++++++++++++++++++++++++++++-------- theories/typing/bitvec.v | 15 +-- 2 files changed, 206 insertions(+), 59 deletions(-) diff --git a/theories/typing/binary.v b/theories/typing/binary.v index 236c7c5c..fdff85bf 100644 --- a/theories/typing/binary.v +++ b/theories/typing/binary.v @@ -69,9 +69,36 @@ Section bin. - by rewrite replicate_length. Qed. - Lemma bin_and_lookup v1 v2 a b: - ∀ i, v1 !! i = Some a → v2 !! i = Some b → + Lemma bin_and_lookup v1 v2 a b i : + v1 !! i = Some a → + v2 !! i = Some b → (bin_and v1 v2) !! i = Some (a && b). + Proof. + rewrite lookup_zip_with. by move => -> ->. + Qed. + + Lemma bin_or_lookup v1 v2 a b i : + v1 !! i = Some a → + v2 !! i = Some b → + (bin_or v1 v2) !! i = Some (a || b). + Proof. + rewrite lookup_zip_with. by move => -> ->. + Qed. + + Lemma bin_xor_lookup v1 v2 a b i : + v1 !! i = Some a → + v2 !! i = Some b → + (bin_xor v1 v2) !! i = Some (xorb a b). + Proof. + rewrite lookup_zip_with. by move => -> ->. + Qed. + + Lemma bin_neg_lookup v b i : + v !! i = Some b ↔ + (bin_neg v) !! i = Some (negb b). + Proof. + rewrite list_lookup_fmap. split. by move => ->. + rewrite fmap_Some. move => [b' [? Heq]]. Admitted. (* Z <-> bin *) @@ -146,7 +173,39 @@ Section bin. | b :: bv => Z.b2z b + 2 * (b2z bv) end. - Lemma b2z_spec bv : ∀ n, + Lemma b2z_range bv : + 0 ≤ b2z bv < 2 ^ (length bv). + Proof. + induction bv as [|b bv [IH1 IH2]]; simplify_eq/=; first done. + have [? ?] : 0 ≤ Z.b2z b ≤ 1 by destruct b. + split; first lia. + rewrite Nat2Z.inj_succ Z.pow_succ_r; lia. + Qed. + + Lemma b2z_testbit_in_range bv : + ∀ i b, 0 ≤ i < length bv → + bv !! (Z.to_nat i) = Some b ↔ Z.testbit (b2z bv) i = b. + Proof. + induction bv as [|a bv IHbv]; simplify_eq/=; first lia. + move => i b [? ?]. + destruct (decide (i = 0)) as [->|] => /=. + 1: rewrite Z.add_b2z_double_bit0; naive_solver. + have -> : i = Z.succ (i - 1) by lia. + rewrite Z2Nat.inj_succ; last lia. cbn. + rewrite Z.add_comm Z.testbit_succ_r; last lia. + apply IHbv; lia. + Qed. + + Lemma b2z_testbit_out_range bv : + ∀ i, i >= length bv → Z.testbit (b2z bv) i = false. + Proof. + move => i Hi. have [? ?] := b2z_range bv. + apply (pos_bounded_iff_bits i); try lia. + destruct (decide (i = length bv)) as [->|] => //. + etrans => //. apply Z.pow_lt_mono_r; lia. + Qed. + + (* Lemma b2z_spec bv : ∀ n, b2z bv = n ↔ 0 ≤ n < 2 ^ (length bv) ∧ (∀ i, (i < length bv)%nat → bv !! i = Some (Z.testbit n i)). Proof. @@ -178,72 +237,163 @@ Section bin. specialize (Hbv (S i) ltac:(lia)). cbn in Hbv. rewrite Hbv Z.div2_bits; last lia. by have -> : Z.succ i = S i by lia. - Qed. + Qed. *) Definition bin_to_Z (it : int_type) (bv : bin) : option Z := - if bool_decide (length bv = Z.to_nat (bits_per_int it)) then Some ( - if it_signed it && bool_decide (last bv = Some true) - then - ((b2z (bin_neg bv)) + 1) + if bool_decide (bits_per_int it = length bv) then Some ( + if it_signed it then + if bool_decide (bv !! (length bv - 1)%nat = Some true) + then - (b2z (bin_neg (take (length bv - 1) bv)) + 1) + else b2z (take (length bv - 1) bv) else b2z bv) else None. - Lemma bin_to_Z_Some_spec it bv n : - bin_to_Z it bv = Some n ↔ n ∈ it ∧ - length bv = Z.to_nat (bits_per_int it) ∧ - ∀ i, (i < Z.to_nat (bits_per_int it))%nat → bv !! i = Some (Z.testbit n i). + Lemma bin_to_Z_is_Some it bv : + is_Some (bin_to_Z it bv) ↔ bits_per_int it = length bv. Proof. - rewrite /bin_to_Z. case_bool_decide. - - have -> : ∀ x y, Some x = Some y ↔ x = y by naive_solver. - case_match. - + admit. - + rewrite b2z_spec H. - split; [intros [? ?] | intros [? [? ?]]]; repeat split. - all: try naive_solver. - all: admit. - - split; first done. - intros [? [? ?]]. contradiction. + unfold bin_to_Z. + have := is_Some_None. + case_bool_decide; naive_solver. + Qed. + + Lemma bin_to_Z_range it bv n : + bin_to_Z it bv = Some n → n ∈ it. + Proof. + unfold bin_to_Z. case_bool_decide; last done. + have -> : ∀ x y, Some x = Some y ↔ x = y by naive_solver. + unfold elem_of, int_elem_of_it, min_int, max_int, int_half_modulus, int_modulus. + have ? := (bits_per_int_gt_0 it). + have Hab : ∀ a b, a ≤ b - 1 ↔ a < b by lia. + destruct (it_signed it); first case_bool_decide; + simplify_eq/=; move => <-; split; try lia. Admitted. - Lemma bin_to_Z_spec it bv n : + Lemma negb_involutive_iff a b : + a = negb b ↔ negb a = b. + Proof. + split; [ move => -> | move => <- ]; by rewrite negb_involutive. + Qed. + + Lemma bin_to_Z_testbit_in_range it bv n : bin_to_Z it bv = Some n → - ∀ i, (i < Z.to_nat (bits_per_int it))%nat → bv !! i = Some (Z.testbit n i). + ∀ i b, 0 ≤ i < bits_per_int it → + bv !! (Z.to_nat i) = Some b ↔ Z.testbit n i = b. Proof. - rewrite /bin_to_Z. case_bool_decide; last done. - case_match. - (* - rewrite Z.bits_opp; last lia. *) - (* - split. - + split; simplify_eq. admit. split. admit. - move => i b Hb. - rewrite Z.bits_opp; last lia. rewrite Z.pred_succ. - have : (bin_neg bv) !! i = Some (negb b) - by rewrite /bin_neg list_lookup_fmap Hb /=. - move => /b2z_spec ->. by apply negb_involutive. - + move => [_ [? ?]]. f_equal. - admit. - - split. - + split; simplify_eq. admit. split. admit. inversion 1; simplify_eq. by apply b2z_spec. - + move => [_ [? ?]]. f_equal. - - move => [? [? ?]]. *) + unfold bin_to_Z. case_bool_decide; last done. + have -> : ∀ x y, Some x = Some y ↔ x = y by naive_solver. + repeat case_match; move => <- i b Hi. + - rewrite Z.bits_opp ?Z.pred_succ; last lia. + destruct (decide (i = length bv - 1)) as [->|]. + + rewrite b2z_testbit_out_range. + 2: rewrite bin_neg_length take_length; last lia. + have -> : Z.to_nat (length bv - 1) = (length bv - 1)%nat by lia. + have -> : bv !! (length bv - 1)%nat = Some true + by apply bool_decide_eq_true in Heqb. + naive_solver. + + rewrite -negb_involutive_iff -b2z_testbit_in_range. + 2: rewrite bin_neg_length take_length; last lia. + rewrite -bin_neg_lookup lookup_take; [done | lia]. + - destruct (decide (i = length bv - 1)) as [->|]. + + rewrite b2z_testbit_out_range. + 2: rewrite take_length; lia. + have -> : Z.to_nat (length bv - 1) = (length bv - 1)%nat by lia. + have -> : bv !! (length bv - 1)%nat = Some false. + { have : (length bv - 1 < length bv)%nat by lia. + move => /lookup_lt_is_Some_2 [a ?]. + destruct a => //. + apply bool_decide_eq_false in Heqb. contradiction. } + naive_solver. + + rewrite -b2z_testbit_in_range. + 2: rewrite take_length; lia. + rewrite lookup_take; [done | lia]. + - rewrite -b2z_testbit_in_range; [done | lia]. + Qed. + + Lemma bin_to_Z_testbit_out_range it bv n : + bin_to_Z it bv = Some n → + ∀ i, i >= bits_per_int it → + Z.testbit n i = Z.testbit n (bits_per_int it - 1). + Proof. + move => Hn i Hi. have [? ?] := bin_to_Z_range it bv n Hn. + (* apply (bounded_iff_bits i); try lia. *) Admitted. + (* Lemma bin_to_Z_Some_spec it bv n : + bin_to_Z it bv = Some n ↔ n ∈ it ∧ + length bv = Z.to_nat (bits_per_int it) ∧ + ∀ i, (i < Z.to_nat (bits_per_int it))%nat → bv !! i = Some (Z.testbit n i). + Proof. + rewrite /bin_to_Z. case_bool_decide; last naive_solver. + have -> : ∀ x y, Some x = Some y ↔ x = y by naive_solver. + (* have lemma : ∀ P1 P2 Q1 Q2 R, P1 ↔ Q1 → P2 ↔ Q2 → R ↔ True → *) + (* P1 ∧ P2 ↔ Q1 ∧ R ∧ Q2 by naive_solver. *) + case_match. + 1: rewrite Z.sub_move_r. + all: split. + - move: Heqb => /andb_prop [Hsg /bool_decide_eq_true Hn]. + move => H1. rewrite H1 in Hn. move: H1. + rewrite b2z_spec H. clear H. + move => [[? Hneg] Hbv]. + have ? : n ∈ it. + { unfold elem_of, int_elem_of_it, min_int, max_int in *. + rewrite Hsg. + unfold int_half_modulus in *. unfold int_modulus in *. + have ? := (bits_per_int_gt_0 it). + split. + - have H : bits_per_int it = (bits_per_int it - 1) + 1 by lia. + rewrite H Z.pow_succ_r -?Z.add_diag -?H in Hn; lia. + - have ? : 1 ≤ 2 ^ (bits_per_int it - 1). + { have -> : 1 = 2 ^ 0 by lia. apply Z.pow_le_mono_r; lia. } + have H : bits_per_int it = Z.to_nat (bits_per_int it) by lia. + rewrite -H in Hneg. lia. } + repeat split => //. + move => i Hi. specialize (Hbv i Hi). + admit. + - move => [Hn [_ Hbv]]. + apply b2z_spec. rewrite H; clear H. repeat split. + (* apply lemma; split => //. + + admit. + + admit. + + move => Hbv i Hi. + move: (Hbv i Hi). rewrite Z.bits_opp ?Z.pred_succ; last lia. + apply bin_neg_lookup. + + move => Hbv i Hi. + move: (Hbv i Hi). rewrite Z.bits_opp ?Z.pred_succ; last lia. + apply bin_neg_lookup. + - rewrite b2z_spec H. + apply lemma; split => //. + + admit. + + admit. *) + Admitted. *) + Lemma bin_and_spec it bv1 bv2 n1 n2 : bin_to_Z it bv1 = Some n1 → bin_to_Z it bv2 = Some n2 → bin_to_Z it (bin_and bv1 bv2) = Some (Z.land n1 n2). Proof. - move => /bin_to_Z_Some_spec [Hn1 [Hbv1 Hspec1]]. - move => /bin_to_Z_Some_spec [Hn2 [Hbv2 Hspec2]]. - apply bin_to_Z_Some_spec. split; last split. - - by apply (arith_op_result_in_range it n1 n2 (Z.land n1 n2) AndOp) => //. - - by apply bin_and_length. - - move => i Hi. - specialize (Hspec1 i Hi). - specialize (Hspec2 i Hi). - erewrite bin_and_lookup => //. f_equal. - by rewrite Z.land_spec. + move => Hn1 Hn2. + have ? := bits_per_int_gt_0 it. + have : bits_per_int it = length (bin_and bv1 bv2). + { have convert : ∀ bv : bin, length bv = Z.to_nat (bits_per_int it) ↔ + bits_per_int it = length bv by lia. + rewrite -convert. apply bin_and_length. + all: rewrite convert; apply bin_to_Z_is_Some; naive_solver. } + move => /bin_to_Z_is_Some [n Hn]. + suff : n = Z.land n1 n2 by naive_solver. + apply Z.bits_inj' => i Hi. + rewrite Z.land_spec. + destruct (decide (i < bits_per_int it)). + - apply ->bin_to_Z_testbit_in_range => //. + apply bin_and_lookup; apply <-bin_to_Z_testbit_in_range => //. + - rewrite (bin_to_Z_testbit_out_range it bv1 n1) => //. + rewrite (bin_to_Z_testbit_out_range it bv2 n2) => //. + rewrite (bin_to_Z_testbit_out_range it (bin_and bv1 bv2) n) => //. + apply ->bin_to_Z_testbit_in_range => //. + apply bin_and_lookup; apply <-bin_to_Z_testbit_in_range => //. + all: have ? := bits_per_int_gt_0 it. + all: lia. Qed. - (* Lemma bin_to_Z_to_bin n it : *) (* let N := Z.to_nat (bits_per_int it) in *) (* n ∈ it → bin_to_Z (it_signed it) (Z_to_bin N n) = n. *) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 14c16515..9cfac78b 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -238,23 +238,20 @@ Section programs. Definition b2v (it : int_type) (bv : bin) : val := default [☠%V] ((λ n, i2v n it) <$> bin_to_Z it bv). - Lemma bin_and_spec it bv1 bv2 n1 n2: - bin_to_Z it bv1 = Some n1 → - bin_to_Z it bv2 = Some n2 → - bin_to_Z it (bin_and bv1 bv2) = Some (Z.land n1 n2). - Admitted. - Lemma type_and_binary it v1 bv1 v2 bv2 bv T: bin_and bv1 bv2 = bv → T (b2v it bv) (t2mt (bv @ binary it)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. Proof. - iIntros (<-) "HT Hv1 Hv2". + iIntros (<-) "HT Hv1 Hv2". + (* Check wp_wand. *) iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". - iRevert "Hv1 Hv2". iApply type_arithop_int_int => //. + iIntros (Φ) "HΦ". + (* Check wp_wand. *) + (* iApply type_arithop_int_int => //. iIntros (??). iSplitR => //. have Hn := bin_and_spec _ _ _ _ _ Hn1 Hn2. - rewrite /b2v Hn /=. + rewrite /b2v Hn /=. *) Admitted. Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : -- GitLab From 405d1533eaa3642b4570818d477ebad08510b102 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 19 Apr 2021 17:20:38 +0800 Subject: [PATCH 16/71] type_val_expr_wand --- theories/typing/bitvec.v | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 9cfac78b..ef4df812 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -238,22 +238,34 @@ Section programs. Definition b2v (it : int_type) (bv : bin) : val := default [☠%V] ((λ n, i2v n it) <$> bin_to_Z it bv). + Lemma type_val_expr_wand e T : + typed_val_expr e (λ v ty, + ∃ (ty' : mtype), subsume (v ◁ᵥ ty) (v ◁ᵥ ty') (T v ty'))%I + -∗ typed_val_expr e T. + Proof. + iIntros "HT". iIntros (Φ) "HΦ". + iApply "HT". iIntros (v ty) "Hv HT". + iDestruct "HT" as (ty') "HT". + iPoseProof ("HT" with "Hv") as "[H1 H2]". + iApply ("HΦ" with "H1 H2"). + Qed. + Lemma type_and_binary it v1 bv1 v2 bv2 bv T: bin_and bv1 bv2 = bv → T (b2v it bv) (t2mt (bv @ binary it)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. Proof. iIntros (<-) "HT Hv1 Hv2". - (* Check wp_wand. *) - iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". - iIntros (Φ) "HΦ". - (* Check wp_wand. *) - (* iApply type_arithop_int_int => //. + iApply (type_val_expr_wand with "[-]"). + iDestruct "Hv1" as (n1 Hn1) "Hv1". + iDestruct "Hv2" as (n2 Hn2) "Hv2". + have Hn := bin_and_spec _ _ _ _ _ Hn1 Hn2. rewrite /b2v Hn /=. + iApply (type_arithop_int_int with "[HT] Hv1 Hv2"); first done. iIntros (??). iSplitR => //. - have Hn := bin_and_spec _ _ _ _ _ Hn1 Hn2. - rewrite /b2v Hn /=. *) - Admitted. - + iExists _. iIntros "Hv". + iFrame "HT". simpl. iExists _. by iFrame. + Qed. + Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a k @ binary it)%I AndOp (IntOp it) (IntOp it) := let N := Z.to_nat (bits_per_int it) -- GitLab From e5ec0b546720a9417e21868736dbb31455244d1e Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 21 Apr 2021 12:23:19 +0800 Subject: [PATCH 17/71] proofs: genenal typing rules for bitwise op and neg --- theories/typing/bitvec.v | 70 ++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index ef4df812..ea564473 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -246,8 +246,8 @@ Section programs. iIntros "HT". iIntros (Φ) "HΦ". iApply "HT". iIntros (v ty) "Hv HT". iDestruct "HT" as (ty') "HT". - iPoseProof ("HT" with "Hv") as "[H1 H2]". - iApply ("HΦ" with "H1 H2"). + iPoseProof ("HT" with "Hv") as "[Hv HT']". + iApply ("HΦ" with "Hv HT'"). Qed. Lemma type_and_binary it v1 bv1 v2 bv2 bv T: @@ -266,6 +266,41 @@ Section programs. iFrame "HT". simpl. iExists _. by iFrame. Qed. + Definition bin_bitwise_op_result bv1 bv2 op : option bin := + match op with + | AndOp => Some (bin_and bv1 bv2) + | OrOp => Some (bin_or bv1 bv2) + | XorOp => Some (bin_xor bv1 bv2) + | _ => None + end. + + Lemma bin_bitwise_op_spec op it bv1 bv2 n1 n2 bv : + bin_to_Z it bv1 = Some n1 → + bin_to_Z it bv2 = Some n2 → + bin_bitwise_op_result bv1 bv2 op = Some bv → + bin_to_Z it bv = arith_op_result it n1 n2 op. + Admitted. + + Lemma type_bitwise_op_binary it v1 bv1 v2 bv2 bv T op : + bin_bitwise_op_result bv1 bv2 op = Some bv → + T (b2v it bv) (t2mt (bv @ binary it)) -∗ + typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) op (IntOp it) (IntOp it) T. + Proof. + iIntros (Hbv) "HT Hv1 Hv2". + iApply (type_val_expr_wand with "[-]"). + iDestruct "Hv1" as (n1 Hn1) "Hv1". + iDestruct "Hv2" as (n2 Hn2) "Hv2". + have [n Hz] : is_Some (arith_op_result it n1 n2 op). + { destruct op => //; naive_solver. } + have Hn : bin_to_Z it bv = Some n. + { rewrite -Hz. by apply: bin_bitwise_op_spec. } + rewrite /b2v Hn /=. + iApply (type_arithop_int_int with "[HT] Hv1 Hv2"); first done. + iIntros (??). iSplitR; first by destruct op. + iExists _. iIntros "Hv". + iFrame "HT". simpl. iExists _. by iFrame. + Qed. + Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a k @ binary it)%I AndOp (IntOp it) (IntOp it) := let N := Z.to_nat (bits_per_int it) @@ -336,32 +371,27 @@ Section programs. bin_to_Z it (bin_neg bv) = Some (if it_signed it then Z.lnot n else Z_lunot (bits_per_int it) n). Admitted. - Lemma type_neg_binary it v1 bv1 bv T: - bin_neg bv1 = bv → + Lemma type_neg_binary it v1 bv1 T: + let bv := bin_neg bv1 in T (b2v it bv) (t2mt (bv @ binary it)) -∗ typed_un_op v1 (v1 ◁ᵥ bv1 @ binary it) NotIntOp (IntOp it) T. Proof. - iIntros (Hbv) "HT". iIntros ([n1 [Hn1 Hv1]] Φ) "HΦ". - have [n Hn] : is_Some (bin_to_Z it bv). admit. - have Hin : n ∈ it. admit. - move: (Hin) => /val_of_int_is_some [v Hv]. - rewrite /b2v Hn/= /i2v Hv/=. - move: Hv1 => /val_to_of_int Hv1. - iApply (wp_unop_det v). iSplit. - - iIntros (σ v') "_ !%". split. - + inversion 1; simplify_eq. - by erewrite bin_neg_spec in Hn => //; simplify_eq. - + move => ->. econstructor => //. simplify_eq. - by erewrite bin_neg_spec in Hn => //; simplify_eq. - - iIntros "!>". iApply "HΦ"; last done. by iExists _. - Admitted. + iIntros "HT Hv1". + iApply type_val_expr_wand. + iDestruct "Hv1" as (n1 Hn1) "Hv1". + have Hn := bin_neg_spec _ _ _ Hn1. + rewrite /b2v Hn /=. + iApply (type_not_int with "[HT] Hv1"). + iIntros (?). iExists _. iIntros "Hv". + iFrame "HT". simpl. iExists _. by iFrame. + Qed. - Global Program Instance type_mask_neg_inst it v k: + (* Global Program Instance type_mask_neg_inst it v k: TypedUnOpVal v (bin_mask (Z.to_nat (bits_per_int it)) 0 k @ binary it) NotIntOp (IntOp it) := let N := Z.to_nat (bits_per_int it) in λ T, i2p (type_neg_binary it v (bin_mask N 0 k) (bin_mask N k (N - k)) T _). Next Obligation. intros. - Admitted. + Admitted. *) End programs. -- GitLab From bf16a880a5c71973252426cf6f12dcf21494ca58 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 21 Apr 2021 18:31:40 +0800 Subject: [PATCH 18/71] clean up some proofs in bitvec --- linux/casestudies/pgtable.c | 7 +- .../proofs/pgtable/generated_code.v | 264 ++++++++--------- .../proofs/pgtable/generated_spec.v | 4 +- theories/typing/bitvec.v | 267 ++++++------------ 4 files changed, 222 insertions(+), 320 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index 00b981c1..e4505a8f 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -228,9 +228,9 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) WRITE_ONCE(*ptep, pte & ~KVM_PTE_VALID); } -[[rc::parameters("pa : Z")]] -[[rc::args("pa @ int")]] -[[rc::returns("{0%%Pte.[addr := pa%%Pte.[addr]]} @ binary")]] +[[rc::parameters("pa : bin")]] +[[rc::args("pa @ binary")]] +[[rc::returns("{0%%Pte.[addr := pa.[addr]]} @ binary")]] [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { @@ -249,7 +249,6 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) [[rc::exists("pa : Z")]] [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] [[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := [true]; valid := [true]]} @ binary")]] -[[rc::tactics("3: by cbn; rewrite drop_0 H.")]] [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index d20c55fe..8102823e 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -149,138 +149,138 @@ Section code. Definition loc_162 : location_info := LocationInfo file_0 237 25 237 32. Definition loc_163 : location_info := LocationInfo file_0 237 33 237 35. Definition loc_164 : location_info := LocationInfo file_0 237 37 237 39. - Definition loc_169 : location_info := LocationInfo file_0 257 4 257 79. - Definition loc_170 : location_info := LocationInfo file_0 258 4 258 33. - Definition loc_171 : location_info := LocationInfo file_0 259 4 259 18. - Definition loc_172 : location_info := LocationInfo file_0 260 4 260 33. - Definition loc_173 : location_info := LocationInfo file_0 262 1 262 13. - Definition loc_174 : location_info := LocationInfo file_0 262 1 262 6. - Definition loc_175 : location_info := LocationInfo file_0 262 2 262 6. - Definition loc_176 : location_info := LocationInfo file_0 262 2 262 6. - Definition loc_177 : location_info := LocationInfo file_0 262 9 262 12. - Definition loc_178 : location_info := LocationInfo file_0 262 9 262 12. - Definition loc_179 : location_info := LocationInfo file_0 260 12 260 30. - Definition loc_180 : location_info := LocationInfo file_0 260 12 260 25. - Definition loc_181 : location_info := LocationInfo file_0 260 12 260 25. - Definition loc_182 : location_info := LocationInfo file_0 260 26 260 29. - Definition loc_183 : location_info := LocationInfo file_0 260 26 260 29. - Definition loc_184 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_185 : location_info := LocationInfo file_0 259 4 259 17. - Definition loc_186 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_187 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_188 : location_info := LocationInfo file_0 259 11 259 17. - Definition loc_189 : location_info := LocationInfo file_0 259 11 259 14. - Definition loc_190 : location_info := LocationInfo file_0 259 11 259 14. - Definition loc_191 : location_info := LocationInfo file_0 259 15 259 16. - Definition loc_192 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_193 : location_info := LocationInfo file_0 258 4 258 32. - Definition loc_194 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_195 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_196 : location_info := LocationInfo file_0 258 11 258 32. - Definition loc_197 : location_info := LocationInfo file_0 258 11 258 21. - Definition loc_198 : location_info := LocationInfo file_0 258 11 258 21. - Definition loc_199 : location_info := LocationInfo file_0 258 22 258 28. - Definition loc_200 : location_info := LocationInfo file_0 258 22 258 25. - Definition loc_201 : location_info := LocationInfo file_0 258 22 258 25. - Definition loc_202 : location_info := LocationInfo file_0 258 26 258 27. - Definition loc_203 : location_info := LocationInfo file_0 258 30 258 31. - Definition loc_204 : location_info := LocationInfo file_0 257 33 257 78. - Definition loc_205 : location_info := LocationInfo file_0 257 33 257 48. - Definition loc_206 : location_info := LocationInfo file_0 257 33 257 48. - Definition loc_207 : location_info := LocationInfo file_0 257 49 257 77. - Definition loc_208 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_209 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_210 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_211 : location_info := LocationInfo file_0 257 49 257 55. - Definition loc_212 : location_info := LocationInfo file_0 257 49 257 55. - Definition loc_213 : location_info := LocationInfo file_0 257 70 257 76. - Definition loc_214 : location_info := LocationInfo file_0 257 70 257 76. - Definition loc_217 : location_info := LocationInfo file_0 257 20 257 25. - Definition loc_218 : location_info := LocationInfo file_0 257 20 257 25. - Definition loc_219 : location_info := LocationInfo file_0 257 21 257 25. - Definition loc_220 : location_info := LocationInfo file_0 257 21 257 25. - Definition loc_225 : location_info := LocationInfo file_0 275 4 275 53. - Definition loc_226 : location_info := LocationInfo file_0 276 4 277 33. - Definition loc_227 : location_info := LocationInfo file_0 278 4 278 53. - Definition loc_228 : location_info := LocationInfo file_0 279 4 279 36. - Definition loc_229 : location_info := LocationInfo file_0 280 4 280 18. - Definition loc_230 : location_info := LocationInfo file_0 282 4 283 26. - Definition loc_231 : location_info := LocationInfo file_0 285 1 285 13. - Definition loc_232 : location_info := LocationInfo file_0 286 4 286 13. - Definition loc_233 : location_info := LocationInfo file_0 286 11 286 12. - Definition loc_234 : location_info := LocationInfo file_0 285 1 285 6. - Definition loc_235 : location_info := LocationInfo file_0 285 2 285 6. - Definition loc_236 : location_info := LocationInfo file_0 285 2 285 6. - Definition loc_237 : location_info := LocationInfo file_0 285 9 285 12. - Definition loc_238 : location_info := LocationInfo file_0 285 9 285 12. - Definition loc_239 : location_info := LocationInfo file_0 283 8 283 26. - Definition loc_240 : location_info := LocationInfo file_0 283 15 283 25. - Definition loc_241 : location_info := LocationInfo file_0 283 15 283 18. - Definition loc_242 : location_info := LocationInfo file_0 283 15 283 18. - Definition loc_243 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_244 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_246 : location_info := LocationInfo file_0 282 8 282 26. - Definition loc_247 : location_info := LocationInfo file_0 282 8 282 21. - Definition loc_248 : location_info := LocationInfo file_0 282 8 282 21. - Definition loc_249 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_250 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_251 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_252 : location_info := LocationInfo file_0 280 4 280 17. - Definition loc_253 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_254 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_255 : location_info := LocationInfo file_0 280 11 280 17. - Definition loc_256 : location_info := LocationInfo file_0 280 11 280 14. - Definition loc_257 : location_info := LocationInfo file_0 280 11 280 14. - Definition loc_258 : location_info := LocationInfo file_0 280 15 280 16. - Definition loc_259 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_260 : location_info := LocationInfo file_0 279 4 279 35. - Definition loc_261 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_262 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_263 : location_info := LocationInfo file_0 279 11 279 35. - Definition loc_264 : location_info := LocationInfo file_0 279 11 279 21. - Definition loc_265 : location_info := LocationInfo file_0 279 11 279 21. - Definition loc_266 : location_info := LocationInfo file_0 279 22 279 28. - Definition loc_267 : location_info := LocationInfo file_0 279 22 279 25. - Definition loc_268 : location_info := LocationInfo file_0 279 22 279 25. - Definition loc_269 : location_info := LocationInfo file_0 279 26 279 27. - Definition loc_270 : location_info := LocationInfo file_0 279 30 279 34. - Definition loc_271 : location_info := LocationInfo file_0 279 30 279 34. - Definition loc_272 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_273 : location_info := LocationInfo file_0 278 4 278 52. - Definition loc_274 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_275 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_276 : location_info := LocationInfo file_0 278 11 278 52. - Definition loc_277 : location_info := LocationInfo file_0 278 11 278 15. - Definition loc_278 : location_info := LocationInfo file_0 278 11 278 15. - Definition loc_279 : location_info := LocationInfo file_0 278 18 278 52. - Definition loc_280 : location_info := LocationInfo file_0 278 19 278 33. - Definition loc_281 : location_info := LocationInfo file_0 278 19 278 26. - Definition loc_282 : location_info := LocationInfo file_0 278 19 278 26. - Definition loc_283 : location_info := LocationInfo file_0 278 27 278 29. - Definition loc_284 : location_info := LocationInfo file_0 278 31 278 32. - Definition loc_285 : location_info := LocationInfo file_0 278 36 278 51. - Definition loc_286 : location_info := LocationInfo file_0 278 36 278 43. - Definition loc_287 : location_info := LocationInfo file_0 278 36 278 43. - Definition loc_288 : location_info := LocationInfo file_0 278 44 278 46. - Definition loc_289 : location_info := LocationInfo file_0 278 48 278 50. - Definition loc_290 : location_info := LocationInfo file_0 276 15 277 32. - Definition loc_291 : location_info := LocationInfo file_0 276 15 276 32. - Definition loc_292 : location_info := LocationInfo file_0 276 16 276 21. - Definition loc_293 : location_info := LocationInfo file_0 276 16 276 21. - Definition loc_294 : location_info := LocationInfo file_0 276 25 276 31. - Definition loc_295 : location_info := LocationInfo file_0 276 25 276 27. - Definition loc_296 : location_info := LocationInfo file_0 276 30 276 31. - Definition loc_297 : location_info := LocationInfo file_0 276 35 276 36. - Definition loc_298 : location_info := LocationInfo file_0 277 31 277 32. - Definition loc_301 : location_info := LocationInfo file_0 275 33 275 52. - Definition loc_302 : location_info := LocationInfo file_0 275 33 275 48. - Definition loc_303 : location_info := LocationInfo file_0 275 33 275 48. - Definition loc_304 : location_info := LocationInfo file_0 275 49 275 51. - Definition loc_305 : location_info := LocationInfo file_0 275 49 275 51. - Definition loc_308 : location_info := LocationInfo file_0 275 20 275 25. - Definition loc_309 : location_info := LocationInfo file_0 275 20 275 25. - Definition loc_310 : location_info := LocationInfo file_0 275 21 275 25. - Definition loc_311 : location_info := LocationInfo file_0 275 21 275 25. + Definition loc_169 : location_info := LocationInfo file_0 256 4 256 79. + Definition loc_170 : location_info := LocationInfo file_0 257 4 257 33. + Definition loc_171 : location_info := LocationInfo file_0 258 4 258 18. + Definition loc_172 : location_info := LocationInfo file_0 259 4 259 33. + Definition loc_173 : location_info := LocationInfo file_0 261 1 261 13. + Definition loc_174 : location_info := LocationInfo file_0 261 1 261 6. + Definition loc_175 : location_info := LocationInfo file_0 261 2 261 6. + Definition loc_176 : location_info := LocationInfo file_0 261 2 261 6. + Definition loc_177 : location_info := LocationInfo file_0 261 9 261 12. + Definition loc_178 : location_info := LocationInfo file_0 261 9 261 12. + Definition loc_179 : location_info := LocationInfo file_0 259 12 259 30. + Definition loc_180 : location_info := LocationInfo file_0 259 12 259 25. + Definition loc_181 : location_info := LocationInfo file_0 259 12 259 25. + Definition loc_182 : location_info := LocationInfo file_0 259 26 259 29. + Definition loc_183 : location_info := LocationInfo file_0 259 26 259 29. + Definition loc_184 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_185 : location_info := LocationInfo file_0 258 4 258 17. + Definition loc_186 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_187 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_188 : location_info := LocationInfo file_0 258 11 258 17. + Definition loc_189 : location_info := LocationInfo file_0 258 11 258 14. + Definition loc_190 : location_info := LocationInfo file_0 258 11 258 14. + Definition loc_191 : location_info := LocationInfo file_0 258 15 258 16. + Definition loc_192 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_193 : location_info := LocationInfo file_0 257 4 257 32. + Definition loc_194 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_195 : location_info := LocationInfo file_0 257 4 257 7. + Definition loc_196 : location_info := LocationInfo file_0 257 11 257 32. + Definition loc_197 : location_info := LocationInfo file_0 257 11 257 21. + Definition loc_198 : location_info := LocationInfo file_0 257 11 257 21. + Definition loc_199 : location_info := LocationInfo file_0 257 22 257 28. + Definition loc_200 : location_info := LocationInfo file_0 257 22 257 25. + Definition loc_201 : location_info := LocationInfo file_0 257 22 257 25. + Definition loc_202 : location_info := LocationInfo file_0 257 26 257 27. + Definition loc_203 : location_info := LocationInfo file_0 257 30 257 31. + Definition loc_204 : location_info := LocationInfo file_0 256 33 256 78. + Definition loc_205 : location_info := LocationInfo file_0 256 33 256 48. + Definition loc_206 : location_info := LocationInfo file_0 256 33 256 48. + Definition loc_207 : location_info := LocationInfo file_0 256 49 256 77. + Definition loc_208 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_209 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_210 : location_info := LocationInfo file_0 256 49 256 69. + Definition loc_211 : location_info := LocationInfo file_0 256 49 256 55. + Definition loc_212 : location_info := LocationInfo file_0 256 49 256 55. + Definition loc_213 : location_info := LocationInfo file_0 256 70 256 76. + Definition loc_214 : location_info := LocationInfo file_0 256 70 256 76. + Definition loc_217 : location_info := LocationInfo file_0 256 20 256 25. + Definition loc_218 : location_info := LocationInfo file_0 256 20 256 25. + Definition loc_219 : location_info := LocationInfo file_0 256 21 256 25. + Definition loc_220 : location_info := LocationInfo file_0 256 21 256 25. + Definition loc_225 : location_info := LocationInfo file_0 274 4 274 53. + Definition loc_226 : location_info := LocationInfo file_0 275 4 276 33. + Definition loc_227 : location_info := LocationInfo file_0 277 4 277 53. + Definition loc_228 : location_info := LocationInfo file_0 278 4 278 36. + Definition loc_229 : location_info := LocationInfo file_0 279 4 279 18. + Definition loc_230 : location_info := LocationInfo file_0 281 4 282 26. + Definition loc_231 : location_info := LocationInfo file_0 284 1 284 13. + Definition loc_232 : location_info := LocationInfo file_0 285 4 285 13. + Definition loc_233 : location_info := LocationInfo file_0 285 11 285 12. + Definition loc_234 : location_info := LocationInfo file_0 284 1 284 6. + Definition loc_235 : location_info := LocationInfo file_0 284 2 284 6. + Definition loc_236 : location_info := LocationInfo file_0 284 2 284 6. + Definition loc_237 : location_info := LocationInfo file_0 284 9 284 12. + Definition loc_238 : location_info := LocationInfo file_0 284 9 284 12. + Definition loc_239 : location_info := LocationInfo file_0 282 8 282 26. + Definition loc_240 : location_info := LocationInfo file_0 282 15 282 25. + Definition loc_241 : location_info := LocationInfo file_0 282 15 282 18. + Definition loc_242 : location_info := LocationInfo file_0 282 15 282 18. + Definition loc_243 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_244 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_246 : location_info := LocationInfo file_0 281 8 281 26. + Definition loc_247 : location_info := LocationInfo file_0 281 8 281 21. + Definition loc_248 : location_info := LocationInfo file_0 281 8 281 21. + Definition loc_249 : location_info := LocationInfo file_0 281 22 281 25. + Definition loc_250 : location_info := LocationInfo file_0 281 22 281 25. + Definition loc_251 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_252 : location_info := LocationInfo file_0 279 4 279 17. + Definition loc_253 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_254 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_255 : location_info := LocationInfo file_0 279 11 279 17. + Definition loc_256 : location_info := LocationInfo file_0 279 11 279 14. + Definition loc_257 : location_info := LocationInfo file_0 279 11 279 14. + Definition loc_258 : location_info := LocationInfo file_0 279 15 279 16. + Definition loc_259 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_260 : location_info := LocationInfo file_0 278 4 278 35. + Definition loc_261 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_262 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_263 : location_info := LocationInfo file_0 278 11 278 35. + Definition loc_264 : location_info := LocationInfo file_0 278 11 278 21. + Definition loc_265 : location_info := LocationInfo file_0 278 11 278 21. + Definition loc_266 : location_info := LocationInfo file_0 278 22 278 28. + Definition loc_267 : location_info := LocationInfo file_0 278 22 278 25. + Definition loc_268 : location_info := LocationInfo file_0 278 22 278 25. + Definition loc_269 : location_info := LocationInfo file_0 278 26 278 27. + Definition loc_270 : location_info := LocationInfo file_0 278 30 278 34. + Definition loc_271 : location_info := LocationInfo file_0 278 30 278 34. + Definition loc_272 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_273 : location_info := LocationInfo file_0 277 4 277 52. + Definition loc_274 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_275 : location_info := LocationInfo file_0 277 4 277 7. + Definition loc_276 : location_info := LocationInfo file_0 277 11 277 52. + Definition loc_277 : location_info := LocationInfo file_0 277 11 277 15. + Definition loc_278 : location_info := LocationInfo file_0 277 11 277 15. + Definition loc_279 : location_info := LocationInfo file_0 277 18 277 52. + Definition loc_280 : location_info := LocationInfo file_0 277 19 277 33. + Definition loc_281 : location_info := LocationInfo file_0 277 19 277 26. + Definition loc_282 : location_info := LocationInfo file_0 277 19 277 26. + Definition loc_283 : location_info := LocationInfo file_0 277 27 277 29. + Definition loc_284 : location_info := LocationInfo file_0 277 31 277 32. + Definition loc_285 : location_info := LocationInfo file_0 277 36 277 51. + Definition loc_286 : location_info := LocationInfo file_0 277 36 277 43. + Definition loc_287 : location_info := LocationInfo file_0 277 36 277 43. + Definition loc_288 : location_info := LocationInfo file_0 277 44 277 46. + Definition loc_289 : location_info := LocationInfo file_0 277 48 277 50. + Definition loc_290 : location_info := LocationInfo file_0 275 15 276 32. + Definition loc_291 : location_info := LocationInfo file_0 275 15 275 32. + Definition loc_292 : location_info := LocationInfo file_0 275 16 275 21. + Definition loc_293 : location_info := LocationInfo file_0 275 16 275 21. + Definition loc_294 : location_info := LocationInfo file_0 275 25 275 31. + Definition loc_295 : location_info := LocationInfo file_0 275 25 275 27. + Definition loc_296 : location_info := LocationInfo file_0 275 30 275 31. + Definition loc_297 : location_info := LocationInfo file_0 275 35 275 36. + Definition loc_298 : location_info := LocationInfo file_0 276 31 276 32. + Definition loc_301 : location_info := LocationInfo file_0 274 33 274 52. + Definition loc_302 : location_info := LocationInfo file_0 274 33 274 48. + Definition loc_303 : location_info := LocationInfo file_0 274 33 274 48. + Definition loc_304 : location_info := LocationInfo file_0 274 49 274 51. + Definition loc_305 : location_info := LocationInfo file_0 274 49 274 51. + Definition loc_308 : location_info := LocationInfo file_0 274 20 274 25. + Definition loc_309 : location_info := LocationInfo file_0 274 20 274 25. + Definition loc_310 : location_info := LocationInfo file_0 274 21 274 25. + Definition loc_311 : location_info := LocationInfo file_0 274 21 274 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index e7f84b64..d3226f34 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -100,8 +100,8 @@ Section spec. (* Specifications for function [kvm_phys_to_pte]. *) Definition type_of_kvm_phys_to_pte := - fn(∀ pa : Z; (pa @ (int (u64))); True) - → ∃ () : (), ((0%%Pte.[addr := pa%%Pte.[addr]]) @ (binary (u64))); True. + fn(∀ pa : bin; (pa @ (binary (u64))); True) + → ∃ () : (), ((0%%Pte.[addr := pa.[addr]]) @ (binary (u64))); True. (* Specifications for function [kvm_set_table_pte]. *) Definition type_of_kvm_set_table_pte := diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index ea564473..6d193a25 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -79,7 +79,8 @@ Section binary. (∃ z, ⌜bin_to_Z it bv = Some z⌝ ∗ l ◁ₗ{β} z @ int it)%I |}. Next Obligation. - iIntros (?????). iDestruct 1 as (?)"[% ?]". iExists _. iSplitR => //. + iIntros (?????). iDestruct 1 as (?) "[% ?]". + iExists _. iSplitR => //. by iApply ty_share. Qed. @@ -95,14 +96,16 @@ Section binary. |} |}. Next Obligation. - iIntros (???). iDestruct 1 as (??) "Hl". iApply (ty_aligned with "Hl"). + iIntros (???). iDestruct 1 as (??) "Hl". + iApply (ty_aligned with "Hl"). Qed. Next Obligation. - iIntros (???). iDestruct 1 as (??) "Hl". iApply (ty_size_eq with "Hl"). + iIntros (???). iDestruct 1 as (??) "Hl". + iApply (ty_size_eq with "Hl"). Qed. Next Obligation. iIntros (???). iDestruct 1 as (??) "Hl". - iDestruct (ty_deref with "Hl") as (v) "[? ?]". + iDestruct (ty_deref with "Hl") as (?) "[? ?]". by do 2 (iExists _; iFrame). Qed. Next Obligation. @@ -115,7 +118,13 @@ Section binary. Global Program Instance binary_copyable it bv : Copyable (bv @ binary it). Next Obligation. - Admitted. + iIntros (?????) "Hl". + iDestruct "Hl" as (??) "Hl". + iMod (copy_shr_acc with "Hl") as "[? Hl]" => //. iFrame. + iDestruct "Hl" as (??) "[? [? ?]]". + iExists _, _. iFrame. + iExists _. by iFrame. + Qed. End binary. Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'") : printing_sugar. @@ -123,6 +132,19 @@ Notation "binary< it >" := (binary it) (only printing, format "'binary<' it '>'" Section programs. Context `{!typeG Σ}. + (* TODO: move to other file; this is a general lifting lemma. *) + Lemma type_val_expr_wand e T : + typed_val_expr e (λ v ty, + ∃ (ty' : mtype), subsume (v ◁ᵥ ty) (v ◁ᵥ ty') (T v ty'))%I + -∗ typed_val_expr e T. + Proof. + iIntros "HT". iIntros (Φ) "HΦ". + iApply "HT". iIntros (v ty) "Hv HT". + iDestruct "HT" as (ty') "HT". + iPoseProof ("HT" with "Hv") as "[Hv HT']". + iApply ("HΦ" with "Hv HT'"). + Qed. + Lemma Z_to_bin_to_Z it n bv : Z_to_bin it n = Some bv → bin_to_Z it bv = Some n. Admitted. @@ -136,52 +158,26 @@ Section programs. Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it) (bv @ binary it) := λ T, i2p (subsume_val_int_binary T it v n bv). - (* - Lemma subsume_int_binary T v it n bv : - (⌜bv = Z_to_bin (Z.to_nat (bits_per_int it)) n⌝ ∗ T) - -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. - Global Instance subsume_int_binary_inst v it n bv : Subsume (v ◁ᵥ n @ int it)%I (v ◁ᵥ bv @ binary it)%I := - λ T, i2p (subsume_int_binary T v it n bv). - *) - - (* TODO: SubsumeVal *) - (* Global Instance simple_subsume_val_data_binary it shape bv: - SubsumeVal (shape @ bdata it)%I (bv @ binary it)%I (⌜bv = mk_data shape (Z.to_nat (bits_per_int it))⌝). - Proof. - iIntros (v) "Heq Hn". rewrite /ty_own_val /=. - by iDestruct "Heq" as %->. - Qed. *) -(* - Lemma subsume_data_binary T it p shape bv : - let N := Z.to_nat (bits_per_int it) in - (⌜bv = mk_data shape N⌝ ∗ T) -∗ subsume (p ◁ₗ shape @ bdata it) (p ◁ₗ bv @ binary it) T. + Lemma bin_to_bool_spec it bv n : + bin_to_Z it bv = Some n → + Z_of_bool (bin_to_bool bv) = n. Admitted. - Global Instance subsume_data_binary_inst it p shape bv : SubsumePlace p Own (shape @ bdata it)%I (bv @ binary it)%I := - λ T, i2p (subsume_data_binary T it p shape bv). *) - Lemma type_cast_data_bool it v a x T: - let N := Z.to_nat (bits_per_int it) in - let b := bin_to_bool x in + (* Why this is needed? *) + Lemma type_cast_binary_bool it v bv T: + let b := bin_to_bool bv in T (i2v (Z_of_bool b) bool_it) (t2mt (b @ boolean bool_it)) -∗ - typed_un_op v (v ◁ᵥ bin_data N a x @ binary it)%I (CastOp (IntOp bool_it)) (IntOp it) T. - Proof. - iIntros "HT". iIntros ([n [Hn Hv]] Φ) "HΦ". - move: Hv => /val_to_of_int Hv. - iApply wp_cast_int => //. - Admitted. - Global Instance type_cast_data_bool_inst it v a x : - TypedUnOpVal v (bin_data (Z.to_nat (bits_per_int it)) a x @ binary it) (CastOp (IntOp bool_it)) (IntOp it) := - λ T, i2p (type_cast_data_bool it v a x T). - - (* Lemma type_cast_data_to_bool it1 it2 v a x T: - let b := bin_to_bool x in - T (i2v (Z_of_bool b) it2) (t2mt (b @ boolean it2)) -∗ - typed_un_op v (v ◁ᵥ [(a, x)] @ bdata it1)%I (CastOp (IntOp it2)) (IntOp it1) T. + typed_un_op v (v ◁ᵥ bv @ binary it)%I (CastOp (IntOp bool_it)) (IntOp it) T. Proof. + iIntros "HT Hv1". + iApply type_val_expr_wand. + iDestruct "Hv1" as (n1 Hn1) "Hv1". + rewrite (bin_to_bool_spec _ _ _ Hn1). + iApply (type_cast_int with "[HT] Hv1") => //. Admitted. - Global Instance type_cast_binary_to_bool_inst it1 it2 v a x : - TypedUnOpVal v ([(a, x)] @ bdata it1) (CastOp (IntOp it2)) (IntOp it1) := - λ T, i2p (type_cast_data_to_bool it1 it2 v a x T). *) + Global Instance type_cast_binary_bool_inst it v bv : + TypedUnOpVal v (bv @ binary it) (CastOp (IntOp bool_it)) (IntOp it) := + λ T, i2p (type_cast_binary_bool it v bv T). Lemma bin_to_Z_inj it n bv1 bv2 : bin_to_Z it bv1 = Some n → @@ -195,77 +191,42 @@ Section programs. typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) EqOp (IntOp it) (IntOp it) T. Proof. iIntros "HT Hv1 Hv2". - iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". - iRevert "Hv1 Hv2". iApply (type_relop_int_int) => //. - iIntros (??). - have -> : bool_decide (n1 = n2) = bool_decide (bv1 = bv2). + iApply type_val_expr_wand. + iDestruct "Hv1" as (n1 Hn1) "Hv1". + iDestruct "Hv2" as (n2 Hn2) "Hv2". + have <- : bool_decide (n1 = n2) = bool_decide (bv1 = bv2). { apply bool_decide_iff. split; last congruence. intros ?. simplify_eq. by apply: bin_to_Z_inj. } - iFrame. + iApply (type_relop_int_int with "[HT] Hv1 Hv2") => //. + iIntros (??). iExists _. + iIntros "Hv". by iFrame. Qed. Global Program Instance type_binary_eq_inst it v1 bv1 v2 bv2: TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I EqOp (IntOp it) (IntOp it) := λ T, i2p (type_binary_eq it v1 bv1 v2 bv2 T). - (* Lemma type_binary_int_eq it v1 bv v2 n T : - let b := bool_decide (Z_to_bin it n = bv) in + Lemma type_binary_int_eq it v1 bv v2 n T : + let b := bool_decide (bin_to_Z it bv = Some n) in T (i2v (Z_of_bool b) i32) (t2mt (b @ boolean i32)) -∗ typed_bin_op v1 (v1 ◁ᵥ bv @ binary it) v2 (v2 ◁ᵥ n @ int it) EqOp (IntOp it) (IntOp it) T. - Admitted. - Global Program Instance type_binary_int_eq_inst it v1 bv v2 n: + Proof. + iIntros "HT Hv1 Hv2". + iApply type_val_expr_wand. + iDestruct "Hv1" as (n1 Hn1) "Hv1". + rewrite Hn1. + have -> : bool_decide (Some n1 = Some n) = bool_decide (n1 = n). + { apply bool_decide_iff. naive_solver. } + iApply (type_relop_int_int with "[HT] Hv1 Hv2") => //. + iIntros (??). iExists _. + iIntros "Hv". by iFrame. + Qed. + Global Instance type_binary_int_eq_inst it v1 bv v2 n: TypedBinOpVal v1 (bv @ (binary it))%I v2 (n @ (int it))%I EqOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_int_eq it v1 bv v2 n T). *) - - (* Lemma type_binary_mask_and it v1 bv1 v2 shape T: - let N := Z.to_nat (bits_per_int it) in - let shape' := bin_mask_and bv1 shape in - T (b2v (mk_data shape' N)) (t2mt (shape' @ bdata it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ shape @ bmask it) AndOp (IntOp it) (IntOp it) T. - Admitted. - Global Program Instance type_binary_mask_and_inst it v1 bv1 v2 shape : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (shape @ (bmask it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_binary_mask_and it v1 bv1 v2 shape T). *) -(* - Lemma type_and_binary it v1 bv1 v2 bv2 T: - let bv := bin_and bv1 bv2 in - T (b2v bv) (t2mt (bv @ binary it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. - Admitted. - Global Program Instance type_and_binary_inst it v1 bv1 v2 bv2 : - TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ binary it)%I AndOp (IntOp it) (IntOp it) | 10 := - λ T, i2p (type_and_binary it v1 bv1 v2 bv2 T). *) + λ T, i2p (type_binary_int_eq it v1 bv v2 n T). Definition b2v (it : int_type) (bv : bin) : val := default [☠%V] ((λ n, i2v n it) <$> bin_to_Z it bv). - Lemma type_val_expr_wand e T : - typed_val_expr e (λ v ty, - ∃ (ty' : mtype), subsume (v ◁ᵥ ty) (v ◁ᵥ ty') (T v ty'))%I - -∗ typed_val_expr e T. - Proof. - iIntros "HT". iIntros (Φ) "HΦ". - iApply "HT". iIntros (v ty) "Hv HT". - iDestruct "HT" as (ty') "HT". - iPoseProof ("HT" with "Hv") as "[Hv HT']". - iApply ("HΦ" with "Hv HT'"). - Qed. - - Lemma type_and_binary it v1 bv1 v2 bv2 bv T: - bin_and bv1 bv2 = bv → - T (b2v it bv) (t2mt (bv @ binary it)) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) AndOp (IntOp it) (IntOp it) T. - Proof. - iIntros (<-) "HT Hv1 Hv2". - iApply (type_val_expr_wand with "[-]"). - iDestruct "Hv1" as (n1 Hn1) "Hv1". - iDestruct "Hv2" as (n2 Hn2) "Hv2". - have Hn := bin_and_spec _ _ _ _ _ Hn1 Hn2. rewrite /b2v Hn /=. - iApply (type_arithop_int_int with "[HT] Hv1 Hv2"); first done. - iIntros (??). iSplitR => //. - iExists _. iIntros "Hv". - iFrame "HT". simpl. iExists _. by iFrame. - Qed. - Definition bin_bitwise_op_result bv1 bv2 op : option bin := match op with | AndOp => Some (bin_and bv1 bv2) @@ -287,7 +248,7 @@ Section programs. typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) op (IntOp it) (IntOp it) T. Proof. iIntros (Hbv) "HT Hv1 Hv2". - iApply (type_val_expr_wand with "[-]"). + iApply type_val_expr_wand. iDestruct "Hv1" as (n1 Hn1) "Hv1". iDestruct "Hv2" as (n2 Hn2) "Hv2". have [n Hz] : is_Some (arith_op_result it n1 n2 op). @@ -297,81 +258,28 @@ Section programs. rewrite /b2v Hn /=. iApply (type_arithop_int_int with "[HT] Hv1 Hv2"); first done. iIntros (??). iSplitR; first by destruct op. - iExists _. iIntros "Hv". - iFrame "HT". simpl. iExists _. by iFrame. + iExists _. iIntros "Hv". iFrame "HT". + simpl. iExists _. by iFrame. Qed. - - Global Program Instance type_and_binary_mask_inst it v1 bv v2 a k : - TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a k @ binary it)%I AndOp (IntOp it) (IntOp it) := - let N := Z.to_nat (bits_per_int it) - in λ T, i2p (type_and_binary it v1 bv v2 (bin_mask N a k) (bin_data N a (bin_slice a k bv)) T _). - Next Obligation. - intros. - Admitted. - (* Even if a + k > N, `bin_mask` can still generate a bin with length `N` by simply trim the extra elements. *) - - (* Lemma type_int_mask_and it v1 n1 v2 a k T: - let N := Z.to_nat (bits_per_int it) in - typed_bin_op v1 (v1 ◁ᵥ Z_to_bin N n1 @ binary it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T -∗ - typed_bin_op v1 (v1 ◁ᵥ n1 @ int it) v2 (v2 ◁ᵥ mk_mask (MASK a k) N @ binary it) AndOp (IntOp it) (IntOp it) T. - Admitted. - Global Program Instance type_int_mask_and_inst it v1 n1 v2 a k : - TypedBinOpVal v1 (n1 @ int it)%I v2 (mk_mask (MASK a k) (Z.to_nat (bits_per_int it)) @ (binary it))%I AndOp (IntOp it) (IntOp it) := - λ T, i2p (type_int_mask_and it v1 n1 v2 a k T). *) - - Lemma bin_or_spec it bv1 bv2 n1 n2: - bin_to_Z it bv1 = Some n1 → - bin_to_Z it bv2 = Some n2 → - bin_to_Z it (bin_or bv1 bv2) = Some (Z.lor n1 n2). - Admitted. - - Lemma type_or_binary it v1 bv1 v2 bv2 bv (sidecond : Prop) T: - (sidecond → bin_or bv1 bv2 = bv) → - (⌜sidecond⌝ ∗ T (b2v it bv) (t2mt (bv @ binary it))) -∗ - typed_bin_op v1 (v1 ◁ᵥ bv1 @ binary it) v2 (v2 ◁ᵥ bv2 @ binary it) OrOp (IntOp it) (IntOp it) T. - Proof. - iIntros (Hsidecond) "[% HT]". move: H => /Hsidecond Hbv. - iIntros ([n1 [Hn1 Hv1]] [n2 [Hn2 Hv2]] Φ) "HΦ". - have [n Hn] : is_Some (bin_to_Z it bv). admit. - have Hin : n ∈ it. admit. - move: (Hin) => /val_of_int_is_some [v Hv]. - rewrite /b2v Hn/= /i2v Hv/=. - move: Hv1 Hv2 => /val_to_of_int Hv1 /val_to_of_int Hv2. - iApply (wp_binop_det v). iSplit. - - iIntros (σ v') "_ !%". split. - + inversion 1; simplify_eq. - erewrite bin_or_spec in Hn => //; simplify_eq. - destruct (it_signed it) eqn:Heqn; simplify_eq => //. - by rewrite ->it_in_range_mod in * => //; simplify_eq. - + move => ->. econstructor => //. - destruct (it_signed it) eqn:Heqn; simplify_eq. - all: erewrite bin_or_spec in Hn => //; simplify_eq. - all: by try rewrite it_in_range_mod. - - iIntros "!>". iApply "HΦ"; last done. by iExists _. - Admitted. - - Global Program Instance type_binary_data_or_inst it v1 bv v2 a x : - TypedBinOpVal v1 (bv @ (binary it))%I v2 (bin_data (Z.to_nat (bits_per_int it)) a x @ (binary it))%I OrOp (IntOp it) (IntOp it) := - let N := Z.to_nat (bits_per_int it) - in λ T, i2p (type_or_binary it v1 bv v2 (bin_data N a x) (bin_update a (length x) x bv) (bin_slice a (length x) bv = replicate (length x) false) T _). - Next Obligation. - intros. - Admitted. - - Global Program Instance type_mask_or_inst it v1 a1 k1 v2 a2 k2 : - TypedBinOpVal v1 (bin_mask (Z.to_nat (bits_per_int it)) a1 k1 @ binary it)%I v2 (bin_mask (Z.to_nat (bits_per_int it)) a2 k2 @ binary it)%I OrOp (IntOp it) (IntOp it) := - let N := Z.to_nat (bits_per_int it) - in λ T, i2p (type_or_binary it v1 (bin_mask N a1 k1) v2 (bin_mask N a2 k2) (bin_mask_union N [(a1, k1); (a2, k2)]) (a1 + k1 ≤ a2) T _). - Next Obligation. - intros. - Admitted. + Global Program Instance type_binary_and_inst it v1 bv1 v2 bv2: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I AndOp (IntOp it) (IntOp it) := + λ T, i2p (type_bitwise_op_binary it v1 bv1 v2 bv2 (bin_and bv1 bv2) T AndOp _). + Next Obligation. done. Qed. + Global Program Instance type_binary_or_inst it v1 bv1 v2 bv2: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I OrOp (IntOp it) (IntOp it) := + λ T, i2p (type_bitwise_op_binary it v1 bv1 v2 bv2 (bin_or bv1 bv2) T OrOp _). + Next Obligation. done. Qed. + Global Program Instance type_binary_xor_inst it v1 bv1 v2 bv2: + TypedBinOpVal v1 (bv1 @ (binary it))%I v2 (bv2 @ (binary it))%I XorOp (IntOp it) (IntOp it) := + λ T, i2p (type_bitwise_op_binary it v1 bv1 v2 bv2 (bin_xor bv1 bv2) T XorOp _). + Next Obligation. done. Qed. Lemma bin_neg_spec it bv n: bin_to_Z it bv = Some n → bin_to_Z it (bin_neg bv) = Some (if it_signed it then Z.lnot n else Z_lunot (bits_per_int it) n). Admitted. - Lemma type_neg_binary it v1 bv1 T: + Lemma type_binary_neg it v1 bv1 T: let bv := bin_neg bv1 in T (b2v it bv) (t2mt (bv @ binary it)) -∗ typed_un_op v1 (v1 ◁ᵥ bv1 @ binary it) NotIntOp (IntOp it) T. @@ -382,16 +290,11 @@ Section programs. have Hn := bin_neg_spec _ _ _ Hn1. rewrite /b2v Hn /=. iApply (type_not_int with "[HT] Hv1"). - iIntros (?). iExists _. iIntros "Hv". - iFrame "HT". simpl. iExists _. by iFrame. + iIntros (?). iExists _. iIntros "Hv". iFrame "HT". + simpl. iExists _. by iFrame. Qed. - - (* Global Program Instance type_mask_neg_inst it v k: - TypedUnOpVal v (bin_mask (Z.to_nat (bits_per_int it)) 0 k @ binary it) NotIntOp (IntOp it) := - let N := Z.to_nat (bits_per_int it) - in λ T, i2p (type_neg_binary it v (bin_mask N 0 k) (bin_mask N k (N - k)) T _). - Next Obligation. - intros. - Admitted. *) + Global Instance type_binary_neg_inst it v bv : + TypedUnOpVal v (bv @ binary it)%I NotIntOp (IntOp it) := + λ T, i2p (type_binary_neg it v bv T). End programs. -- GitLab From cd52335d1bfbb6a4333d30f9f7a7a4d471a828dc Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 25 Apr 2021 22:48:29 +0800 Subject: [PATCH 19/71] simpl rules --- linux/casestudies/pgtable.c | 13 +- .../proofs/pgtable/generated_code.v | 550 +++++++++--------- .../pgtable/generated_proof_kvm_phys_to_pte.v | 30 +- .../pgtable/generated_proof_kvm_pte_valid.v | 29 +- .../generated_proof_kvm_set_invalid_pte.v | 29 +- .../generated_proof_kvm_set_table_pte.v | 32 +- .../proofs/pgtable/generated_spec.v | 5 +- .../proofs/pgtable/pgtable_lemmas.v | 10 +- theories/{typing => lang}/binary.v | 4 +- theories/lithium/simpl_binary.v | 52 ++ theories/typing/bitvec.v | 18 +- 11 files changed, 469 insertions(+), 303 deletions(-) rename theories/{typing => lang}/binary.v (99%) create mode 100644 theories/lithium/simpl_binary.v diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index e4505a8f..ec68d980 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -1,4 +1,5 @@ //@rc::import pgtable_lemmas from refinedc.linux.casestudies.pgtable +//@rc::inlined From refinedc.lang Require Import binary. //@rc::inlined Open Scope bitvec_scope. #include @@ -198,8 +199,8 @@ struct [[rc::refined_by("ops : mm_ops")]] kvm_pgtable_mm_ops { [[rc::parameters("pte : bin")]] [[rc::args("pte @ binary")]] -[[rc::returns("{pte.[valid]} @ boolean")]] -[[rc::trust_me]] +[[rc::returns("{bin_to_bool pte.[valid]} @ boolean")]] +// [[rc::trust_me]] static bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; @@ -207,7 +208,7 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : bin", "level : Z")]] [[rc::args("pte @ binary", "level @ int")]] -[[rc::returns("{if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] then pte.[page_or_table] else false} @ boolean")]] +[[rc::returns("{if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && bin_to_bool pte.[valid] then bin_to_bool pte.[page_or_table] else false} @ boolean")]] [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { @@ -221,7 +222,7 @@ static bool kvm_pte_table(kvm_pte_t pte, u32 level) [[rc::parameters("pte : bin", "p : loc")]] [[rc::args("p @ &own>")]] [[rc::ensures("own p : {pte.[valid := [false]]} @ binary")]] -[[rc::trust_me]] +// [[rc::trust_me]] static void kvm_set_invalid_pte(kvm_pte_t *ptep) { kvm_pte_t pte = *ptep; @@ -231,7 +232,7 @@ static void kvm_set_invalid_pte(kvm_pte_t *ptep) [[rc::parameters("pa : bin")]] [[rc::args("pa @ binary")]] [[rc::returns("{0%%Pte.[addr := pa.[addr]]} @ binary")]] -[[rc::trust_me]] +// [[rc::trust_me]] static kvm_pte_t kvm_phys_to_pte(u64 pa) { kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK; @@ -249,7 +250,7 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) [[rc::exists("pa : Z")]] [[rc::ensures("{ops.(virt_to_phys) va = pa}")]] [[rc::ensures("own p : {0%%Pte.[addr := pa%%Pte.[addr]; page_or_table := [true]; valid := [true]]} @ binary")]] -[[rc::trust_me]] +// [[rc::trust_me]] static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops) { diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 8102823e..2d8bac1c 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -6,281 +6,281 @@ Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) Section code. Definition file_0 : string := "linux/casestudies/pgtable.c". - Definition loc_2 : location_info := LocationInfo file_0 27 1 27 21. - Definition loc_3 : location_info := LocationInfo file_0 27 8 27 20. - Definition loc_4 : location_info := LocationInfo file_0 27 9 27 12. - Definition loc_5 : location_info := LocationInfo file_0 27 16 27 19. - Definition loc_6 : location_info := LocationInfo file_0 27 16 27 19. - Definition loc_9 : location_info := LocationInfo file_0 44 1 44 81. - Definition loc_10 : location_info := LocationInfo file_0 44 8 44 80. - Definition loc_11 : location_info := LocationInfo file_0 44 9 44 36. - Definition loc_12 : location_info := LocationInfo file_0 44 10 44 31. - Definition loc_13 : location_info := LocationInfo file_0 44 10 44 16. - Definition loc_14 : location_info := LocationInfo file_0 44 12 44 15. - Definition loc_15 : location_info := LocationInfo file_0 44 19 44 31. - Definition loc_16 : location_info := LocationInfo file_0 44 20 44 23. - Definition loc_17 : location_info := LocationInfo file_0 44 27 44 30. - Definition loc_18 : location_info := LocationInfo file_0 44 27 44 30. - Definition loc_19 : location_info := LocationInfo file_0 44 34 44 35. - Definition loc_20 : location_info := LocationInfo file_0 44 39 44 79. - Definition loc_21 : location_info := LocationInfo file_0 44 40 44 44. - Definition loc_22 : location_info := LocationInfo file_0 44 41 44 44. - Definition loc_23 : location_info := LocationInfo file_0 44 48 44 78. - Definition loc_24 : location_info := LocationInfo file_0 44 49 44 71. - Definition loc_25 : location_info := LocationInfo file_0 44 49 44 67. - Definition loc_26 : location_info := LocationInfo file_0 44 50 44 62. - Definition loc_27 : location_info := LocationInfo file_0 44 65 44 66. - Definition loc_28 : location_info := LocationInfo file_0 44 70 44 71. - Definition loc_29 : location_info := LocationInfo file_0 44 74 44 77. - Definition loc_30 : location_info := LocationInfo file_0 44 74 44 77. - Definition loc_33 : location_info := LocationInfo file_0 92 1 92 61. - Definition loc_34 : location_info := LocationInfo file_0 92 8 92 60. - Definition loc_35 : location_info := LocationInfo file_0 92 9 92 27. - Definition loc_36 : location_info := LocationInfo file_0 92 10 92 16. - Definition loc_37 : location_info := LocationInfo file_0 92 10 92 16. - Definition loc_38 : location_info := LocationInfo file_0 92 19 92 26. - Definition loc_39 : location_info := LocationInfo file_0 92 19 92 26. - Definition loc_40 : location_info := LocationInfo file_0 92 31 92 59. - Definition loc_41 : location_info := LocationInfo file_0 92 32 92 54. - Definition loc_42 : location_info := LocationInfo file_0 92 32 92 47. - Definition loc_43 : location_info := LocationInfo file_0 92 32 92 47. - Definition loc_44 : location_info := LocationInfo file_0 92 48 92 53. - Definition loc_45 : location_info := LocationInfo file_0 92 48 92 53. - Definition loc_46 : location_info := LocationInfo file_0 92 57 92 58. - Definition loc_49 : location_info := LocationInfo file_0 120 1 120 59. - Definition loc_50 : location_info := LocationInfo file_0 120 8 120 58. - Definition loc_51 : location_info := LocationInfo file_0 120 8 120 48. - Definition loc_52 : location_info := LocationInfo file_0 120 9 120 15. - Definition loc_53 : location_info := LocationInfo file_0 120 9 120 15. - Definition loc_54 : location_info := LocationInfo file_0 120 19 120 47. - Definition loc_55 : location_info := LocationInfo file_0 120 20 120 42. - Definition loc_56 : location_info := LocationInfo file_0 120 20 120 35. - Definition loc_57 : location_info := LocationInfo file_0 120 20 120 35. - Definition loc_58 : location_info := LocationInfo file_0 120 36 120 41. - Definition loc_59 : location_info := LocationInfo file_0 120 36 120 41. - Definition loc_60 : location_info := LocationInfo file_0 120 45 120 46. - Definition loc_61 : location_info := LocationInfo file_0 120 51 120 58. - Definition loc_62 : location_info := LocationInfo file_0 120 51 120 58. - Definition loc_65 : location_info := LocationInfo file_0 205 4 205 24. - Definition loc_66 : location_info := LocationInfo file_0 205 11 205 23. - Definition loc_67 : location_info := LocationInfo file_0 205 11 205 14. - Definition loc_68 : location_info := LocationInfo file_0 205 11 205 14. - Definition loc_69 : location_info := LocationInfo file_0 205 17 205 23. - Definition loc_70 : location_info := LocationInfo file_0 205 17 205 20. - Definition loc_71 : location_info := LocationInfo file_0 205 17 205 20. - Definition loc_72 : location_info := LocationInfo file_0 205 21 205 22. - Definition loc_75 : location_info := LocationInfo file_0 214 4 215 17. - Definition loc_76 : location_info := LocationInfo file_0 216 4 217 17. - Definition loc_77 : location_info := LocationInfo file_0 218 4 218 39. - Definition loc_78 : location_info := LocationInfo file_0 218 11 218 38. - Definition loc_79 : location_info := LocationInfo file_0 218 11 218 33. - Definition loc_80 : location_info := LocationInfo file_0 218 11 218 20. - Definition loc_81 : location_info := LocationInfo file_0 218 11 218 20. - Definition loc_82 : location_info := LocationInfo file_0 218 21 218 27. - Definition loc_83 : location_info := LocationInfo file_0 218 21 218 24. - Definition loc_84 : location_info := LocationInfo file_0 218 21 218 24. - Definition loc_85 : location_info := LocationInfo file_0 218 25 218 26. - Definition loc_86 : location_info := LocationInfo file_0 218 29 218 32. - Definition loc_87 : location_info := LocationInfo file_0 218 29 218 32. - Definition loc_88 : location_info := LocationInfo file_0 218 37 218 38. - Definition loc_89 : location_info := LocationInfo file_0 217 8 217 17. - Definition loc_90 : location_info := LocationInfo file_0 217 15 217 16. - Definition loc_92 : location_info := LocationInfo file_0 216 8 216 27. - Definition loc_94 : location_info := LocationInfo file_0 216 9 216 27. - Definition loc_95 : location_info := LocationInfo file_0 216 9 216 22. - Definition loc_96 : location_info := LocationInfo file_0 216 9 216 22. - Definition loc_97 : location_info := LocationInfo file_0 216 23 216 26. - Definition loc_98 : location_info := LocationInfo file_0 216 23 216 26. - Definition loc_99 : location_info := LocationInfo file_0 215 8 215 17. - Definition loc_100 : location_info := LocationInfo file_0 215 15 215 16. - Definition loc_102 : location_info := LocationInfo file_0 214 8 214 23. - Definition loc_103 : location_info := LocationInfo file_0 214 8 214 13. - Definition loc_104 : location_info := LocationInfo file_0 214 8 214 13. - Definition loc_105 : location_info := LocationInfo file_0 214 17 214 23. - Definition loc_106 : location_info := LocationInfo file_0 214 17 214 19. - Definition loc_107 : location_info := LocationInfo file_0 214 22 214 23. - Definition loc_110 : location_info := LocationInfo file_0 227 4 227 26. - Definition loc_111 : location_info := LocationInfo file_0 228 4 228 32. - Definition loc_112 : location_info := LocationInfo file_0 228 5 228 12. - Definition loc_113 : location_info := LocationInfo file_0 228 7 228 11. - Definition loc_114 : location_info := LocationInfo file_0 228 7 228 11. - Definition loc_115 : location_info := LocationInfo file_0 228 15 228 30. - Definition loc_116 : location_info := LocationInfo file_0 228 16 228 19. - Definition loc_117 : location_info := LocationInfo file_0 228 16 228 19. - Definition loc_118 : location_info := LocationInfo file_0 228 22 228 29. - Definition loc_119 : location_info := LocationInfo file_0 228 23 228 29. - Definition loc_120 : location_info := LocationInfo file_0 228 23 228 26. - Definition loc_121 : location_info := LocationInfo file_0 228 23 228 26. - Definition loc_122 : location_info := LocationInfo file_0 228 27 228 28. - Definition loc_123 : location_info := LocationInfo file_0 227 20 227 25. - Definition loc_124 : location_info := LocationInfo file_0 227 20 227 25. - Definition loc_125 : location_info := LocationInfo file_0 227 21 227 25. - Definition loc_126 : location_info := LocationInfo file_0 227 21 227 25. - Definition loc_131 : location_info := LocationInfo file_0 237 4 237 41. - Definition loc_132 : location_info := LocationInfo file_0 239 4 240 53. - Definition loc_133 : location_info := LocationInfo file_0 242 4 242 15. - Definition loc_134 : location_info := LocationInfo file_0 242 11 242 14. - Definition loc_135 : location_info := LocationInfo file_0 242 11 242 14. - Definition loc_136 : location_info := LocationInfo file_0 240 8 240 53. - Definition loc_137 : location_info := LocationInfo file_0 240 8 240 11. - Definition loc_138 : location_info := LocationInfo file_0 240 8 240 52. - Definition loc_139 : location_info := LocationInfo file_0 240 8 240 11. - Definition loc_140 : location_info := LocationInfo file_0 240 8 240 11. - Definition loc_141 : location_info := LocationInfo file_0 240 15 240 52. - Definition loc_142 : location_info := LocationInfo file_0 240 15 240 25. - Definition loc_143 : location_info := LocationInfo file_0 240 15 240 25. - Definition loc_144 : location_info := LocationInfo file_0 240 26 240 41. - Definition loc_145 : location_info := LocationInfo file_0 240 26 240 33. - Definition loc_146 : location_info := LocationInfo file_0 240 26 240 33. - Definition loc_147 : location_info := LocationInfo file_0 240 34 240 36. - Definition loc_148 : location_info := LocationInfo file_0 240 38 240 40. - Definition loc_149 : location_info := LocationInfo file_0 240 43 240 51. - Definition loc_150 : location_info := LocationInfo file_0 240 43 240 45. - Definition loc_151 : location_info := LocationInfo file_0 240 43 240 45. - Definition loc_152 : location_info := LocationInfo file_0 240 49 240 51. - Definition loc_154 : location_info := LocationInfo file_0 239 8 239 16. - Definition loc_155 : location_info := LocationInfo file_0 239 8 239 10. - Definition loc_156 : location_info := LocationInfo file_0 239 14 239 16. - Definition loc_157 : location_info := LocationInfo file_0 237 20 237 40. - Definition loc_158 : location_info := LocationInfo file_0 237 20 237 22. - Definition loc_159 : location_info := LocationInfo file_0 237 20 237 22. - Definition loc_160 : location_info := LocationInfo file_0 237 25 237 40. - Definition loc_161 : location_info := LocationInfo file_0 237 25 237 32. - Definition loc_162 : location_info := LocationInfo file_0 237 25 237 32. - Definition loc_163 : location_info := LocationInfo file_0 237 33 237 35. - Definition loc_164 : location_info := LocationInfo file_0 237 37 237 39. - Definition loc_169 : location_info := LocationInfo file_0 256 4 256 79. - Definition loc_170 : location_info := LocationInfo file_0 257 4 257 33. - Definition loc_171 : location_info := LocationInfo file_0 258 4 258 18. - Definition loc_172 : location_info := LocationInfo file_0 259 4 259 33. - Definition loc_173 : location_info := LocationInfo file_0 261 1 261 13. - Definition loc_174 : location_info := LocationInfo file_0 261 1 261 6. - Definition loc_175 : location_info := LocationInfo file_0 261 2 261 6. - Definition loc_176 : location_info := LocationInfo file_0 261 2 261 6. - Definition loc_177 : location_info := LocationInfo file_0 261 9 261 12. - Definition loc_178 : location_info := LocationInfo file_0 261 9 261 12. - Definition loc_179 : location_info := LocationInfo file_0 259 12 259 30. - Definition loc_180 : location_info := LocationInfo file_0 259 12 259 25. - Definition loc_181 : location_info := LocationInfo file_0 259 12 259 25. - Definition loc_182 : location_info := LocationInfo file_0 259 26 259 29. - Definition loc_183 : location_info := LocationInfo file_0 259 26 259 29. - Definition loc_184 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_185 : location_info := LocationInfo file_0 258 4 258 17. - Definition loc_186 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_187 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_188 : location_info := LocationInfo file_0 258 11 258 17. - Definition loc_189 : location_info := LocationInfo file_0 258 11 258 14. - Definition loc_190 : location_info := LocationInfo file_0 258 11 258 14. - Definition loc_191 : location_info := LocationInfo file_0 258 15 258 16. - Definition loc_192 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_193 : location_info := LocationInfo file_0 257 4 257 32. - Definition loc_194 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_195 : location_info := LocationInfo file_0 257 4 257 7. - Definition loc_196 : location_info := LocationInfo file_0 257 11 257 32. - Definition loc_197 : location_info := LocationInfo file_0 257 11 257 21. - Definition loc_198 : location_info := LocationInfo file_0 257 11 257 21. - Definition loc_199 : location_info := LocationInfo file_0 257 22 257 28. - Definition loc_200 : location_info := LocationInfo file_0 257 22 257 25. - Definition loc_201 : location_info := LocationInfo file_0 257 22 257 25. - Definition loc_202 : location_info := LocationInfo file_0 257 26 257 27. - Definition loc_203 : location_info := LocationInfo file_0 257 30 257 31. - Definition loc_204 : location_info := LocationInfo file_0 256 33 256 78. - Definition loc_205 : location_info := LocationInfo file_0 256 33 256 48. - Definition loc_206 : location_info := LocationInfo file_0 256 33 256 48. - Definition loc_207 : location_info := LocationInfo file_0 256 49 256 77. - Definition loc_208 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_209 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_210 : location_info := LocationInfo file_0 256 49 256 69. - Definition loc_211 : location_info := LocationInfo file_0 256 49 256 55. - Definition loc_212 : location_info := LocationInfo file_0 256 49 256 55. - Definition loc_213 : location_info := LocationInfo file_0 256 70 256 76. - Definition loc_214 : location_info := LocationInfo file_0 256 70 256 76. - Definition loc_217 : location_info := LocationInfo file_0 256 20 256 25. - Definition loc_218 : location_info := LocationInfo file_0 256 20 256 25. - Definition loc_219 : location_info := LocationInfo file_0 256 21 256 25. - Definition loc_220 : location_info := LocationInfo file_0 256 21 256 25. - Definition loc_225 : location_info := LocationInfo file_0 274 4 274 53. - Definition loc_226 : location_info := LocationInfo file_0 275 4 276 33. - Definition loc_227 : location_info := LocationInfo file_0 277 4 277 53. - Definition loc_228 : location_info := LocationInfo file_0 278 4 278 36. - Definition loc_229 : location_info := LocationInfo file_0 279 4 279 18. - Definition loc_230 : location_info := LocationInfo file_0 281 4 282 26. - Definition loc_231 : location_info := LocationInfo file_0 284 1 284 13. - Definition loc_232 : location_info := LocationInfo file_0 285 4 285 13. - Definition loc_233 : location_info := LocationInfo file_0 285 11 285 12. - Definition loc_234 : location_info := LocationInfo file_0 284 1 284 6. - Definition loc_235 : location_info := LocationInfo file_0 284 2 284 6. - Definition loc_236 : location_info := LocationInfo file_0 284 2 284 6. - Definition loc_237 : location_info := LocationInfo file_0 284 9 284 12. - Definition loc_238 : location_info := LocationInfo file_0 284 9 284 12. - Definition loc_239 : location_info := LocationInfo file_0 282 8 282 26. - Definition loc_240 : location_info := LocationInfo file_0 282 15 282 25. - Definition loc_241 : location_info := LocationInfo file_0 282 15 282 18. - Definition loc_242 : location_info := LocationInfo file_0 282 15 282 18. - Definition loc_243 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_244 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_246 : location_info := LocationInfo file_0 281 8 281 26. - Definition loc_247 : location_info := LocationInfo file_0 281 8 281 21. - Definition loc_248 : location_info := LocationInfo file_0 281 8 281 21. - Definition loc_249 : location_info := LocationInfo file_0 281 22 281 25. - Definition loc_250 : location_info := LocationInfo file_0 281 22 281 25. - Definition loc_251 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_252 : location_info := LocationInfo file_0 279 4 279 17. - Definition loc_253 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_254 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_255 : location_info := LocationInfo file_0 279 11 279 17. - Definition loc_256 : location_info := LocationInfo file_0 279 11 279 14. - Definition loc_257 : location_info := LocationInfo file_0 279 11 279 14. - Definition loc_258 : location_info := LocationInfo file_0 279 15 279 16. - Definition loc_259 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_260 : location_info := LocationInfo file_0 278 4 278 35. - Definition loc_261 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_262 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_263 : location_info := LocationInfo file_0 278 11 278 35. - Definition loc_264 : location_info := LocationInfo file_0 278 11 278 21. - Definition loc_265 : location_info := LocationInfo file_0 278 11 278 21. - Definition loc_266 : location_info := LocationInfo file_0 278 22 278 28. - Definition loc_267 : location_info := LocationInfo file_0 278 22 278 25. - Definition loc_268 : location_info := LocationInfo file_0 278 22 278 25. - Definition loc_269 : location_info := LocationInfo file_0 278 26 278 27. - Definition loc_270 : location_info := LocationInfo file_0 278 30 278 34. - Definition loc_271 : location_info := LocationInfo file_0 278 30 278 34. - Definition loc_272 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_273 : location_info := LocationInfo file_0 277 4 277 52. - Definition loc_274 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_275 : location_info := LocationInfo file_0 277 4 277 7. - Definition loc_276 : location_info := LocationInfo file_0 277 11 277 52. - Definition loc_277 : location_info := LocationInfo file_0 277 11 277 15. - Definition loc_278 : location_info := LocationInfo file_0 277 11 277 15. - Definition loc_279 : location_info := LocationInfo file_0 277 18 277 52. - Definition loc_280 : location_info := LocationInfo file_0 277 19 277 33. - Definition loc_281 : location_info := LocationInfo file_0 277 19 277 26. - Definition loc_282 : location_info := LocationInfo file_0 277 19 277 26. - Definition loc_283 : location_info := LocationInfo file_0 277 27 277 29. - Definition loc_284 : location_info := LocationInfo file_0 277 31 277 32. - Definition loc_285 : location_info := LocationInfo file_0 277 36 277 51. - Definition loc_286 : location_info := LocationInfo file_0 277 36 277 43. - Definition loc_287 : location_info := LocationInfo file_0 277 36 277 43. - Definition loc_288 : location_info := LocationInfo file_0 277 44 277 46. - Definition loc_289 : location_info := LocationInfo file_0 277 48 277 50. - Definition loc_290 : location_info := LocationInfo file_0 275 15 276 32. - Definition loc_291 : location_info := LocationInfo file_0 275 15 275 32. - Definition loc_292 : location_info := LocationInfo file_0 275 16 275 21. - Definition loc_293 : location_info := LocationInfo file_0 275 16 275 21. - Definition loc_294 : location_info := LocationInfo file_0 275 25 275 31. - Definition loc_295 : location_info := LocationInfo file_0 275 25 275 27. - Definition loc_296 : location_info := LocationInfo file_0 275 30 275 31. - Definition loc_297 : location_info := LocationInfo file_0 275 35 275 36. - Definition loc_298 : location_info := LocationInfo file_0 276 31 276 32. - Definition loc_301 : location_info := LocationInfo file_0 274 33 274 52. - Definition loc_302 : location_info := LocationInfo file_0 274 33 274 48. - Definition loc_303 : location_info := LocationInfo file_0 274 33 274 48. - Definition loc_304 : location_info := LocationInfo file_0 274 49 274 51. - Definition loc_305 : location_info := LocationInfo file_0 274 49 274 51. - Definition loc_308 : location_info := LocationInfo file_0 274 20 274 25. - Definition loc_309 : location_info := LocationInfo file_0 274 20 274 25. - Definition loc_310 : location_info := LocationInfo file_0 274 21 274 25. - Definition loc_311 : location_info := LocationInfo file_0 274 21 274 25. + Definition loc_2 : location_info := LocationInfo file_0 28 1 28 21. + Definition loc_3 : location_info := LocationInfo file_0 28 8 28 20. + Definition loc_4 : location_info := LocationInfo file_0 28 9 28 12. + Definition loc_5 : location_info := LocationInfo file_0 28 16 28 19. + Definition loc_6 : location_info := LocationInfo file_0 28 16 28 19. + Definition loc_9 : location_info := LocationInfo file_0 45 1 45 81. + Definition loc_10 : location_info := LocationInfo file_0 45 8 45 80. + Definition loc_11 : location_info := LocationInfo file_0 45 9 45 36. + Definition loc_12 : location_info := LocationInfo file_0 45 10 45 31. + Definition loc_13 : location_info := LocationInfo file_0 45 10 45 16. + Definition loc_14 : location_info := LocationInfo file_0 45 12 45 15. + Definition loc_15 : location_info := LocationInfo file_0 45 19 45 31. + Definition loc_16 : location_info := LocationInfo file_0 45 20 45 23. + Definition loc_17 : location_info := LocationInfo file_0 45 27 45 30. + Definition loc_18 : location_info := LocationInfo file_0 45 27 45 30. + Definition loc_19 : location_info := LocationInfo file_0 45 34 45 35. + Definition loc_20 : location_info := LocationInfo file_0 45 39 45 79. + Definition loc_21 : location_info := LocationInfo file_0 45 40 45 44. + Definition loc_22 : location_info := LocationInfo file_0 45 41 45 44. + Definition loc_23 : location_info := LocationInfo file_0 45 48 45 78. + Definition loc_24 : location_info := LocationInfo file_0 45 49 45 71. + Definition loc_25 : location_info := LocationInfo file_0 45 49 45 67. + Definition loc_26 : location_info := LocationInfo file_0 45 50 45 62. + Definition loc_27 : location_info := LocationInfo file_0 45 65 45 66. + Definition loc_28 : location_info := LocationInfo file_0 45 70 45 71. + Definition loc_29 : location_info := LocationInfo file_0 45 74 45 77. + Definition loc_30 : location_info := LocationInfo file_0 45 74 45 77. + Definition loc_33 : location_info := LocationInfo file_0 93 1 93 61. + Definition loc_34 : location_info := LocationInfo file_0 93 8 93 60. + Definition loc_35 : location_info := LocationInfo file_0 93 9 93 27. + Definition loc_36 : location_info := LocationInfo file_0 93 10 93 16. + Definition loc_37 : location_info := LocationInfo file_0 93 10 93 16. + Definition loc_38 : location_info := LocationInfo file_0 93 19 93 26. + Definition loc_39 : location_info := LocationInfo file_0 93 19 93 26. + Definition loc_40 : location_info := LocationInfo file_0 93 31 93 59. + Definition loc_41 : location_info := LocationInfo file_0 93 32 93 54. + Definition loc_42 : location_info := LocationInfo file_0 93 32 93 47. + Definition loc_43 : location_info := LocationInfo file_0 93 32 93 47. + Definition loc_44 : location_info := LocationInfo file_0 93 48 93 53. + Definition loc_45 : location_info := LocationInfo file_0 93 48 93 53. + Definition loc_46 : location_info := LocationInfo file_0 93 57 93 58. + Definition loc_49 : location_info := LocationInfo file_0 121 1 121 59. + Definition loc_50 : location_info := LocationInfo file_0 121 8 121 58. + Definition loc_51 : location_info := LocationInfo file_0 121 8 121 48. + Definition loc_52 : location_info := LocationInfo file_0 121 9 121 15. + Definition loc_53 : location_info := LocationInfo file_0 121 9 121 15. + Definition loc_54 : location_info := LocationInfo file_0 121 19 121 47. + Definition loc_55 : location_info := LocationInfo file_0 121 20 121 42. + Definition loc_56 : location_info := LocationInfo file_0 121 20 121 35. + Definition loc_57 : location_info := LocationInfo file_0 121 20 121 35. + Definition loc_58 : location_info := LocationInfo file_0 121 36 121 41. + Definition loc_59 : location_info := LocationInfo file_0 121 36 121 41. + Definition loc_60 : location_info := LocationInfo file_0 121 45 121 46. + Definition loc_61 : location_info := LocationInfo file_0 121 51 121 58. + Definition loc_62 : location_info := LocationInfo file_0 121 51 121 58. + Definition loc_65 : location_info := LocationInfo file_0 206 4 206 24. + Definition loc_66 : location_info := LocationInfo file_0 206 11 206 23. + Definition loc_67 : location_info := LocationInfo file_0 206 11 206 14. + Definition loc_68 : location_info := LocationInfo file_0 206 11 206 14. + Definition loc_69 : location_info := LocationInfo file_0 206 17 206 23. + Definition loc_70 : location_info := LocationInfo file_0 206 17 206 20. + Definition loc_71 : location_info := LocationInfo file_0 206 17 206 20. + Definition loc_72 : location_info := LocationInfo file_0 206 21 206 22. + Definition loc_75 : location_info := LocationInfo file_0 215 4 216 17. + Definition loc_76 : location_info := LocationInfo file_0 217 4 218 17. + Definition loc_77 : location_info := LocationInfo file_0 219 4 219 39. + Definition loc_78 : location_info := LocationInfo file_0 219 11 219 38. + Definition loc_79 : location_info := LocationInfo file_0 219 11 219 33. + Definition loc_80 : location_info := LocationInfo file_0 219 11 219 20. + Definition loc_81 : location_info := LocationInfo file_0 219 11 219 20. + Definition loc_82 : location_info := LocationInfo file_0 219 21 219 27. + Definition loc_83 : location_info := LocationInfo file_0 219 21 219 24. + Definition loc_84 : location_info := LocationInfo file_0 219 21 219 24. + Definition loc_85 : location_info := LocationInfo file_0 219 25 219 26. + Definition loc_86 : location_info := LocationInfo file_0 219 29 219 32. + Definition loc_87 : location_info := LocationInfo file_0 219 29 219 32. + Definition loc_88 : location_info := LocationInfo file_0 219 37 219 38. + Definition loc_89 : location_info := LocationInfo file_0 218 8 218 17. + Definition loc_90 : location_info := LocationInfo file_0 218 15 218 16. + Definition loc_92 : location_info := LocationInfo file_0 217 8 217 27. + Definition loc_94 : location_info := LocationInfo file_0 217 9 217 27. + Definition loc_95 : location_info := LocationInfo file_0 217 9 217 22. + Definition loc_96 : location_info := LocationInfo file_0 217 9 217 22. + Definition loc_97 : location_info := LocationInfo file_0 217 23 217 26. + Definition loc_98 : location_info := LocationInfo file_0 217 23 217 26. + Definition loc_99 : location_info := LocationInfo file_0 216 8 216 17. + Definition loc_100 : location_info := LocationInfo file_0 216 15 216 16. + Definition loc_102 : location_info := LocationInfo file_0 215 8 215 23. + Definition loc_103 : location_info := LocationInfo file_0 215 8 215 13. + Definition loc_104 : location_info := LocationInfo file_0 215 8 215 13. + Definition loc_105 : location_info := LocationInfo file_0 215 17 215 23. + Definition loc_106 : location_info := LocationInfo file_0 215 17 215 19. + Definition loc_107 : location_info := LocationInfo file_0 215 22 215 23. + Definition loc_110 : location_info := LocationInfo file_0 228 4 228 26. + Definition loc_111 : location_info := LocationInfo file_0 229 4 229 32. + Definition loc_112 : location_info := LocationInfo file_0 229 5 229 12. + Definition loc_113 : location_info := LocationInfo file_0 229 7 229 11. + Definition loc_114 : location_info := LocationInfo file_0 229 7 229 11. + Definition loc_115 : location_info := LocationInfo file_0 229 15 229 30. + Definition loc_116 : location_info := LocationInfo file_0 229 16 229 19. + Definition loc_117 : location_info := LocationInfo file_0 229 16 229 19. + Definition loc_118 : location_info := LocationInfo file_0 229 22 229 29. + Definition loc_119 : location_info := LocationInfo file_0 229 23 229 29. + Definition loc_120 : location_info := LocationInfo file_0 229 23 229 26. + Definition loc_121 : location_info := LocationInfo file_0 229 23 229 26. + Definition loc_122 : location_info := LocationInfo file_0 229 27 229 28. + Definition loc_123 : location_info := LocationInfo file_0 228 20 228 25. + Definition loc_124 : location_info := LocationInfo file_0 228 20 228 25. + Definition loc_125 : location_info := LocationInfo file_0 228 21 228 25. + Definition loc_126 : location_info := LocationInfo file_0 228 21 228 25. + Definition loc_131 : location_info := LocationInfo file_0 238 4 238 41. + Definition loc_132 : location_info := LocationInfo file_0 240 4 241 53. + Definition loc_133 : location_info := LocationInfo file_0 243 4 243 15. + Definition loc_134 : location_info := LocationInfo file_0 243 11 243 14. + Definition loc_135 : location_info := LocationInfo file_0 243 11 243 14. + Definition loc_136 : location_info := LocationInfo file_0 241 8 241 53. + Definition loc_137 : location_info := LocationInfo file_0 241 8 241 11. + Definition loc_138 : location_info := LocationInfo file_0 241 8 241 52. + Definition loc_139 : location_info := LocationInfo file_0 241 8 241 11. + Definition loc_140 : location_info := LocationInfo file_0 241 8 241 11. + Definition loc_141 : location_info := LocationInfo file_0 241 15 241 52. + Definition loc_142 : location_info := LocationInfo file_0 241 15 241 25. + Definition loc_143 : location_info := LocationInfo file_0 241 15 241 25. + Definition loc_144 : location_info := LocationInfo file_0 241 26 241 41. + Definition loc_145 : location_info := LocationInfo file_0 241 26 241 33. + Definition loc_146 : location_info := LocationInfo file_0 241 26 241 33. + Definition loc_147 : location_info := LocationInfo file_0 241 34 241 36. + Definition loc_148 : location_info := LocationInfo file_0 241 38 241 40. + Definition loc_149 : location_info := LocationInfo file_0 241 43 241 51. + Definition loc_150 : location_info := LocationInfo file_0 241 43 241 45. + Definition loc_151 : location_info := LocationInfo file_0 241 43 241 45. + Definition loc_152 : location_info := LocationInfo file_0 241 49 241 51. + Definition loc_154 : location_info := LocationInfo file_0 240 8 240 16. + Definition loc_155 : location_info := LocationInfo file_0 240 8 240 10. + Definition loc_156 : location_info := LocationInfo file_0 240 14 240 16. + Definition loc_157 : location_info := LocationInfo file_0 238 20 238 40. + Definition loc_158 : location_info := LocationInfo file_0 238 20 238 22. + Definition loc_159 : location_info := LocationInfo file_0 238 20 238 22. + Definition loc_160 : location_info := LocationInfo file_0 238 25 238 40. + Definition loc_161 : location_info := LocationInfo file_0 238 25 238 32. + Definition loc_162 : location_info := LocationInfo file_0 238 25 238 32. + Definition loc_163 : location_info := LocationInfo file_0 238 33 238 35. + Definition loc_164 : location_info := LocationInfo file_0 238 37 238 39. + Definition loc_169 : location_info := LocationInfo file_0 257 4 257 79. + Definition loc_170 : location_info := LocationInfo file_0 258 4 258 33. + Definition loc_171 : location_info := LocationInfo file_0 259 4 259 18. + Definition loc_172 : location_info := LocationInfo file_0 260 4 260 33. + Definition loc_173 : location_info := LocationInfo file_0 262 1 262 13. + Definition loc_174 : location_info := LocationInfo file_0 262 1 262 6. + Definition loc_175 : location_info := LocationInfo file_0 262 2 262 6. + Definition loc_176 : location_info := LocationInfo file_0 262 2 262 6. + Definition loc_177 : location_info := LocationInfo file_0 262 9 262 12. + Definition loc_178 : location_info := LocationInfo file_0 262 9 262 12. + Definition loc_179 : location_info := LocationInfo file_0 260 12 260 30. + Definition loc_180 : location_info := LocationInfo file_0 260 12 260 25. + Definition loc_181 : location_info := LocationInfo file_0 260 12 260 25. + Definition loc_182 : location_info := LocationInfo file_0 260 26 260 29. + Definition loc_183 : location_info := LocationInfo file_0 260 26 260 29. + Definition loc_184 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_185 : location_info := LocationInfo file_0 259 4 259 17. + Definition loc_186 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_187 : location_info := LocationInfo file_0 259 4 259 7. + Definition loc_188 : location_info := LocationInfo file_0 259 11 259 17. + Definition loc_189 : location_info := LocationInfo file_0 259 11 259 14. + Definition loc_190 : location_info := LocationInfo file_0 259 11 259 14. + Definition loc_191 : location_info := LocationInfo file_0 259 15 259 16. + Definition loc_192 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_193 : location_info := LocationInfo file_0 258 4 258 32. + Definition loc_194 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_195 : location_info := LocationInfo file_0 258 4 258 7. + Definition loc_196 : location_info := LocationInfo file_0 258 11 258 32. + Definition loc_197 : location_info := LocationInfo file_0 258 11 258 21. + Definition loc_198 : location_info := LocationInfo file_0 258 11 258 21. + Definition loc_199 : location_info := LocationInfo file_0 258 22 258 28. + Definition loc_200 : location_info := LocationInfo file_0 258 22 258 25. + Definition loc_201 : location_info := LocationInfo file_0 258 22 258 25. + Definition loc_202 : location_info := LocationInfo file_0 258 26 258 27. + Definition loc_203 : location_info := LocationInfo file_0 258 30 258 31. + Definition loc_204 : location_info := LocationInfo file_0 257 33 257 78. + Definition loc_205 : location_info := LocationInfo file_0 257 33 257 48. + Definition loc_206 : location_info := LocationInfo file_0 257 33 257 48. + Definition loc_207 : location_info := LocationInfo file_0 257 49 257 77. + Definition loc_208 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_209 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_210 : location_info := LocationInfo file_0 257 49 257 69. + Definition loc_211 : location_info := LocationInfo file_0 257 49 257 55. + Definition loc_212 : location_info := LocationInfo file_0 257 49 257 55. + Definition loc_213 : location_info := LocationInfo file_0 257 70 257 76. + Definition loc_214 : location_info := LocationInfo file_0 257 70 257 76. + Definition loc_217 : location_info := LocationInfo file_0 257 20 257 25. + Definition loc_218 : location_info := LocationInfo file_0 257 20 257 25. + Definition loc_219 : location_info := LocationInfo file_0 257 21 257 25. + Definition loc_220 : location_info := LocationInfo file_0 257 21 257 25. + Definition loc_225 : location_info := LocationInfo file_0 275 4 275 53. + Definition loc_226 : location_info := LocationInfo file_0 276 4 277 33. + Definition loc_227 : location_info := LocationInfo file_0 278 4 278 53. + Definition loc_228 : location_info := LocationInfo file_0 279 4 279 36. + Definition loc_229 : location_info := LocationInfo file_0 280 4 280 18. + Definition loc_230 : location_info := LocationInfo file_0 282 4 283 26. + Definition loc_231 : location_info := LocationInfo file_0 285 1 285 13. + Definition loc_232 : location_info := LocationInfo file_0 286 4 286 13. + Definition loc_233 : location_info := LocationInfo file_0 286 11 286 12. + Definition loc_234 : location_info := LocationInfo file_0 285 1 285 6. + Definition loc_235 : location_info := LocationInfo file_0 285 2 285 6. + Definition loc_236 : location_info := LocationInfo file_0 285 2 285 6. + Definition loc_237 : location_info := LocationInfo file_0 285 9 285 12. + Definition loc_238 : location_info := LocationInfo file_0 285 9 285 12. + Definition loc_239 : location_info := LocationInfo file_0 283 8 283 26. + Definition loc_240 : location_info := LocationInfo file_0 283 15 283 25. + Definition loc_241 : location_info := LocationInfo file_0 283 15 283 18. + Definition loc_242 : location_info := LocationInfo file_0 283 15 283 18. + Definition loc_243 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_244 : location_info := LocationInfo file_0 283 22 283 25. + Definition loc_246 : location_info := LocationInfo file_0 282 8 282 26. + Definition loc_247 : location_info := LocationInfo file_0 282 8 282 21. + Definition loc_248 : location_info := LocationInfo file_0 282 8 282 21. + Definition loc_249 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_250 : location_info := LocationInfo file_0 282 22 282 25. + Definition loc_251 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_252 : location_info := LocationInfo file_0 280 4 280 17. + Definition loc_253 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_254 : location_info := LocationInfo file_0 280 4 280 7. + Definition loc_255 : location_info := LocationInfo file_0 280 11 280 17. + Definition loc_256 : location_info := LocationInfo file_0 280 11 280 14. + Definition loc_257 : location_info := LocationInfo file_0 280 11 280 14. + Definition loc_258 : location_info := LocationInfo file_0 280 15 280 16. + Definition loc_259 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_260 : location_info := LocationInfo file_0 279 4 279 35. + Definition loc_261 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_262 : location_info := LocationInfo file_0 279 4 279 7. + Definition loc_263 : location_info := LocationInfo file_0 279 11 279 35. + Definition loc_264 : location_info := LocationInfo file_0 279 11 279 21. + Definition loc_265 : location_info := LocationInfo file_0 279 11 279 21. + Definition loc_266 : location_info := LocationInfo file_0 279 22 279 28. + Definition loc_267 : location_info := LocationInfo file_0 279 22 279 25. + Definition loc_268 : location_info := LocationInfo file_0 279 22 279 25. + Definition loc_269 : location_info := LocationInfo file_0 279 26 279 27. + Definition loc_270 : location_info := LocationInfo file_0 279 30 279 34. + Definition loc_271 : location_info := LocationInfo file_0 279 30 279 34. + Definition loc_272 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_273 : location_info := LocationInfo file_0 278 4 278 52. + Definition loc_274 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_275 : location_info := LocationInfo file_0 278 4 278 7. + Definition loc_276 : location_info := LocationInfo file_0 278 11 278 52. + Definition loc_277 : location_info := LocationInfo file_0 278 11 278 15. + Definition loc_278 : location_info := LocationInfo file_0 278 11 278 15. + Definition loc_279 : location_info := LocationInfo file_0 278 18 278 52. + Definition loc_280 : location_info := LocationInfo file_0 278 19 278 33. + Definition loc_281 : location_info := LocationInfo file_0 278 19 278 26. + Definition loc_282 : location_info := LocationInfo file_0 278 19 278 26. + Definition loc_283 : location_info := LocationInfo file_0 278 27 278 29. + Definition loc_284 : location_info := LocationInfo file_0 278 31 278 32. + Definition loc_285 : location_info := LocationInfo file_0 278 36 278 51. + Definition loc_286 : location_info := LocationInfo file_0 278 36 278 43. + Definition loc_287 : location_info := LocationInfo file_0 278 36 278 43. + Definition loc_288 : location_info := LocationInfo file_0 278 44 278 46. + Definition loc_289 : location_info := LocationInfo file_0 278 48 278 50. + Definition loc_290 : location_info := LocationInfo file_0 276 15 277 32. + Definition loc_291 : location_info := LocationInfo file_0 276 15 276 32. + Definition loc_292 : location_info := LocationInfo file_0 276 16 276 21. + Definition loc_293 : location_info := LocationInfo file_0 276 16 276 21. + Definition loc_294 : location_info := LocationInfo file_0 276 25 276 31. + Definition loc_295 : location_info := LocationInfo file_0 276 25 276 27. + Definition loc_296 : location_info := LocationInfo file_0 276 30 276 31. + Definition loc_297 : location_info := LocationInfo file_0 276 35 276 36. + Definition loc_298 : location_info := LocationInfo file_0 277 31 277 32. + Definition loc_301 : location_info := LocationInfo file_0 275 33 275 52. + Definition loc_302 : location_info := LocationInfo file_0 275 33 275 48. + Definition loc_303 : location_info := LocationInfo file_0 275 33 275 48. + Definition loc_304 : location_info := LocationInfo file_0 275 49 275 51. + Definition loc_305 : location_info := LocationInfo file_0 275 49 275 51. + Definition loc_308 : location_info := LocationInfo file_0 275 20 275 25. + Definition loc_309 : location_info := LocationInfo file_0 275 20 275 25. + Definition loc_310 : location_info := LocationInfo file_0 275 21 275 25. + Definition loc_311 : location_info := LocationInfo file_0 275 21 275 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v index 2cdc798b..bfebd564 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v @@ -1 +1,29 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_phys_to_pte. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_phys_to_pte]. *) + Lemma type_kvm_phys_to_pte (global_FIELD_PREP global_GENMASK : loc) : + global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ + global_GENMASK ◁ᵥ global_GENMASK @ function_ptr type_of_GENMASK -∗ + typed_function (impl_kvm_phys_to_pte global_FIELD_PREP global_GENMASK) type_of_kvm_phys_to_pte. + Proof. + Open Scope printing_sugar. + start_function "kvm_phys_to_pte" (pa) => arg_pa local_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_phys_to_pte" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_phys_to_pte". + Qed. +End proof_kvm_phys_to_pte. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v index 2cdc798b..61a5aefa 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v @@ -1 +1,28 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_pte_valid. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_pte_valid]. *) + Lemma type_kvm_pte_valid (global_BIT : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + typed_function (impl_kvm_pte_valid global_BIT) type_of_kvm_pte_valid. + Proof. + Open Scope printing_sugar. + start_function "kvm_pte_valid" (pte) => arg_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_pte_valid" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_pte_valid". + Qed. +End proof_kvm_pte_valid. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v index 2cdc798b..0ee7391a 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v @@ -1 +1,28 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_set_invalid_pte. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_set_invalid_pte]. *) + Lemma type_kvm_set_invalid_pte (global_BIT : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + typed_function (impl_kvm_set_invalid_pte global_BIT) type_of_kvm_set_invalid_pte. + Proof. + Open Scope printing_sugar. + start_function "kvm_set_invalid_pte" ([pte p]) => arg_ptep local_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_set_invalid_pte" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_set_invalid_pte". + Qed. +End proof_kvm_set_invalid_pte. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v index 2cdc798b..3e52e871 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v @@ -1 +1,31 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_set_table_pte. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_set_table_pte]. *) + Lemma type_kvm_set_table_pte (global_BIT global_FIELD_PREP global_kvm_phys_to_pte global_kvm_pte_valid : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + global_FIELD_PREP ◁ᵥ global_FIELD_PREP @ function_ptr type_of_FIELD_PREP -∗ + global_kvm_phys_to_pte ◁ᵥ global_kvm_phys_to_pte @ function_ptr type_of_kvm_phys_to_pte -∗ + global_kvm_pte_valid ◁ᵥ global_kvm_pte_valid @ function_ptr type_of_kvm_pte_valid -∗ + typed_function (impl_kvm_set_table_pte global_BIT global_FIELD_PREP global_kvm_phys_to_pte global_kvm_pte_valid) type_of_kvm_set_table_pte. + Proof. + Open Scope printing_sugar. + start_function "kvm_set_table_pte" ([[[[[p q] o] pte] va] ops]) => arg_ptep arg_childp arg_mm_ops local_old local_pte. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_set_table_pte" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: print_sidecondition_goal "kvm_set_table_pte". + Qed. +End proof_kvm_set_table_pte. diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index d3226f34..ac1be236 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -9,6 +9,7 @@ Section spec. (* Inlined code. *) + From refinedc.lang Require Import binary. Open Scope bitvec_scope. (* Definition of type [kvm_pgtable_mm_ops]. *) @@ -86,12 +87,12 @@ Section spec. (* Specifications for function [kvm_pte_valid]. *) Definition type_of_kvm_pte_valid := fn(∀ pte : bin; (pte @ (binary (u64))); True) - → ∃ () : (), ((pte.[valid]) @ (boolean (bool_it))); True. + → ∃ () : (), ((bin_to_bool pte.[valid]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : bin * Z; (pte @ (binary (u64))), (level @ (int (u32))); True) - → ∃ () : (), ((if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && pte.[valid] then pte.[page_or_table] else false) @ (boolean (bool_it))); True. + → ∃ () : (), ((if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && bin_to_bool pte.[valid] then bin_to_bool pte.[page_or_table] else false) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 56b11d5c..044fe55d 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -1,3 +1,4 @@ +From refinedc.lang Require Import binary. From refinedc.typing Require Import typing. Record mm_ops := { @@ -25,6 +26,11 @@ Global Instance simpl_check_mask N k x y : (λ T, x = Z.to_nat k ∧ y = 1%nat ∧ T). Admitted. *) +Arguments bin_and : simpl never. +Arguments bin_or : simpl never. +Arguments bin_neg : simpl never. +Arguments bin_data : simpl never. +Arguments bin_slice : simpl never. +Arguments bin_update : simpl never. Arguments replicate : simpl never. - -Coercion bin_to_bool : bin >-> bool. +Arguments Z_slice : simpl never. diff --git a/theories/typing/binary.v b/theories/lang/binary.v similarity index 99% rename from theories/typing/binary.v rename to theories/lang/binary.v index fdff85bf..0a3706db 100644 --- a/theories/typing/binary.v +++ b/theories/lang/binary.v @@ -1,6 +1,4 @@ -From refinedc.typing Require Export type. -From refinedc.typing Require Import programs int. -Set Default Proof Using "Type". +From refinedc.lang Require Import base byte int_type val. Section bin. diff --git a/theories/lithium/simpl_binary.v b/theories/lithium/simpl_binary.v new file mode 100644 index 00000000..bb32f453 --- /dev/null +++ b/theories/lithium/simpl_binary.v @@ -0,0 +1,52 @@ +From refinedc.lithium Require Import base simpl_classes infrastructure. +From refinedc.lang Require Import binary. + +(* TODO: is SimplAnd the correct class? *) + +Global Instance simpl_bin_to_bool_mask bv N a k : + SimplAnd (bin_to_bool (bin_and bv (bin_mask N a k)) = + bin_to_bool (bin_slice a k bv)) (λ T, a + k ≤ N ∧ T). +Admitted. + +Global Instance simpl_bin_to_bool_eq_true bv : + SimplAnd (bin_to_bool bv = true) (λ T, bv = [true] ∧ T). +Admitted. + +Global Instance simpl_clear_bits N a k bv : + SimplAnd (bin_and bv (bin_neg (bin_mask N a k)) = + bin_update a k (replicate k false) bv) (λ T, a + k ≤ N ∧ T). +Admitted. + +Global Instance simpl_set_bits N a k bv : + SimplAnd (bin_and bv (bin_mask N a k) = + bin_update a k (bin_slice a k bv) (replicate N false)) (λ T, a + k ≤ N ∧ T). +Admitted. + +Global Instance simpl_or_data N a x bv1 bv2 : + SimplAnd (bin_or bv1 (bin_data N a x) = bin_update a (length x) x bv2) + (λ T, a + length x ≤ N ∧ bin_eq_zero (bin_slice a (length x) bv1) ∧ bv1 = bv2 ∧ T). +Admitted. + +Global Instance simpl_bin_eq_zero_trivial a k N : + SimplAnd (bin_eq_zero (bin_slice a k (Z_slice 0 N 0))) (λ T, T). +Admitted. + +Global Instance simpl_bin_eq_zero_update a k b l x bv : + SimplAnd (bin_eq_zero (bin_slice a k (bin_update b l x bv))) + (λ T, (a + k ≤ b ∨ b + l ≤ a) ∧ bin_eq_zero (bin_slice a k bv) ∧ T). +Admitted. + +Global Instance simpl_bin_eq_zero_or a k b x bv N : + SimplAnd (bin_eq_zero (bin_slice a k (bin_or bv (bin_data N b x)))) + (λ T, b + length x ≤ N ∧ (a + k ≤ b ∨ b + length x ≤ a) ∧ bin_eq_zero (bin_slice a k bv) ∧ T). +Admitted. + + +(* test *) +(* From refinedc.typing.automation Require Import solvers. +Goal ∀ bv1 bv2, + bin_or (bin_or bv1 (bin_mask 64 12 4)) (bin_data 64 0 (replicate 1 true)) = + bin_update 0 1 [true] bv2. +intros. +normalize_and_simpl_goal. +*) diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 6d193a25..6fd8fe59 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -1,5 +1,6 @@ From refinedc.typing Require Export type. -From refinedc.typing Require Import programs binary int. +From refinedc.typing Require Import programs int. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". Record field := @@ -42,10 +43,7 @@ Definition bvec (bt : bitvec_type) : Type := vec bool (bt_length bt). Section bitvec_op. Definition Z_as_bvec (bt : bitvec_type) (n : Z) : bin := - match n with - | 0 => replicate (bt_length bt) false - | _ => Z_slice 0 (bt_length bt) n - end. + Z_slice 0 (bt_length bt) n. Definition bvec_get (bv : bin) (f : field) : bin := bin_slice (field_offset f) (field_len f) bv. @@ -150,12 +148,10 @@ Section programs. Admitted. Lemma subsume_val_int_binary T it v n bv : - (⌜Z_to_bin it n = Some bv⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. - Proof. - iIntros "[% $] ?". iExists _. iFrame. iPureIntro. - by apply Z_to_bin_to_Z. - Qed. - Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it) (bv @ binary it) := + (⌜bv = Z_slice 0 (Z.to_nat (bits_per_int it)) n⌝ ∗ T) + -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. + Admitted. + Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it)%I (bv @ binary it)%I := λ T, i2p (subsume_val_int_binary T it v n bv). Lemma bin_to_bool_spec it bv n : -- GitLab From dcc9dd60e8f0db1f84d646446527776345c4580b Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 26 Apr 2021 14:59:15 +0800 Subject: [PATCH 20/71] finish kvm_pte_table with manual tactics --- linux/casestudies/pgtable.c | 13 +- .../proofs/pgtable/generated_code.v | 424 +++++++++--------- .../pgtable/generated_proof_kvm_phys_to_pte.v | 1 + .../pgtable/generated_proof_kvm_pte_table.v | 35 +- .../pgtable/generated_proof_kvm_pte_valid.v | 1 + .../generated_proof_kvm_set_invalid_pte.v | 1 + .../generated_proof_kvm_set_table_pte.v | 1 + .../proofs/pgtable/generated_spec.v | 6 +- .../proofs/pgtable/pgtable_lemmas.v | 2 +- theories/lang/binary.v | 5 + theories/lithium/simpl_binary.v | 10 + theories/typing/bitvec.v | 2 + 12 files changed, 280 insertions(+), 221 deletions(-) diff --git a/linux/casestudies/pgtable.c b/linux/casestudies/pgtable.c index ec68d980..b294a047 100644 --- a/linux/casestudies/pgtable.c +++ b/linux/casestudies/pgtable.c @@ -1,5 +1,5 @@ //@rc::import pgtable_lemmas from refinedc.linux.casestudies.pgtable -//@rc::inlined From refinedc.lang Require Import binary. +//@rc::import binary from refinedc.lang //@rc::inlined Open Scope bitvec_scope. #include @@ -86,7 +86,7 @@ int __builtin_ffsll (long long x); (((_reg) & (_mask)) >> __bf_shf(_mask)) [[rc::parameters("r : bin", "a : nat", "k : nat")]] [[rc::args("{bin_mask 64 a k} @ binary", "r @ binary")]] -[[rc::returns("{bin_slice a k r ++ replicate (64 - k) false} @ binary")]] +[[rc::returns("{bin_extend 64 (bin_slice a k r)} @ binary")]] [[rc::trust_me]] u64 FIELD_GET(u64 _mask, u64 _reg) { @@ -208,8 +208,13 @@ static bool kvm_pte_valid(kvm_pte_t pte) [[rc::parameters("pte : bin", "level : Z")]] [[rc::args("pte @ binary", "level @ int")]] -[[rc::returns("{if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && bin_to_bool pte.[valid] then bin_to_bool pte.[page_or_table] else false} @ boolean")]] -[[rc::trust_me]] +[[rc::returns("{if bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1) then false \ + else if bool_decide (bin_to_bool pte.[valid] = false) then false \ + else bin_to_bool pte.[page_or_table]} @ boolean")]] +[[rc::tactics("all: repeat case_match.")]] +[[rc::tactics("2: exfalso; apply H5.")]] +[[rc::tactics("all: solve_goal.")]] +// [[rc::trust_me]] static bool kvm_pte_table(kvm_pte_t pte, u32 level) { if (level == KVM_PGTABLE_MAX_LEVELS - 1) diff --git a/linux/casestudies/proofs/pgtable/generated_code.v b/linux/casestudies/proofs/pgtable/generated_code.v index 2d8bac1c..92a4ce69 100644 --- a/linux/casestudies/proofs/pgtable/generated_code.v +++ b/linux/casestudies/proofs/pgtable/generated_code.v @@ -69,218 +69,218 @@ Section code. Definition loc_70 : location_info := LocationInfo file_0 206 17 206 20. Definition loc_71 : location_info := LocationInfo file_0 206 17 206 20. Definition loc_72 : location_info := LocationInfo file_0 206 21 206 22. - Definition loc_75 : location_info := LocationInfo file_0 215 4 216 17. - Definition loc_76 : location_info := LocationInfo file_0 217 4 218 17. - Definition loc_77 : location_info := LocationInfo file_0 219 4 219 39. - Definition loc_78 : location_info := LocationInfo file_0 219 11 219 38. - Definition loc_79 : location_info := LocationInfo file_0 219 11 219 33. - Definition loc_80 : location_info := LocationInfo file_0 219 11 219 20. - Definition loc_81 : location_info := LocationInfo file_0 219 11 219 20. - Definition loc_82 : location_info := LocationInfo file_0 219 21 219 27. - Definition loc_83 : location_info := LocationInfo file_0 219 21 219 24. - Definition loc_84 : location_info := LocationInfo file_0 219 21 219 24. - Definition loc_85 : location_info := LocationInfo file_0 219 25 219 26. - Definition loc_86 : location_info := LocationInfo file_0 219 29 219 32. - Definition loc_87 : location_info := LocationInfo file_0 219 29 219 32. - Definition loc_88 : location_info := LocationInfo file_0 219 37 219 38. - Definition loc_89 : location_info := LocationInfo file_0 218 8 218 17. - Definition loc_90 : location_info := LocationInfo file_0 218 15 218 16. - Definition loc_92 : location_info := LocationInfo file_0 217 8 217 27. - Definition loc_94 : location_info := LocationInfo file_0 217 9 217 27. - Definition loc_95 : location_info := LocationInfo file_0 217 9 217 22. - Definition loc_96 : location_info := LocationInfo file_0 217 9 217 22. - Definition loc_97 : location_info := LocationInfo file_0 217 23 217 26. - Definition loc_98 : location_info := LocationInfo file_0 217 23 217 26. - Definition loc_99 : location_info := LocationInfo file_0 216 8 216 17. - Definition loc_100 : location_info := LocationInfo file_0 216 15 216 16. - Definition loc_102 : location_info := LocationInfo file_0 215 8 215 23. - Definition loc_103 : location_info := LocationInfo file_0 215 8 215 13. - Definition loc_104 : location_info := LocationInfo file_0 215 8 215 13. - Definition loc_105 : location_info := LocationInfo file_0 215 17 215 23. - Definition loc_106 : location_info := LocationInfo file_0 215 17 215 19. - Definition loc_107 : location_info := LocationInfo file_0 215 22 215 23. - Definition loc_110 : location_info := LocationInfo file_0 228 4 228 26. - Definition loc_111 : location_info := LocationInfo file_0 229 4 229 32. - Definition loc_112 : location_info := LocationInfo file_0 229 5 229 12. - Definition loc_113 : location_info := LocationInfo file_0 229 7 229 11. - Definition loc_114 : location_info := LocationInfo file_0 229 7 229 11. - Definition loc_115 : location_info := LocationInfo file_0 229 15 229 30. - Definition loc_116 : location_info := LocationInfo file_0 229 16 229 19. - Definition loc_117 : location_info := LocationInfo file_0 229 16 229 19. - Definition loc_118 : location_info := LocationInfo file_0 229 22 229 29. - Definition loc_119 : location_info := LocationInfo file_0 229 23 229 29. - Definition loc_120 : location_info := LocationInfo file_0 229 23 229 26. - Definition loc_121 : location_info := LocationInfo file_0 229 23 229 26. - Definition loc_122 : location_info := LocationInfo file_0 229 27 229 28. - Definition loc_123 : location_info := LocationInfo file_0 228 20 228 25. - Definition loc_124 : location_info := LocationInfo file_0 228 20 228 25. - Definition loc_125 : location_info := LocationInfo file_0 228 21 228 25. - Definition loc_126 : location_info := LocationInfo file_0 228 21 228 25. - Definition loc_131 : location_info := LocationInfo file_0 238 4 238 41. - Definition loc_132 : location_info := LocationInfo file_0 240 4 241 53. - Definition loc_133 : location_info := LocationInfo file_0 243 4 243 15. - Definition loc_134 : location_info := LocationInfo file_0 243 11 243 14. - Definition loc_135 : location_info := LocationInfo file_0 243 11 243 14. - Definition loc_136 : location_info := LocationInfo file_0 241 8 241 53. - Definition loc_137 : location_info := LocationInfo file_0 241 8 241 11. - Definition loc_138 : location_info := LocationInfo file_0 241 8 241 52. - Definition loc_139 : location_info := LocationInfo file_0 241 8 241 11. - Definition loc_140 : location_info := LocationInfo file_0 241 8 241 11. - Definition loc_141 : location_info := LocationInfo file_0 241 15 241 52. - Definition loc_142 : location_info := LocationInfo file_0 241 15 241 25. - Definition loc_143 : location_info := LocationInfo file_0 241 15 241 25. - Definition loc_144 : location_info := LocationInfo file_0 241 26 241 41. - Definition loc_145 : location_info := LocationInfo file_0 241 26 241 33. - Definition loc_146 : location_info := LocationInfo file_0 241 26 241 33. - Definition loc_147 : location_info := LocationInfo file_0 241 34 241 36. - Definition loc_148 : location_info := LocationInfo file_0 241 38 241 40. - Definition loc_149 : location_info := LocationInfo file_0 241 43 241 51. - Definition loc_150 : location_info := LocationInfo file_0 241 43 241 45. - Definition loc_151 : location_info := LocationInfo file_0 241 43 241 45. - Definition loc_152 : location_info := LocationInfo file_0 241 49 241 51. - Definition loc_154 : location_info := LocationInfo file_0 240 8 240 16. - Definition loc_155 : location_info := LocationInfo file_0 240 8 240 10. - Definition loc_156 : location_info := LocationInfo file_0 240 14 240 16. - Definition loc_157 : location_info := LocationInfo file_0 238 20 238 40. - Definition loc_158 : location_info := LocationInfo file_0 238 20 238 22. - Definition loc_159 : location_info := LocationInfo file_0 238 20 238 22. - Definition loc_160 : location_info := LocationInfo file_0 238 25 238 40. - Definition loc_161 : location_info := LocationInfo file_0 238 25 238 32. - Definition loc_162 : location_info := LocationInfo file_0 238 25 238 32. - Definition loc_163 : location_info := LocationInfo file_0 238 33 238 35. - Definition loc_164 : location_info := LocationInfo file_0 238 37 238 39. - Definition loc_169 : location_info := LocationInfo file_0 257 4 257 79. - Definition loc_170 : location_info := LocationInfo file_0 258 4 258 33. - Definition loc_171 : location_info := LocationInfo file_0 259 4 259 18. - Definition loc_172 : location_info := LocationInfo file_0 260 4 260 33. - Definition loc_173 : location_info := LocationInfo file_0 262 1 262 13. - Definition loc_174 : location_info := LocationInfo file_0 262 1 262 6. - Definition loc_175 : location_info := LocationInfo file_0 262 2 262 6. - Definition loc_176 : location_info := LocationInfo file_0 262 2 262 6. - Definition loc_177 : location_info := LocationInfo file_0 262 9 262 12. - Definition loc_178 : location_info := LocationInfo file_0 262 9 262 12. - Definition loc_179 : location_info := LocationInfo file_0 260 12 260 30. - Definition loc_180 : location_info := LocationInfo file_0 260 12 260 25. - Definition loc_181 : location_info := LocationInfo file_0 260 12 260 25. - Definition loc_182 : location_info := LocationInfo file_0 260 26 260 29. - Definition loc_183 : location_info := LocationInfo file_0 260 26 260 29. - Definition loc_184 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_185 : location_info := LocationInfo file_0 259 4 259 17. - Definition loc_186 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_187 : location_info := LocationInfo file_0 259 4 259 7. - Definition loc_188 : location_info := LocationInfo file_0 259 11 259 17. - Definition loc_189 : location_info := LocationInfo file_0 259 11 259 14. - Definition loc_190 : location_info := LocationInfo file_0 259 11 259 14. - Definition loc_191 : location_info := LocationInfo file_0 259 15 259 16. - Definition loc_192 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_193 : location_info := LocationInfo file_0 258 4 258 32. - Definition loc_194 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_195 : location_info := LocationInfo file_0 258 4 258 7. - Definition loc_196 : location_info := LocationInfo file_0 258 11 258 32. - Definition loc_197 : location_info := LocationInfo file_0 258 11 258 21. - Definition loc_198 : location_info := LocationInfo file_0 258 11 258 21. - Definition loc_199 : location_info := LocationInfo file_0 258 22 258 28. - Definition loc_200 : location_info := LocationInfo file_0 258 22 258 25. - Definition loc_201 : location_info := LocationInfo file_0 258 22 258 25. - Definition loc_202 : location_info := LocationInfo file_0 258 26 258 27. - Definition loc_203 : location_info := LocationInfo file_0 258 30 258 31. - Definition loc_204 : location_info := LocationInfo file_0 257 33 257 78. - Definition loc_205 : location_info := LocationInfo file_0 257 33 257 48. - Definition loc_206 : location_info := LocationInfo file_0 257 33 257 48. - Definition loc_207 : location_info := LocationInfo file_0 257 49 257 77. - Definition loc_208 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_209 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_210 : location_info := LocationInfo file_0 257 49 257 69. - Definition loc_211 : location_info := LocationInfo file_0 257 49 257 55. - Definition loc_212 : location_info := LocationInfo file_0 257 49 257 55. - Definition loc_213 : location_info := LocationInfo file_0 257 70 257 76. - Definition loc_214 : location_info := LocationInfo file_0 257 70 257 76. - Definition loc_217 : location_info := LocationInfo file_0 257 20 257 25. - Definition loc_218 : location_info := LocationInfo file_0 257 20 257 25. - Definition loc_219 : location_info := LocationInfo file_0 257 21 257 25. - Definition loc_220 : location_info := LocationInfo file_0 257 21 257 25. - Definition loc_225 : location_info := LocationInfo file_0 275 4 275 53. - Definition loc_226 : location_info := LocationInfo file_0 276 4 277 33. - Definition loc_227 : location_info := LocationInfo file_0 278 4 278 53. - Definition loc_228 : location_info := LocationInfo file_0 279 4 279 36. - Definition loc_229 : location_info := LocationInfo file_0 280 4 280 18. - Definition loc_230 : location_info := LocationInfo file_0 282 4 283 26. - Definition loc_231 : location_info := LocationInfo file_0 285 1 285 13. - Definition loc_232 : location_info := LocationInfo file_0 286 4 286 13. - Definition loc_233 : location_info := LocationInfo file_0 286 11 286 12. - Definition loc_234 : location_info := LocationInfo file_0 285 1 285 6. - Definition loc_235 : location_info := LocationInfo file_0 285 2 285 6. - Definition loc_236 : location_info := LocationInfo file_0 285 2 285 6. - Definition loc_237 : location_info := LocationInfo file_0 285 9 285 12. - Definition loc_238 : location_info := LocationInfo file_0 285 9 285 12. - Definition loc_239 : location_info := LocationInfo file_0 283 8 283 26. - Definition loc_240 : location_info := LocationInfo file_0 283 15 283 25. - Definition loc_241 : location_info := LocationInfo file_0 283 15 283 18. - Definition loc_242 : location_info := LocationInfo file_0 283 15 283 18. - Definition loc_243 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_244 : location_info := LocationInfo file_0 283 22 283 25. - Definition loc_246 : location_info := LocationInfo file_0 282 8 282 26. - Definition loc_247 : location_info := LocationInfo file_0 282 8 282 21. - Definition loc_248 : location_info := LocationInfo file_0 282 8 282 21. - Definition loc_249 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_250 : location_info := LocationInfo file_0 282 22 282 25. - Definition loc_251 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_252 : location_info := LocationInfo file_0 280 4 280 17. - Definition loc_253 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_254 : location_info := LocationInfo file_0 280 4 280 7. - Definition loc_255 : location_info := LocationInfo file_0 280 11 280 17. - Definition loc_256 : location_info := LocationInfo file_0 280 11 280 14. - Definition loc_257 : location_info := LocationInfo file_0 280 11 280 14. - Definition loc_258 : location_info := LocationInfo file_0 280 15 280 16. - Definition loc_259 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_260 : location_info := LocationInfo file_0 279 4 279 35. - Definition loc_261 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_262 : location_info := LocationInfo file_0 279 4 279 7. - Definition loc_263 : location_info := LocationInfo file_0 279 11 279 35. - Definition loc_264 : location_info := LocationInfo file_0 279 11 279 21. - Definition loc_265 : location_info := LocationInfo file_0 279 11 279 21. - Definition loc_266 : location_info := LocationInfo file_0 279 22 279 28. - Definition loc_267 : location_info := LocationInfo file_0 279 22 279 25. - Definition loc_268 : location_info := LocationInfo file_0 279 22 279 25. - Definition loc_269 : location_info := LocationInfo file_0 279 26 279 27. - Definition loc_270 : location_info := LocationInfo file_0 279 30 279 34. - Definition loc_271 : location_info := LocationInfo file_0 279 30 279 34. - Definition loc_272 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_273 : location_info := LocationInfo file_0 278 4 278 52. - Definition loc_274 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_275 : location_info := LocationInfo file_0 278 4 278 7. - Definition loc_276 : location_info := LocationInfo file_0 278 11 278 52. - Definition loc_277 : location_info := LocationInfo file_0 278 11 278 15. - Definition loc_278 : location_info := LocationInfo file_0 278 11 278 15. - Definition loc_279 : location_info := LocationInfo file_0 278 18 278 52. - Definition loc_280 : location_info := LocationInfo file_0 278 19 278 33. - Definition loc_281 : location_info := LocationInfo file_0 278 19 278 26. - Definition loc_282 : location_info := LocationInfo file_0 278 19 278 26. - Definition loc_283 : location_info := LocationInfo file_0 278 27 278 29. - Definition loc_284 : location_info := LocationInfo file_0 278 31 278 32. - Definition loc_285 : location_info := LocationInfo file_0 278 36 278 51. - Definition loc_286 : location_info := LocationInfo file_0 278 36 278 43. - Definition loc_287 : location_info := LocationInfo file_0 278 36 278 43. - Definition loc_288 : location_info := LocationInfo file_0 278 44 278 46. - Definition loc_289 : location_info := LocationInfo file_0 278 48 278 50. - Definition loc_290 : location_info := LocationInfo file_0 276 15 277 32. - Definition loc_291 : location_info := LocationInfo file_0 276 15 276 32. - Definition loc_292 : location_info := LocationInfo file_0 276 16 276 21. - Definition loc_293 : location_info := LocationInfo file_0 276 16 276 21. - Definition loc_294 : location_info := LocationInfo file_0 276 25 276 31. - Definition loc_295 : location_info := LocationInfo file_0 276 25 276 27. - Definition loc_296 : location_info := LocationInfo file_0 276 30 276 31. - Definition loc_297 : location_info := LocationInfo file_0 276 35 276 36. - Definition loc_298 : location_info := LocationInfo file_0 277 31 277 32. - Definition loc_301 : location_info := LocationInfo file_0 275 33 275 52. - Definition loc_302 : location_info := LocationInfo file_0 275 33 275 48. - Definition loc_303 : location_info := LocationInfo file_0 275 33 275 48. - Definition loc_304 : location_info := LocationInfo file_0 275 49 275 51. - Definition loc_305 : location_info := LocationInfo file_0 275 49 275 51. - Definition loc_308 : location_info := LocationInfo file_0 275 20 275 25. - Definition loc_309 : location_info := LocationInfo file_0 275 20 275 25. - Definition loc_310 : location_info := LocationInfo file_0 275 21 275 25. - Definition loc_311 : location_info := LocationInfo file_0 275 21 275 25. + Definition loc_75 : location_info := LocationInfo file_0 220 4 221 17. + Definition loc_76 : location_info := LocationInfo file_0 222 4 223 17. + Definition loc_77 : location_info := LocationInfo file_0 224 4 224 39. + Definition loc_78 : location_info := LocationInfo file_0 224 11 224 38. + Definition loc_79 : location_info := LocationInfo file_0 224 11 224 33. + Definition loc_80 : location_info := LocationInfo file_0 224 11 224 20. + Definition loc_81 : location_info := LocationInfo file_0 224 11 224 20. + Definition loc_82 : location_info := LocationInfo file_0 224 21 224 27. + Definition loc_83 : location_info := LocationInfo file_0 224 21 224 24. + Definition loc_84 : location_info := LocationInfo file_0 224 21 224 24. + Definition loc_85 : location_info := LocationInfo file_0 224 25 224 26. + Definition loc_86 : location_info := LocationInfo file_0 224 29 224 32. + Definition loc_87 : location_info := LocationInfo file_0 224 29 224 32. + Definition loc_88 : location_info := LocationInfo file_0 224 37 224 38. + Definition loc_89 : location_info := LocationInfo file_0 223 8 223 17. + Definition loc_90 : location_info := LocationInfo file_0 223 15 223 16. + Definition loc_92 : location_info := LocationInfo file_0 222 8 222 27. + Definition loc_94 : location_info := LocationInfo file_0 222 9 222 27. + Definition loc_95 : location_info := LocationInfo file_0 222 9 222 22. + Definition loc_96 : location_info := LocationInfo file_0 222 9 222 22. + Definition loc_97 : location_info := LocationInfo file_0 222 23 222 26. + Definition loc_98 : location_info := LocationInfo file_0 222 23 222 26. + Definition loc_99 : location_info := LocationInfo file_0 221 8 221 17. + Definition loc_100 : location_info := LocationInfo file_0 221 15 221 16. + Definition loc_102 : location_info := LocationInfo file_0 220 8 220 23. + Definition loc_103 : location_info := LocationInfo file_0 220 8 220 13. + Definition loc_104 : location_info := LocationInfo file_0 220 8 220 13. + Definition loc_105 : location_info := LocationInfo file_0 220 17 220 23. + Definition loc_106 : location_info := LocationInfo file_0 220 17 220 19. + Definition loc_107 : location_info := LocationInfo file_0 220 22 220 23. + Definition loc_110 : location_info := LocationInfo file_0 233 4 233 26. + Definition loc_111 : location_info := LocationInfo file_0 234 4 234 32. + Definition loc_112 : location_info := LocationInfo file_0 234 5 234 12. + Definition loc_113 : location_info := LocationInfo file_0 234 7 234 11. + Definition loc_114 : location_info := LocationInfo file_0 234 7 234 11. + Definition loc_115 : location_info := LocationInfo file_0 234 15 234 30. + Definition loc_116 : location_info := LocationInfo file_0 234 16 234 19. + Definition loc_117 : location_info := LocationInfo file_0 234 16 234 19. + Definition loc_118 : location_info := LocationInfo file_0 234 22 234 29. + Definition loc_119 : location_info := LocationInfo file_0 234 23 234 29. + Definition loc_120 : location_info := LocationInfo file_0 234 23 234 26. + Definition loc_121 : location_info := LocationInfo file_0 234 23 234 26. + Definition loc_122 : location_info := LocationInfo file_0 234 27 234 28. + Definition loc_123 : location_info := LocationInfo file_0 233 20 233 25. + Definition loc_124 : location_info := LocationInfo file_0 233 20 233 25. + Definition loc_125 : location_info := LocationInfo file_0 233 21 233 25. + Definition loc_126 : location_info := LocationInfo file_0 233 21 233 25. + Definition loc_131 : location_info := LocationInfo file_0 243 4 243 41. + Definition loc_132 : location_info := LocationInfo file_0 245 4 246 53. + Definition loc_133 : location_info := LocationInfo file_0 248 4 248 15. + Definition loc_134 : location_info := LocationInfo file_0 248 11 248 14. + Definition loc_135 : location_info := LocationInfo file_0 248 11 248 14. + Definition loc_136 : location_info := LocationInfo file_0 246 8 246 53. + Definition loc_137 : location_info := LocationInfo file_0 246 8 246 11. + Definition loc_138 : location_info := LocationInfo file_0 246 8 246 52. + Definition loc_139 : location_info := LocationInfo file_0 246 8 246 11. + Definition loc_140 : location_info := LocationInfo file_0 246 8 246 11. + Definition loc_141 : location_info := LocationInfo file_0 246 15 246 52. + Definition loc_142 : location_info := LocationInfo file_0 246 15 246 25. + Definition loc_143 : location_info := LocationInfo file_0 246 15 246 25. + Definition loc_144 : location_info := LocationInfo file_0 246 26 246 41. + Definition loc_145 : location_info := LocationInfo file_0 246 26 246 33. + Definition loc_146 : location_info := LocationInfo file_0 246 26 246 33. + Definition loc_147 : location_info := LocationInfo file_0 246 34 246 36. + Definition loc_148 : location_info := LocationInfo file_0 246 38 246 40. + Definition loc_149 : location_info := LocationInfo file_0 246 43 246 51. + Definition loc_150 : location_info := LocationInfo file_0 246 43 246 45. + Definition loc_151 : location_info := LocationInfo file_0 246 43 246 45. + Definition loc_152 : location_info := LocationInfo file_0 246 49 246 51. + Definition loc_154 : location_info := LocationInfo file_0 245 8 245 16. + Definition loc_155 : location_info := LocationInfo file_0 245 8 245 10. + Definition loc_156 : location_info := LocationInfo file_0 245 14 245 16. + Definition loc_157 : location_info := LocationInfo file_0 243 20 243 40. + Definition loc_158 : location_info := LocationInfo file_0 243 20 243 22. + Definition loc_159 : location_info := LocationInfo file_0 243 20 243 22. + Definition loc_160 : location_info := LocationInfo file_0 243 25 243 40. + Definition loc_161 : location_info := LocationInfo file_0 243 25 243 32. + Definition loc_162 : location_info := LocationInfo file_0 243 25 243 32. + Definition loc_163 : location_info := LocationInfo file_0 243 33 243 35. + Definition loc_164 : location_info := LocationInfo file_0 243 37 243 39. + Definition loc_169 : location_info := LocationInfo file_0 262 4 262 79. + Definition loc_170 : location_info := LocationInfo file_0 263 4 263 33. + Definition loc_171 : location_info := LocationInfo file_0 264 4 264 18. + Definition loc_172 : location_info := LocationInfo file_0 265 4 265 33. + Definition loc_173 : location_info := LocationInfo file_0 267 1 267 13. + Definition loc_174 : location_info := LocationInfo file_0 267 1 267 6. + Definition loc_175 : location_info := LocationInfo file_0 267 2 267 6. + Definition loc_176 : location_info := LocationInfo file_0 267 2 267 6. + Definition loc_177 : location_info := LocationInfo file_0 267 9 267 12. + Definition loc_178 : location_info := LocationInfo file_0 267 9 267 12. + Definition loc_179 : location_info := LocationInfo file_0 265 12 265 30. + Definition loc_180 : location_info := LocationInfo file_0 265 12 265 25. + Definition loc_181 : location_info := LocationInfo file_0 265 12 265 25. + Definition loc_182 : location_info := LocationInfo file_0 265 26 265 29. + Definition loc_183 : location_info := LocationInfo file_0 265 26 265 29. + Definition loc_184 : location_info := LocationInfo file_0 264 4 264 7. + Definition loc_185 : location_info := LocationInfo file_0 264 4 264 17. + Definition loc_186 : location_info := LocationInfo file_0 264 4 264 7. + Definition loc_187 : location_info := LocationInfo file_0 264 4 264 7. + Definition loc_188 : location_info := LocationInfo file_0 264 11 264 17. + Definition loc_189 : location_info := LocationInfo file_0 264 11 264 14. + Definition loc_190 : location_info := LocationInfo file_0 264 11 264 14. + Definition loc_191 : location_info := LocationInfo file_0 264 15 264 16. + Definition loc_192 : location_info := LocationInfo file_0 263 4 263 7. + Definition loc_193 : location_info := LocationInfo file_0 263 4 263 32. + Definition loc_194 : location_info := LocationInfo file_0 263 4 263 7. + Definition loc_195 : location_info := LocationInfo file_0 263 4 263 7. + Definition loc_196 : location_info := LocationInfo file_0 263 11 263 32. + Definition loc_197 : location_info := LocationInfo file_0 263 11 263 21. + Definition loc_198 : location_info := LocationInfo file_0 263 11 263 21. + Definition loc_199 : location_info := LocationInfo file_0 263 22 263 28. + Definition loc_200 : location_info := LocationInfo file_0 263 22 263 25. + Definition loc_201 : location_info := LocationInfo file_0 263 22 263 25. + Definition loc_202 : location_info := LocationInfo file_0 263 26 263 27. + Definition loc_203 : location_info := LocationInfo file_0 263 30 263 31. + Definition loc_204 : location_info := LocationInfo file_0 262 33 262 78. + Definition loc_205 : location_info := LocationInfo file_0 262 33 262 48. + Definition loc_206 : location_info := LocationInfo file_0 262 33 262 48. + Definition loc_207 : location_info := LocationInfo file_0 262 49 262 77. + Definition loc_208 : location_info := LocationInfo file_0 262 49 262 69. + Definition loc_209 : location_info := LocationInfo file_0 262 49 262 69. + Definition loc_210 : location_info := LocationInfo file_0 262 49 262 69. + Definition loc_211 : location_info := LocationInfo file_0 262 49 262 55. + Definition loc_212 : location_info := LocationInfo file_0 262 49 262 55. + Definition loc_213 : location_info := LocationInfo file_0 262 70 262 76. + Definition loc_214 : location_info := LocationInfo file_0 262 70 262 76. + Definition loc_217 : location_info := LocationInfo file_0 262 20 262 25. + Definition loc_218 : location_info := LocationInfo file_0 262 20 262 25. + Definition loc_219 : location_info := LocationInfo file_0 262 21 262 25. + Definition loc_220 : location_info := LocationInfo file_0 262 21 262 25. + Definition loc_225 : location_info := LocationInfo file_0 280 4 280 53. + Definition loc_226 : location_info := LocationInfo file_0 281 4 282 33. + Definition loc_227 : location_info := LocationInfo file_0 283 4 283 53. + Definition loc_228 : location_info := LocationInfo file_0 284 4 284 36. + Definition loc_229 : location_info := LocationInfo file_0 285 4 285 18. + Definition loc_230 : location_info := LocationInfo file_0 287 4 288 26. + Definition loc_231 : location_info := LocationInfo file_0 290 1 290 13. + Definition loc_232 : location_info := LocationInfo file_0 291 4 291 13. + Definition loc_233 : location_info := LocationInfo file_0 291 11 291 12. + Definition loc_234 : location_info := LocationInfo file_0 290 1 290 6. + Definition loc_235 : location_info := LocationInfo file_0 290 2 290 6. + Definition loc_236 : location_info := LocationInfo file_0 290 2 290 6. + Definition loc_237 : location_info := LocationInfo file_0 290 9 290 12. + Definition loc_238 : location_info := LocationInfo file_0 290 9 290 12. + Definition loc_239 : location_info := LocationInfo file_0 288 8 288 26. + Definition loc_240 : location_info := LocationInfo file_0 288 15 288 25. + Definition loc_241 : location_info := LocationInfo file_0 288 15 288 18. + Definition loc_242 : location_info := LocationInfo file_0 288 15 288 18. + Definition loc_243 : location_info := LocationInfo file_0 288 22 288 25. + Definition loc_244 : location_info := LocationInfo file_0 288 22 288 25. + Definition loc_246 : location_info := LocationInfo file_0 287 8 287 26. + Definition loc_247 : location_info := LocationInfo file_0 287 8 287 21. + Definition loc_248 : location_info := LocationInfo file_0 287 8 287 21. + Definition loc_249 : location_info := LocationInfo file_0 287 22 287 25. + Definition loc_250 : location_info := LocationInfo file_0 287 22 287 25. + Definition loc_251 : location_info := LocationInfo file_0 285 4 285 7. + Definition loc_252 : location_info := LocationInfo file_0 285 4 285 17. + Definition loc_253 : location_info := LocationInfo file_0 285 4 285 7. + Definition loc_254 : location_info := LocationInfo file_0 285 4 285 7. + Definition loc_255 : location_info := LocationInfo file_0 285 11 285 17. + Definition loc_256 : location_info := LocationInfo file_0 285 11 285 14. + Definition loc_257 : location_info := LocationInfo file_0 285 11 285 14. + Definition loc_258 : location_info := LocationInfo file_0 285 15 285 16. + Definition loc_259 : location_info := LocationInfo file_0 284 4 284 7. + Definition loc_260 : location_info := LocationInfo file_0 284 4 284 35. + Definition loc_261 : location_info := LocationInfo file_0 284 4 284 7. + Definition loc_262 : location_info := LocationInfo file_0 284 4 284 7. + Definition loc_263 : location_info := LocationInfo file_0 284 11 284 35. + Definition loc_264 : location_info := LocationInfo file_0 284 11 284 21. + Definition loc_265 : location_info := LocationInfo file_0 284 11 284 21. + Definition loc_266 : location_info := LocationInfo file_0 284 22 284 28. + Definition loc_267 : location_info := LocationInfo file_0 284 22 284 25. + Definition loc_268 : location_info := LocationInfo file_0 284 22 284 25. + Definition loc_269 : location_info := LocationInfo file_0 284 26 284 27. + Definition loc_270 : location_info := LocationInfo file_0 284 30 284 34. + Definition loc_271 : location_info := LocationInfo file_0 284 30 284 34. + Definition loc_272 : location_info := LocationInfo file_0 283 4 283 7. + Definition loc_273 : location_info := LocationInfo file_0 283 4 283 52. + Definition loc_274 : location_info := LocationInfo file_0 283 4 283 7. + Definition loc_275 : location_info := LocationInfo file_0 283 4 283 7. + Definition loc_276 : location_info := LocationInfo file_0 283 11 283 52. + Definition loc_277 : location_info := LocationInfo file_0 283 11 283 15. + Definition loc_278 : location_info := LocationInfo file_0 283 11 283 15. + Definition loc_279 : location_info := LocationInfo file_0 283 18 283 52. + Definition loc_280 : location_info := LocationInfo file_0 283 19 283 33. + Definition loc_281 : location_info := LocationInfo file_0 283 19 283 26. + Definition loc_282 : location_info := LocationInfo file_0 283 19 283 26. + Definition loc_283 : location_info := LocationInfo file_0 283 27 283 29. + Definition loc_284 : location_info := LocationInfo file_0 283 31 283 32. + Definition loc_285 : location_info := LocationInfo file_0 283 36 283 51. + Definition loc_286 : location_info := LocationInfo file_0 283 36 283 43. + Definition loc_287 : location_info := LocationInfo file_0 283 36 283 43. + Definition loc_288 : location_info := LocationInfo file_0 283 44 283 46. + Definition loc_289 : location_info := LocationInfo file_0 283 48 283 50. + Definition loc_290 : location_info := LocationInfo file_0 281 15 282 32. + Definition loc_291 : location_info := LocationInfo file_0 281 15 281 32. + Definition loc_292 : location_info := LocationInfo file_0 281 16 281 21. + Definition loc_293 : location_info := LocationInfo file_0 281 16 281 21. + Definition loc_294 : location_info := LocationInfo file_0 281 25 281 31. + Definition loc_295 : location_info := LocationInfo file_0 281 25 281 27. + Definition loc_296 : location_info := LocationInfo file_0 281 30 281 31. + Definition loc_297 : location_info := LocationInfo file_0 281 35 281 36. + Definition loc_298 : location_info := LocationInfo file_0 282 31 282 32. + Definition loc_301 : location_info := LocationInfo file_0 280 33 280 52. + Definition loc_302 : location_info := LocationInfo file_0 280 33 280 48. + Definition loc_303 : location_info := LocationInfo file_0 280 33 280 48. + Definition loc_304 : location_info := LocationInfo file_0 280 49 280 51. + Definition loc_305 : location_info := LocationInfo file_0 280 49 280 51. + Definition loc_308 : location_info := LocationInfo file_0 280 20 280 25. + Definition loc_309 : location_info := LocationInfo file_0 280 20 280 25. + Definition loc_310 : location_info := LocationInfo file_0 280 21 280 25. + Definition loc_311 : location_info := LocationInfo file_0 280 21 280 25. (* Definition of struct [kvm_pgtable_mm_ops]. *) Program Definition struct_kvm_pgtable_mm_ops := {| diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v index bfebd564..c8432896 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_phys_to_pte.v @@ -2,6 +2,7 @@ From refinedc.typing Require Import typing. From refinedc.linux.casestudies.pgtable Require Import generated_code. From refinedc.linux.casestudies.pgtable Require Import generated_spec. From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v index 2cdc798b..70929d10 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_table.v @@ -1 +1,34 @@ -(* Let's skip that, you seem to have some faith. *) +From refinedc.typing Require Import typing. +From refinedc.linux.casestudies.pgtable Require Import generated_code. +From refinedc.linux.casestudies.pgtable Require Import generated_spec. +From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. +Set Default Proof Using "Type". + +(* Generated from [linux/casestudies/pgtable.c]. *) +Section proof_kvm_pte_table. + Context `{!typeG Σ} `{!globalG Σ}. + + (* Typing proof for [kvm_pte_table]. *) + Lemma type_kvm_pte_table (global_BIT global_FIELD_GET global_kvm_pte_valid : loc) : + global_BIT ◁ᵥ global_BIT @ function_ptr type_of_BIT -∗ + global_FIELD_GET ◁ᵥ global_FIELD_GET @ function_ptr type_of_FIELD_GET -∗ + global_kvm_pte_valid ◁ᵥ global_kvm_pte_valid @ function_ptr type_of_kvm_pte_valid -∗ + typed_function (impl_kvm_pte_table global_BIT global_FIELD_GET global_kvm_pte_valid) type_of_kvm_pte_table. + Proof. + Open Scope printing_sugar. + start_function "kvm_pte_table" ([pte level]) => arg_pte arg_level. + split_blocks (( + ∅ + )%I : gmap label (iProp Σ)) (( + ∅ + )%I : gmap label (iProp Σ)). + - repeat liRStep; liShow. + all: print_typesystem_goal "kvm_pte_table" "#0". + Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook. + all: repeat case_match. + 2: exfalso; apply H5. + all: solve_goal. + all: print_sidecondition_goal "kvm_pte_table". + Qed. +End proof_kvm_pte_table. diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v index 61a5aefa..fa1d5c08 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_pte_valid.v @@ -2,6 +2,7 @@ From refinedc.typing Require Import typing. From refinedc.linux.casestudies.pgtable Require Import generated_code. From refinedc.linux.casestudies.pgtable Require Import generated_spec. From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v index 0ee7391a..84b23c05 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_invalid_pte.v @@ -2,6 +2,7 @@ From refinedc.typing Require Import typing. From refinedc.linux.casestudies.pgtable Require Import generated_code. From refinedc.linux.casestudies.pgtable Require Import generated_spec. From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) diff --git a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v index 3e52e871..21b03a01 100644 --- a/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v +++ b/linux/casestudies/proofs/pgtable/generated_proof_kvm_set_table_pte.v @@ -2,6 +2,7 @@ From refinedc.typing Require Import typing. From refinedc.linux.casestudies.pgtable Require Import generated_code. From refinedc.linux.casestudies.pgtable Require Import generated_spec. From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) diff --git a/linux/casestudies/proofs/pgtable/generated_spec.v b/linux/casestudies/proofs/pgtable/generated_spec.v index ac1be236..76d55b60 100644 --- a/linux/casestudies/proofs/pgtable/generated_spec.v +++ b/linux/casestudies/proofs/pgtable/generated_spec.v @@ -1,6 +1,7 @@ From refinedc.typing Require Import typing. From refinedc.linux.casestudies.pgtable Require Import generated_code. From refinedc.linux.casestudies.pgtable Require Import pgtable_lemmas. +From refinedc.lang Require Import binary. Set Default Proof Using "Type". (* Generated from [linux/casestudies/pgtable.c]. *) @@ -9,7 +10,6 @@ Section spec. (* Inlined code. *) - From refinedc.lang Require Import binary. Open Scope bitvec_scope. (* Definition of type [kvm_pgtable_mm_ops]. *) @@ -77,7 +77,7 @@ Section spec. (* Specifications for function [FIELD_GET]. *) Definition type_of_FIELD_GET := fn(∀ (r, a, k) : bin * nat * nat; ((bin_mask 64 a k) @ (binary (u64))), (r @ (binary (u64))); True) - → ∃ () : (), ((bin_slice a k r ++ replicate (64 - k) false) @ (binary (u64))); True. + → ∃ () : (), ((bin_extend 64 (bin_slice a k r)) @ (binary (u64))); True. (* Specifications for function [FIELD_PREP]. *) Definition type_of_FIELD_PREP := @@ -92,7 +92,7 @@ Section spec. (* Specifications for function [kvm_pte_table]. *) Definition type_of_kvm_pte_table := fn(∀ (pte, level) : bin * Z; (pte @ (binary (u64))), (level @ (int (u32))); True) - → ∃ () : (), ((if bool_decide (level <> KVM_PGTABLE_MAX_LEVELS - 1) && bin_to_bool pte.[valid] then bin_to_bool pte.[page_or_table] else false) @ (boolean (bool_it))); True. + → ∃ () : (), ((if bool_decide (level = KVM_PGTABLE_MAX_LEVELS - 1) then false else if bool_decide (bin_to_bool pte.[valid] = false) then false else bin_to_bool pte.[page_or_table]) @ (boolean (bool_it))); True. (* Specifications for function [kvm_set_invalid_pte]. *) Definition type_of_kvm_set_invalid_pte := diff --git a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v index 044fe55d..b62c1f13 100644 --- a/linux/casestudies/proofs/pgtable/pgtable_lemmas.v +++ b/linux/casestudies/proofs/pgtable/pgtable_lemmas.v @@ -32,5 +32,5 @@ Arguments bin_neg : simpl never. Arguments bin_data : simpl never. Arguments bin_slice : simpl never. Arguments bin_update : simpl never. -Arguments replicate : simpl never. +Arguments bin_to_Z : simpl never. Arguments Z_slice : simpl never. diff --git a/theories/lang/binary.v b/theories/lang/binary.v index 0a3706db..f1442c53 100644 --- a/theories/lang/binary.v +++ b/theories/lang/binary.v @@ -9,6 +9,11 @@ Section bin. Definition bin_to_bool (v : bin) : bool := negb (bool_decide (bin_eq_zero v)). + Definition bin_extend (k : nat) (bv : bin) : bin := + if bool_decide (k ≤ length bv) + then bv + else bv ++ replicate (k - length bv) false. + Declare Scope bin_scope. Definition bin_and (lhs rhs : bin) : bin := zip_with (&&) lhs rhs. diff --git a/theories/lithium/simpl_binary.v b/theories/lithium/simpl_binary.v index bb32f453..76d71b82 100644 --- a/theories/lithium/simpl_binary.v +++ b/theories/lithium/simpl_binary.v @@ -12,6 +12,16 @@ Global Instance simpl_bin_to_bool_eq_true bv : SimplAnd (bin_to_bool bv = true) (λ T, bv = [true] ∧ T). Admitted. +Global Instance simpl_bin_to_1 it bv1 bv2 : + SimplAnd (bool_decide (bin_to_Z it bv1 = Some 1%Z) = bin_to_bool bv2) + (λ T, bin_to_bool bv1 = bin_to_bool bv2 ∧ T). +Admitted. + +Global Instance simpl_bin_to_bool_eq_extend k bv : + SimplBothRel (=) (bin_to_bool (bin_extend k bv)) + (bin_to_bool bv) (True). +Admitted. + Global Instance simpl_clear_bits N a k bv : SimplAnd (bin_and bv (bin_neg (bin_mask N a k)) = bin_update a k (replicate k false) bv) (λ T, a + k ≤ N ∧ T). diff --git a/theories/typing/bitvec.v b/theories/typing/bitvec.v index 6fd8fe59..87495fe7 100644 --- a/theories/typing/bitvec.v +++ b/theories/typing/bitvec.v @@ -150,6 +150,8 @@ Section programs. Lemma subsume_val_int_binary T it v n bv : (⌜bv = Z_slice 0 (Z.to_nat (bits_per_int it)) n⌝ ∗ T) -∗ subsume (v ◁ᵥ n @ int it) (v ◁ᵥ bv @ binary it) T. + Proof. + iIntros "[% $] Hv". iExists _. iFrame "Hv". iPureIntro. Admitted. Global Instance subsume_val_int_binary_inst it v n bv : SubsumeVal v (n @ int it)%I (bv @ binary it)%I := λ T, i2p (subsume_val_int_binary T it v n bv). -- GitLab From b050