26#include "gdbsupport/gdb_sys_time.h"
44 std::vector<memory_write_request> *result,
48 ULONGEST claimed_begin;
61 if (
end != 0 &&
end <= r.begin)
64 claimed_begin = std::max (
begin, r.begin);
68 claimed_end = std::min (
end, r.end);
70 if (claimed_begin == r.begin && claimed_end == r.end)
71 result->push_back (r);
76 n.
begin = claimed_begin;
78 n.
data += claimed_begin - r.begin;
80 result->push_back (n);
91 std::vector<memory_write_request> *regular_blocks,
92 std::vector<memory_write_request> *flash_blocks)
95 CORE_ADDR cur_address;
108 std::vector<memory_write_request> *r;
112 cur_address = region->
hi;
115 if (cur_address == 0)
130 CORE_ADDR offset_in_region;
136 offset_in_region = address - region->
lo;
139 *begin = region->
lo + offset_in_region / blocksize * blocksize;
141 *end = region->
lo + (offset_in_region + blocksize - 1) / blocksize * blocksize;
148static std::vector<memory_write_request>
151 std::vector<memory_write_request> result;
155 CORE_ADDR begin, end;
160 if (!result.empty () && result.back ().end >= begin)
161 result.back ().end = end;
163 result.emplace_back (begin, end);
175static std::vector<memory_write_request>
177 const std::vector<memory_write_request> &written_blocks)
179 std::vector<memory_write_request> result;
182 unsigned je = written_blocks.size ();
197 for (j = 0; j != je;)
216 result.push_back (erased);
223 && written->
end >= erased.
end)
233 result.emplace_back (erased.
begin, written->
begin);
242 if (written->
end < erased.
end)
252 result.push_back (erased);
264 void (*progress_cb) (ULONGEST,
void *))
266 std::vector<memory_write_request> blocks = requests;
267 std::vector<memory_write_request> regular;
268 std::vector<memory_write_request> flash;
269 std::vector<memory_write_request> erased, garbled;
277 gdb_assert (iter.end != 0);
298 std::vector<gdb::unique_xmalloc_ptr<gdb_byte>> mem_holders;
299 if (!garbled.empty ())
307 gdb_assert (iter.data == NULL);
308 gdb::unique_xmalloc_ptr<gdb_byte> holder
309 ((gdb_byte *)
xmalloc (iter.end - iter.begin));
310 iter.data = holder.get ();
311 mem_holders.push_back (std::move (holder));
313 iter.end - iter.begin);
317 flash.push_back (iter);
320 std::sort (flash.begin (), flash.end (),
341 iter.data, iter.begin,
342 iter.end - iter.begin,
343 progress_cb, iter.baton);
344 if (len < (LONGEST) (iter.end - iter.begin))
351 if (!erased.empty ())
364 iter.data, iter.begin,
365 iter.end - iter.begin,
366 progress_cb, iter.baton);
367 if (len < (LONGEST) (iter.end - iter.begin))
368 error (_(
"Error writing data to flash"));
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
struct inferior * current_inferior(void)
struct mem_region * lookup_mem_region(CORE_ADDR addr)
enum mem_access_mode mode
static void claim_memory(const std::vector< memory_write_request > &blocks, std::vector< memory_write_request > *result, ULONGEST begin, ULONGEST end)
static void split_regular_and_flash_blocks(const std::vector< memory_write_request > &blocks, std::vector< memory_write_request > *regular_blocks, std::vector< memory_write_request > *flash_blocks)
static std::vector< memory_write_request > blocks_to_erase(const std::vector< memory_write_request > &written)
int target_write_memory_blocks(const std::vector< memory_write_request > &requests, enum flash_preserve_mode preserve_flash_p, void(*progress_cb)(ULONGEST, void *))
static std::vector< memory_write_request > compute_garbled_blocks(const std::vector< memory_write_request > &erased_blocks, const std::vector< memory_write_request > &written_blocks)
static void block_boundaries(CORE_ADDR address, CORE_ADDR *begin, CORE_ADDR *end)
static bool compare_block_starting_address(const memory_write_request &a_req, const memory_write_request &b_req)
void target_flash_erase(ULONGEST address, LONGEST length)
void target_flash_done(void)
LONGEST target_write_with_progress(struct target_ops *ops, enum target_object object, const char *annex, const gdb_byte *buf, ULONGEST offset, LONGEST len, void(*progress)(ULONGEST, void *), void *baton)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)