From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21331 invoked by alias); 6 Jan 2009 20:50:49 -0000 Received: (qmail 21321 invoked by uid 22791); 6 Jan 2009 20:50:48 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_22,SPF_PASS X-Spam-Check-By: sourceware.org Received: from krynn.se.axis.com (HELO krynn.se.axis.com) (193.13.178.10) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 06 Jan 2009 20:50:42 +0000 Received: from ignucius.se.axis.com (ignucius.se.axis.com [10.13.11.50]) by krynn.se.axis.com (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id n06Koc7F008335; Tue, 6 Jan 2009 21:50:38 +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 n06KobJ9022118; Tue, 6 Jan 2009 21:50:37 +0100 Received: (from hp@localhost) by ignucius.se.axis.com (8.12.8p1/8.12.8/Debian-2woody1) id n06KobkR022114; Tue, 6 Jan 2009 21:50:37 +0100 Date: Tue, 06 Jan 2009 20:50:00 -0000 Message-Id: <200901062050.n06KobkR022114@ignucius.se.axis.com> From: Hans-Peter Nilsson To: gdb-patches@sourceware.org Subject: 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/msg00055.txt.bz2 Unfortunately hello-world has a few different use-cases of mmap when run through the interpreter, like the glibc testsuite does: /objdir/ld.so.1 --library-path /objdir:/objdir... /objdir/prog This fixes them, and adds separate tests for them, as well as adding a test-case as above, adjusted to the test-suite. (Looks like ld.so.1 is fine with being loaded at 0.) While I was at it, I thought better improve on the abort calls all over sim/cris/traps.c; why not emit a message before exiting. Calling sim_io_error is the preferred means, rather than sim_engine_abort, because it requires just one context parameter (not three) that I'd have to compose out of thin air, and if bad comes to worse, it'd support passing NULL as that pointer. This *does* introduce two warning regressions. Not that warnings are particularly scarce for sim/*, specifically cgen sims, but why make it worse: x/src/sim/cris/traps.c: In function 'h_supr_get_handler': x/src/sim/cris/traps.c:1124: warning: control reaches end of non-void function x/src/sim/cris/traps.c: In function 'cris_bmod_handler': x/src/sim/cris/traps.c:1105: warning: control reaches end of non-void function They're handled with my next patch. Committed. 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. sim/testsuite: * sim/cris/c/mmap5.c, sim/cris/c/mmap6.c, sim/cris/c/mmap7.c, sim/cris/c/mmap8.c, sim/cris/c/hellodyn3.c: New tests. Index: sim/cris/c/hellodyn3.c =================================================================== RCS file: sim/cris/c/hellodyn3.c diff -N sim/cris/c/hellodyn3.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim/cris/c/hellodyn3.c 6 Jan 2009 20:46:57 -0000 @@ -0,0 +1,9 @@ +/* Check that invoking ld.so as a program, invoking the main program, + works. Jump through a few hoops to avoid reading the host + ld.so.cache (having no absolute path specified for the executable + falls back on loading through the same mechanisms as a DSO). +#notarget: *-*-elf +#dynamic: +#sim: --sysroot=@exedir@ @exedir@/lib/ld.so.1 --library-path / + */ +#include "hello.c" Index: sim/cris/c/mmap5.c =================================================================== RCS file: sim/cris/c/mmap5.c diff -N sim/cris/c/mmap5.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim/cris/c/mmap5.c 6 Jan 2009 20:46:57 -0000 @@ -0,0 +1,91 @@ +/* +#notarget: cris*-*-elf +*/ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +int main (int argc, char *argv[]) +{ + int fd = open (argv[0], O_RDONLY); + struct stat sb; + int size; + void *a; + void *b; + const char *str = "a string you'll only find in the program"; + + if (fd == -1) + { + perror ("open"); + abort (); + } + + if (fstat (fd, &sb) < 0) + { + perror ("fstat"); + abort (); + } + + size = 8192; +#ifdef MMAP_SIZE1 + size = MMAP_SIZE1; +#endif + +#ifndef MMAP_PROT1 +#define MMAP_PROT1 PROT_READ | PROT_WRITE | PROT_EXEC +#endif + +#ifndef MMAP_FLAGS1 +#define MMAP_FLAGS1 MAP_PRIVATE | MAP_ANONYMOUS +#endif + + /* Get a page, any page. */ + b = mmap (NULL, size, MMAP_PROT1, MMAP_FLAGS1, -1, 0); + if (b == MAP_FAILED) + abort (); + + /* Remember it, unmap it. */ +#ifndef NO_MUNMAP + if (munmap (b, size) != 0) + abort (); +#endif + +#ifdef MMAP_ADDR2 + b = MMAP_ADDR2; +#endif + +#ifndef MMAP_PROT2 +#define MMAP_PROT2 PROT_READ | PROT_EXEC +#endif + +#ifndef MMAP_FLAGS2 +#define MMAP_FLAGS2 MAP_DENYWRITE | MAP_FIXED | MAP_PRIVATE +#endif + + size = sb.st_size; +#ifdef MMAP_SIZE2 + size = MMAP_SIZE2; +#endif + +#define MMAP_TEST_BAD_ORIG \ + (a == MAP_FAILED || memmem (a, size, str, strlen (str) + 1) == NULL) +#ifndef MMAP_TEST_BAD +#define MMAP_TEST_BAD MMAP_TEST_BAD_ORIG +#endif + + /* Try mapping the now non-mapped page fixed. */ + a = mmap (b, size, MMAP_PROT2, MMAP_FLAGS2, fd, 0); + + if (MMAP_TEST_BAD) + abort (); + + printf ("pass\n"); + exit (0); +} Index: sim/cris/c/mmap6.c =================================================================== RCS file: sim/cris/c/mmap6.c diff -N sim/cris/c/mmap6.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim/cris/c/mmap6.c 6 Jan 2009 20:46:57 -0000 @@ -0,0 +1,8 @@ +/* Check that mmapping specifying a previously mmapped address without + MAP_FIXED works; that we just don't get the same address. +#notarget: cris*-*-elf +*/ +#define NO_MUNMAP +#define MMAP_FLAGS2 MAP_PRIVATE +#define MMAP_TEST_BAD (a == b || MMAP_TEST_BAD_ORIG) +#include "mmap5.c" Index: sim/cris/c/mmap7.c =================================================================== RCS file: sim/cris/c/mmap7.c diff -N sim/cris/c/mmap7.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim/cris/c/mmap7.c 6 Jan 2009 20:46:57 -0000 @@ -0,0 +1,14 @@ +/* Check that mmapping a page-aligned size, larger than the file, + works. + +#notarget: cris*-*-elf +*/ + +/* Make sure we get an address where the size fits. */ +#define MMAP_SIZE1 ((sb.st_size + 8192) & ~8191) + +/* If this ever fails because the file is a page-multiple, we'll deal + with that then. We want it larger than the file-size anyway. */ +#define MMAP_SIZE2 ((size + 8192) & ~8191) +#define MMAP_FLAGS2 MAP_DENYWRITE | MAP_PRIVATE | MAP_FIXED +#include "mmap5.c" Index: sim/cris/c/mmap8.c =================================================================== RCS file: sim/cris/c/mmap8.c diff -N sim/cris/c/mmap8.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim/cris/c/mmap8.c 6 Jan 2009 20:46:57 -0000 @@ -0,0 +1,9 @@ +/* Check that mmapping 0 using MAP_FIXED works, both with/without + there being previously mmapped contents. +#notarget: cris*-*-elf +*/ +#define MMAP_FLAGS1 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED +#define NO_MUNMAP +#define MMAP_SIZE2 8192 +#define MMAP_TEST_BAD (a != b || a != 0) +#include "mmap5.c" brgds, H-P