Goal forall mu Etgt Esrc m2 m2' (WD: SM_wd mu) m1
(TgtHyp: forall b ofs, Etgt b ofs = true ->
(Mem.valid_block m2 b /\
(locBlocksTgt mu b = false ->
exists b1 delta1, foreign_of mu b1 = Some(b,delta1) /\
Esrc b1 (ofs-delta1) = true /\ Mem.perm m1 b1 (ofs-delta1) Max Nonempty)))
(Unch2: Mem.unchanged_on (fun b z => Etgt b z = false) m2 m2')
(*(SrcHyp: forall b ofs, Esrc b ofs = true -> vis mu b = true)*)
nu (WDnu: SM_wd nu)
(X1: forall b, locBlocksTgt nu b = true -> locBlocksTgt mu b = false)
(X2: forall b1 b2 d, foreign_of mu b1 = Some(b2, d) ->
locBlocksSrc nu b1 || locBlocksTgt nu b2 = true ->
pub_of nu b1 = Some(b2,d)),
Mem.unchanged_on (fun b2 z => locBlocksTgt nu b2 = true /\
forall b1 d, (as_inj nu) b1 = Some (b2,d) ->
loc_out_of_bounds m1 b1 (z-d)) m2 m2'.

(* Specifications: *)
Lemma FreeEffect_validblock: forall m lo hi sp b ofs
(EFF: FreeEffect m lo hi sp b ofs = true),
Mem.valid_block m b.
Lemma FreelistEffect_validblock: forall l m b ofs
(EFF: FreelistEffect m l b ofs = true),
Mem.valid_block m b.
Lemma StoreEffectD: forall vaddr v b ofs
(STE: StoreEffect vaddr v b ofs = true),
exists i, vaddr = Vptr b i /\
(Int.unsigned i) <= ofs < (Int.unsigned i + Z.of_nat (length v)).
Lemma StoreEffect_PropagateLeft: forall chunk m vaddr v m'
(ST: Mem.storev chunk m vaddr v = Some m')
mu m2 (WD: SM_wd mu) (INJ : Mem.inject (as_inj mu) m m2)
vaddr'
(VINJ : val_inject (restrict (as_inj mu) (vis mu)) vaddr vaddr')
v' m2' (ST2: Mem.storev chunk m2 vaddr' v' = Some m2')
b2 ofs
(EFF : StoreEffect vaddr' (encode_val chunk v') b2 ofs = true)
(LBT2: locBlocksTgt mu b2 = false),
exists b1 delta, foreign_of mu b1 = Some (b2, delta) /\
StoreEffect vaddr (encode_val chunk v) b1 (ofs - delta) = true /\
Mem.perm m b1 (ofs - delta) Max Nonempty.
Lemma free_free_inject : forall f m1 m1' m2 b1 lo hi b2 d m2'
(INJ: Mem.inject f m1 m2)
(FREE1: Mem.free m1 b1 lo hi = Some m1')
(FREE2: Mem.free m2 b2 (lo+d) (hi+d) = Some m2')
(B: f b1 = Some(b2,d)),
Mem.inject f m1' m2'.
Lemma free_free_inject_same_block : forall f m1 m1' m2 b lo hi m2'
(INJ: Mem.inject f m1 m2)
(FREE1: Mem.free m1 b lo hi = Some m1')
(FREE2: Mem.free m2 b lo hi = Some m2')
(B: f b = Some(b,0)),
Mem.inject f m1' m2'.