This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]