From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8613 invoked by alias); 6 Jan 2009 21:21:48 -0000 Received: (qmail 8602 invoked by uid 22791); 6 Jan 2009 21:21:46 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_16,SPF_PASS X-Spam-Check-By: sourceware.org Received: from miranda.se.axis.com (HELO miranda.se.axis.com) (193.13.178.8) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 06 Jan 2009 21:21:42 +0000 Received: from ignucius.se.axis.com (ignucius.se.axis.com [10.13.11.50]) by miranda.se.axis.com (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id n06LMKW0022158; Tue, 6 Jan 2009 22:22:20 +0100 Received: from ignucius.se.axis.com (localhost [127.0.0.1]) by ignucius.se.axis.com (8.12.8p1/8.12.8/Debian-2woody1) with ESMTP id n06LLcJ9022682; Tue, 6 Jan 2009 22:21:38 +0100 Received: (from hp@localhost) by ignucius.se.axis.com (8.12.8p1/8.12.8/Debian-2woody1) id n06LLcBY022678; Tue, 6 Jan 2009 22:21:38 +0100 Date: Tue, 06 Jan 2009 21:21:00 -0000 Message-Id: <200901062121.n06LLcBY022678@ignucius.se.axis.com> From: Hans-Peter Nilsson To: gdb-patches@sourceware.org In-reply-to: <200901062050.n06KobkR022114@ignucius.se.axis.com> (message from Hans-Peter Nilsson on Tue, 6 Jan 2009 21:50:37 +0100) Subject: Re: Committed: more mmap cases for sim/cris MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-1 Content-Transfer-Encoding: 8BIT Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-01/txt/msg00059.txt.bz2 > Date: Tue, 6 Jan 2009 21:50:37 +0100 > From: Hans-Peter Nilsson > 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) : 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