This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Committed: more mmap cases for sim/cris
- From: Hans-Peter Nilsson <hans-peter dot nilsson at axis dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 6 Jan 2009 22:21:38 +0100
- Subject: Re: Committed: more mmap cases for sim/cris
> Date: Tue, 6 Jan 2009 21:50:37 +0100
> From: Hans-Peter Nilsson <hp@axis.com>
> sim:
> * cris/traps.c (abort): Define to call sim_io_error.
> (create_map): Make -1 imply a non-fixed address, not 0. All
> callers changed. Only prefer the next higher unmapped address if
> the last mapped address is no less than 0x40000000. Check that
> the address to be mapped is not already mapped. Update head
> comment.
> (unmap_pages): Don't call abort when recursive call fails, just
> note and return an error if a page in the range couldn't be unmapped.
> (cris_bmod_handler, h_supr_set_handler, h_supr_get_handler)
> (schedule, make_first_thread, cris_pipe_empty): New local variable sd.
> (cris_break_13_handler) <case TARGET_SYS_mmap2>: Handle
> non-MAP_FIXED argument overlapping existing map. For MAP_FIXED,
> don't abort on page not being mapped. Handle non-anon filemap
> with length padded to pagesize.
ENOPATCH
Index: cris/traps.c
===================================================================
RCS file: /cvs/src/src/sim/cris/traps.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -p -u -r1.20 -r1.21
--- cris/traps.c 3 Jan 2009 21:00:48 -0000 1.20
+++ cris/traps.c 6 Jan 2009 20:49:00 -0000 1.21
@@ -755,6 +755,11 @@ static const CB_TARGET_DEFS_MAP open_map
{ -1, -1 }
};
+/* Let's be less drastic and more traceable. FIXME: mark as noreturn. */
+#define abort() \
+ sim_io_error (sd, "simulator unhandled condition at %s:%d", \
+ __FUNCTION__, __LINE__)
+
/* Needed for the cris_pipe_nonempty and cris_pipe_empty syscalls. */
static SIM_CPU *current_cpu_for_cb_callback;
@@ -975,7 +980,8 @@ cris_dump_map (SIM_CPU *current_cpu)
sim_io_eprintf (CPU_STATE (current_cpu), "0x%x..0x%x\n", start, end);
}
-/* Create mmapped memory. */
+/* Create mmapped memory. ADDR is -1 if any address will do. Caller
+ must make sure that the address isn't already mapped. */
static USI
create_map (SIM_DESC sd, struct cris_sim_mmapped_page **rootp, USI addr,
@@ -985,9 +991,9 @@ create_map (SIM_DESC sd, struct cris_sim
struct cris_sim_mmapped_page **higher_prevp = rootp;
USI new_addr = 0x40000000;
- if (addr != 0)
+ if (addr != (USI) -1)
new_addr = addr;
- else if (*rootp)
+ else if (*rootp && rootp[0]->addr >= new_addr)
new_addr = rootp[0]->addr + 8192;
if (len != 8192)
@@ -1011,6 +1017,10 @@ create_map (SIM_DESC sd, struct cris_sim
mapp = mapp->prev)
higher_prevp = &mapp->prev;
+ /* Assert for consistency that we don't create duplicate maps. */
+ if (is_mapped (sd, rootp, new_addr, len))
+ abort ();
+
/* Allocate the new page, on the next higher page from the last one
allocated, and link in the new descriptor before previous ones. */
mapp = malloc (sizeof (*mapp));
@@ -1041,6 +1051,7 @@ unmap_pages (SIM_DESC sd, struct cris_si
if (len != 8192)
{
USI page_addr;
+ int ret = 0;
if (len & 8191)
/* Which is better: return an error for this, or just round it up? */
@@ -1049,12 +1060,15 @@ unmap_pages (SIM_DESC sd, struct cris_si
/* Loop backwards to make each call is O(1) over the number of pages
allocated, if we're unmapping from the high end of the pages. */
for (page_addr = addr + len - 8192;
- page_addr >= addr;
+ page_addr > addr;
page_addr -= 8192)
- if (unmap_pages (sd, rootp, page_addr, 8192) != 0)
- abort ();
+ if (unmap_pages (sd, rootp, page_addr, 8192))
+ ret = EINVAL;
- return 0;
+ if (unmap_pages (sd, rootp, addr, 8192))
+ ret = EINVAL;
+
+ return ret;
}
for (mapp = *rootp; mapp != NULL && mapp->addr > addr; mapp = mapp->prev)
@@ -1087,6 +1101,7 @@ cris_bmod_handler (SIM_CPU *current_cpu
UINT srcreg ATTRIBUTE_UNUSED,
USI dstreg ATTRIBUTE_UNUSED)
{
+ SIM_DESC sd = CPU_STATE (current_cpu);
abort ();
}
@@ -1096,6 +1111,7 @@ h_supr_set_handler (SIM_CPU *current_cpu
USI page ATTRIBUTE_UNUSED,
USI newval ATTRIBUTE_UNUSED)
{
+ SIM_DESC sd = CPU_STATE (current_cpu);
abort ();
}
@@ -1104,6 +1120,7 @@ h_supr_get_handler (SIM_CPU *current_cpu
UINT index ATTRIBUTE_UNUSED,
USI page ATTRIBUTE_UNUSED)
{
+ SIM_DESC sd = CPU_STATE (current_cpu);
abort ();
}
@@ -1260,6 +1277,7 @@ schedule (SIM_CPU *current_cpu, int next
static void
reschedule (SIM_CPU *current_cpu)
{
+ SIM_DESC sd = CPU_STATE (current_cpu);
int i;
/* Iterate over all thread slots, because after a few thread creations
@@ -1397,6 +1415,7 @@ deliver_signal (SIM_CPU *current_cpu, in
static void
make_first_thread (SIM_CPU *current_cpu)
{
+ SIM_DESC sd = CPU_STATE (current_cpu);
current_cpu->thread_data
= xcalloc (1,
SIM_TARGET_MAX_THREADS
@@ -1706,10 +1725,7 @@ cris_break_13_handler (SIM_CPU *current_
&& prot != (TARGET_PROT_READ | TARGET_PROT_EXEC)
&& prot != (TARGET_PROT_READ | TARGET_PROT_WRITE))
|| (fd == (USI) -1 && pgoff != 0)
- || (fd != (USI) -1 && (flags & TARGET_MAP_ANONYMOUS))
- || ((flags & TARGET_MAP_FIXED) == 0
- && is_mapped (sd, ¤t_cpu->highest_mmapped_page,
- addr, (len + 8191) & ~8191)))
+ || (fd != (USI) -1 && (flags & TARGET_MAP_ANONYMOUS)))
{
retval
= cris_unknown_syscall (current_cpu, pc,
@@ -1742,13 +1758,17 @@ cris_break_13_handler (SIM_CPU *current_
&& prot != (TARGET_PROT_READ | TARGET_PROT_WRITE))
abort ();
- if ((flags & TARGET_MAP_FIXED)
- && unmap_pages (sd, ¤t_cpu->highest_mmapped_page,
- addr, newlen) != 0)
- abort ();
+ if (flags & TARGET_MAP_FIXED)
+ unmap_pages (sd, ¤t_cpu->highest_mmapped_page,
+ addr, newlen);
+ else if (is_mapped (sd, ¤t_cpu->highest_mmapped_page,
+ addr, newlen))
+ addr = 0;
newaddr
- = create_map (sd, ¤t_cpu->highest_mmapped_page, addr,
+ = create_map (sd, ¤t_cpu->highest_mmapped_page,
+ addr != 0 || (flags & TARGET_MAP_FIXED)
+ ? addr : -1,
newlen);
if (newaddr >= (USI) -8191)
@@ -1800,7 +1820,9 @@ cris_break_13_handler (SIM_CPU *current_
if (cb_syscall (cb, &s) != CB_RC_OK)
abort ();
- if ((USI) s.result != len)
+ /* If the result is a page or more lesser than what
+ was requested, something went wrong. */
+ if (len >= 8192 && (USI) s.result <= len - 8192)
abort ();
/* After reading, we need to go back to the previous
@@ -1821,13 +1843,17 @@ cris_break_13_handler (SIM_CPU *current_
USI newlen = (len + 8191) & ~8191;
USI newaddr;
- if ((flags & TARGET_MAP_FIXED)
- && unmap_pages (sd, ¤t_cpu->highest_mmapped_page,
- addr, newlen) != 0)
- abort ();
-
- newaddr = create_map (sd, ¤t_cpu->highest_mmapped_page, addr,
- newlen);
+ if (flags & TARGET_MAP_FIXED)
+ unmap_pages (sd, ¤t_cpu->highest_mmapped_page,
+ addr, newlen);
+ else if (is_mapped (sd, ¤t_cpu->highest_mmapped_page,
+ addr, newlen))
+ addr = 0;
+
+ newaddr = create_map (sd, ¤t_cpu->highest_mmapped_page,
+ addr != 0 || (flags & TARGET_MAP_FIXED)
+ ? addr : -1,
+ newlen);
if (newaddr >= (USI) -8191)
retval = -cb_host_to_target_errno (cb, -(SI) newaddr);
@@ -2114,7 +2140,7 @@ cris_break_13_handler (SIM_CPU *current_
mapped_addr
= create_map (sd, ¤t_cpu->highest_mmapped_page,
- 0, new_len);
+ -1, new_len);
if (mapped_addr > (USI) -8192)
{
@@ -3263,6 +3289,7 @@ cris_pipe_empty (host_callback *cb,
{
int i;
SIM_CPU *cpu = current_cpu_for_cb_callback;
+ SIM_DESC sd = CPU_STATE (current_cpu_for_cb_callback);
bfd_byte r10_buf[4];
int remaining
= cb->pipe_buffer[writer].size - cb->pipe_buffer[reader].size;
brgds, H-P