Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Hans-Peter Nilsson <hans-peter.nilsson@axis.com>
To: gdb-patches@sourceware.org
Subject: Committed: more mmap cases for sim/cris
Date: Tue, 06 Jan 2009 20:50:00 -0000	[thread overview]
Message-ID: <200901062050.n06KobkR022114@ignucius.se.axis.com> (raw)

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


             reply	other threads:[~2009-01-06 20:50 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-06 20:50 Hans-Peter Nilsson [this message]
2009-01-06 21:21 ` Hans-Peter Nilsson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200901062050.n06KobkR022114@ignucius.se.axis.com \
    --to=hans-peter.nilsson@axis.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox