This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
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 21:50:37 +0100
- Subject: Committed: more mmap cases for sim/cris
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) <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.
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 <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+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