@@ -243,15 +243,19 @@ int kal_exec_map_part(void* region, kal_uintptr offset, kal_uintptr size, kal_fi
243243 const int fd = okm::unpack (f.h );
244244 if (region == nullptr || size == 0 || fd < 0 || (offset & (g - 1 )) != 0 || (size & (g - 1 )) != 0
245245 || (reinterpret_cast <okm_uptr>(region) & (g - 1 )) != 0 || at % KAL_MAP_ALIGNMENT != 0
246- || (how & ~(KAL_EXEC_MAP_EXECUTE | KAL_EXEC_MAP_PREFETCH | KAL_EXEC_MAP_BTI )) != 0 )
246+ || (how & ~(KAL_EXEC_MAP_EXECUTE | KAL_EXEC_MAP_PREFETCH | KAL_EXEC_MAP_BTI | KAL_EXEC_MAP_WRITE )) != 0
247+ || ((how & KAL_EXEC_MAP_WRITE ) && (how & KAL_EXEC_MAP_EXECUTE )))
247248 return kal_err_invalid;
248249 okm::kstat64 st{};
249250 const okm_long s = okm::sys (okm::nr_fstat64, fd, reinterpret_cast <okm_long>(&st));
250251 if (okm::failed (s)) return okm::translate (s);
251252 if ((okm::stat_mode (st) & okm::s_ifmt) != okm::s_ifreg) return kal_err_not_supported;
252253 const kal_u64 length = st.size > 0 ? static_cast <kal_u64>(st.size ) : 0 ;
253254 if (at > length || static_cast <kal_u64>(size) > length - at) return kal_err_invalid;
254- const okm_long prot = okm::prot_read | ((how & KAL_EXEC_MAP_EXECUTE ) ? okm::prot_exec : 0 );
255+ // WRITTEN PRIVATELY (0.23): a private mapping, so a page written is the
256+ // program's own copy.
257+ const okm_long prot = okm::prot_read | ((how & KAL_EXEC_MAP_EXECUTE ) ? okm::prot_exec : 0 )
258+ | ((how & KAL_EXEC_MAP_WRITE ) ? okm::prot_write : 0 );
255259 const okm_long r = okm::sys (okm::nr_mmap,
256260 reinterpret_cast <okm_long>(static_cast <char *>(region) + offset),
257261 static_cast <okm_long>(size), prot, okm::map_private | okm::map_fixed, fd,
0 commit comments