(** ** Memory invariants *)
(** A stack location is private if it is not the image of a valid location and we have full rights on it. *)
Definition loc_private (F: meminj) (m m': mem) (sp: block) (ofs: Z) : Prop :=
Mem.perm m' sp ofs Cur Freeable /\
(forall b delta, F b = Some(sp, delta) -> ~Mem.perm m b (ofs - delta) Max Nonempty).
(** Likewise, for a range of locations. *)
Definition range_private (F: meminj) (m m': mem) (sp: block) (lo hi: Z) : Prop :=
forall ofs, lo <= ofs < hi -> loc_private F m m' sp ofs.

Lemma range_private_extcall:
forall F F' m1 m2 m1' m2' sp base hi,
range_private F m1 m1' sp base hi ->
(forall b ofs p,
Mem.valid_block m1 b -> Mem.perm m2 b ofs Max p -> Mem.perm m1 b ofs Max p) ->
Mem.unchanged_on (loc_out_of_reach F m1) m1' m2' ->
Mem.inject F m1 m1' ->
inject_incr F F' ->
inject_separated F F' m1 m1' ->
Mem.valid_block m1' sp ->
range_private F' m2 m2' sp base hi.