(** [True] whenever some resource in [tp] has above [Readable] lock-permission on [laddr]*)
(* I could not prove the stronger version, where quantification happens inside each case*)
Definition isLock tp laddr :=
forall ofs, Intv.In ofs (laddr.2, laddr.2 + lksize.LKSIZE)%Z ->
(exists i (cnti: containsThread tp i),
Mem.perm_order'' ((getThreadR cnti).2 !! (laddr.1) ofs) (Some Readable)) \/
(exists laddr' rmap, lockRes tp laddr' = Some rmap /\
Mem.perm_order'' (rmap.2 !! (laddr.1) ofs) (Some Readable)).

(** If no freelock event is generated by a step, locks are preserved*)
Lemma remLockRes_Freelock:
forall i U tr tr' tp m tp' m' addr
(Hlock: lockRes tp addr)
(HisLock: isLock tp addr)
(Hstep: MachStep (i :: U, tr, tp) m
(U, tr ++ tr', tp') m')
(Hev: forall u ev, nth_error tr' u = Some ev ->
action ev <> Freelock \/
location ev <> Some (addr, lksize.LKSIZE_nat)),
lockRes tp' addr /\
isLock tp' addr.