* sysdeps/powerpc/bp-asm.h (DISCARD_BOUNDS): Rename from UNCHECK_BOUNDS.

* sysdeps/powerpc/bits/setjmp.h (JB_SIZE): New constant. 
* sysdeps/powerpc/elf/libc-start.c (__libc_start_main): 
Wrap bounds around argv & envp and each of their string members. 
* sysdeps/powerpc/elf/start.S: Designate BP symbols. 
* sysdeps/unix/sysv/linux/powerpc/brk.S: Wrap entry-point 
symbol in BP_SYM ().  Discard bounds of address arg. 
* sysdeps/unix/sysv/linux/powerpc/clone.S: Likewise. 
* sysdeps/unix/sysv/linux/powerpc/mmap64.c (__mmap64): 
Discard bounds on address arg, add bounds to return value.
2000-07-21  Greg McGary  <greg@mcgary.org>

	* sysdeps/powerpc/bp-asm.h (DISCARD_BOUNDS): Rename from UNCHECK_BOUNDS.
	* sysdeps/powerpc/bits/setjmp.h (JB_SIZE): New constant.
	* sysdeps/powerpc/elf/libc-start.c (__libc_start_main):
	Wrap bounds around argv & envp and each of their string members.
	* sysdeps/powerpc/elf/start.S: Designate BP symbols.
	* sysdeps/unix/sysv/linux/powerpc/brk.S: Wrap entry-point
	symbol in BP_SYM ().  Discard bounds of address arg.
	* sysdeps/unix/sysv/linux/powerpc/clone.S: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/mmap64.c (__mmap64):
	Discard bounds on address arg, add bounds to return value.
This commit is contained in:
Greg McGary 2000-07-21 07:43:25 +00:00
parent 137bca87e7
commit df0f2bf8cc
8 changed files with 75 additions and 35 deletions

View File

@ -1,3 +1,16 @@
2000-07-21 Greg McGary <greg@mcgary.org>
* sysdeps/powerpc/bp-asm.h (DISCARD_BOUNDS): Rename from UNCHECK_BOUNDS.
* sysdeps/powerpc/bits/setjmp.h (JB_SIZE): New constant.
* sysdeps/powerpc/elf/libc-start.c (__libc_start_main):
Wrap bounds around argv & envp and each of their string members.
* sysdeps/powerpc/elf/start.S: Designate BP symbols.
* sysdeps/unix/sysv/linux/powerpc/brk.S: Wrap entry-point
symbol in BP_SYM (). Discard bounds of address arg.
* sysdeps/unix/sysv/linux/powerpc/clone.S: Likewise.
* sysdeps/unix/sysv/linux/powerpc/mmap64.c (__mmap64):
Discard bounds on address arg, add bounds to return value.
2000-07-20 Ulrich Drepper <drepper@redhat.com>
* elf/Makefile (tests): Add filter. Add rules to generate filter.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -34,6 +34,7 @@
# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */
# define JB_CR 21 /* Condition code registers. */
# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */
# define JB_SIZE (58*4)
#endif
#ifndef _ASM

View File

@ -30,7 +30,7 @@
/* Don't check bounds, just convert the BP register to its simple
pointer value. */
# define UNCHECK_BOUNDS(rBP) \
# define DISCARD_BOUNDS(rBP) \
lwz rBP, oVALUE(rBP)
/* Check low bound, with the side effect that the BP register is converted
@ -99,7 +99,7 @@
#else
# define UNCHECK_BOUNDS(rBP)
# define DISCARD_BOUNDS(rBP)
# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH)
# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc)
# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc)

View File

@ -19,6 +19,8 @@
#include <stdlib.h>
#include <unistd.h>
#include <ldsodefs.h>
#include <bp-start.h>
#include <bp-sym.h>
extern void __libc_init_first (int argc, char **argv, char **envp);
@ -29,18 +31,27 @@ extern void *__libc_stack_end;
struct startup_info
{
void *sda_base;
void *__unbounded sda_base;
int (*main) (int, char **, char **, void *);
int (*init) (int, char **, char **, void *);
void (*fini) (void);
};
int
__libc_start_main (int argc, char **argv, char **envp,
void *auxvec, void (*rtld_fini) (void),
struct startup_info *stinfo,
char **stack_on_entry)
/* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the
BPs in the arglist of startup_info.main and startup_info.init. */
BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av,
char *__unbounded *__unbounded ubp_ev,
void *__unbounded auxvec, void (*rtld_fini) (void),
struct startup_info *__unbounded stinfo,
char *__unbounded *__unbounded stack_on_entry)
{
#if __BOUNDED_POINTERS__
char **argv;
#else
# define argv ubp_av
#endif
#ifndef SHARED
/* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
If the address would be taken inside the expression the optimizer
@ -58,23 +69,22 @@ __libc_start_main (int argc, char **argv, char **envp,
/* ...in which case, we have argc as the top thing on the
stack, followed by argv (NULL-terminated), envp (likewise),
and the auxilary vector. */
argc = *(int *) stack_on_entry;
argv = stack_on_entry + 1;
envp = argv + argc + 1;
auxvec = envp;
while (*(char **) auxvec != NULL)
argc = *(int *__unbounded) stack_on_entry;
ubp_av = stack_on_entry + 1;
ubp_ev = ubp_av + argc + 1;
auxvec = ubp_ev;
while (*(char *__unbounded *__unbounded) auxvec != NULL)
++auxvec;
++auxvec;
rtld_fini = NULL;
}
INIT_ARGV_and_ENVIRON;
/* Store something that has some relationship to the end of the
stack, for backtraces. This variable should be thread-specific. */
__libc_stack_end = stack_on_entry + 4;
/* Set the global _environ variable correctly. */
__environ = envp;
/* Register the destructor of the dynamic linker if there is any. */
if (rtld_fini != NULL)
atexit (rtld_fini);
@ -84,7 +94,7 @@ __libc_start_main (int argc, char **argv, char **envp,
if (_dl_debug_impcalls)
_dl_debug_message (1, "\ninitialize libc\n\n", NULL);
#endif
__libc_init_first (argc, argv, envp);
__libc_init_first (argc, argv, __environ);
/* Register the destructor of the program, if any. */
if (stinfo->fini)

View File

@ -1,5 +1,5 @@
/* Startup code for programs linked with GNU libc.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -27,6 +27,7 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#include "bp-sym.h"
/* These are the various addresses we require. */
.section ".rodata"
@ -35,7 +36,7 @@
weak_extern(_fini)
L(start_addresses):
.long _SDA_BASE_
.long JUMPTARGET(main)
.long JUMPTARGET(BP_SYM (main))
.long JUMPTARGET(_init)
.long JUMPTARGET(_fini)
ASM_SIZE_DIRECTIVE(L(start_addresses))
@ -55,7 +56,7 @@ ENTRY(_start)
lis r8,L(start_addresses)@ha
lwzu r13,L(start_addresses)@l(r8)
/* and continue in libc-start, in glibc. */
b JUMPTARGET(__libc_start_main)
b JUMPTARGET(BP_SYM (__libc_start_main))
END(_start)
/* Define a symbol for the first piece of initialized data. */

View File

@ -20,10 +20,14 @@
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <bp-sym.h>
#include <bp-asm.h>
.comm __curbrk,4,4
.section ".text"
ENTRY(__brk)
ENTRY (BP_SYM (__brk))
DISCARD_BOUNDS (r3) /* the bounds are meaningless, so toss 'em */
stwu r1,-16(r1)
stw r3,8(r1)
DO_CALL(SYS_ify(brk))
@ -45,6 +49,6 @@ ENTRY(__brk)
blelr+
li r3,ENOMEM
b JUMPTARGET(__syscall_error)
END (__brk)
END (BP_SYM (__brk))
weak_alias (__brk, brk)
weak_alias (BP_SYM (__brk), BP_SYM (brk))

View File

@ -1,5 +1,5 @@
/* Wrapper around clone system call.
Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -20,14 +20,21 @@
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <bp-sym.h>
#include <bp-asm.h>
/* This is the only really unusual system call in PPC linux, but not
because of any weirdness in the system call itself; because of
all the freaky stuff we have to do to make the call useful. */
/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
/* int [r3] clone(int (*fn)(void *arg) [r3], void *child_stack [r4],
int flags [r5], void *arg [r6]); */
ENTRY (BP_SYM (__clone))
/* GKM FIXME: add bounds checks, where sensible. */
DISCARD_BOUNDS (r4)
DISCARD_BOUNDS (r6)
ENTRY(__clone)
/* Check for child_stack == NULL || fn == NULL. */
cmpwi cr0,r4,0
cmpwi cr1,r3,0
@ -82,6 +89,6 @@ L(parent):
L(badargs):
li r3,EINVAL
b JUMPTARGET(__syscall_error)
END (__clone)
END (BP_SYM (__clone))
weak_alias (__clone, clone)
weak_alias (BP_SYM (__clone), BP_SYM (clone))

View File

@ -19,18 +19,18 @@
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <sys/mman.h>
#include <bp-checks.h>
#include <asm/page.h>
#include "kernel-features.h"
#ifdef __NR_mmap2
extern __ptr_t __syscall_mmap2(__ptr_t, size_t, int, int, int, off_t);
extern void *__unbounded __syscall_mmap2(void *__unbounded, size_t,
int, int, int, off_t);
#ifndef __ASSUME_MMAP2_SYSCALL
static int have_no_mmap2;
#endif
@ -50,9 +50,13 @@ __mmap64 (__ptr_t addr, size_t len, int prot, int flags, int fd, off64_t offset)
int saved_errno = errno;
#endif
/* This will be always 12, no matter what page size is. */
__ptr_t result = INLINE_SYSCALL (mmap2, 6, addr, len, prot, flags,
fd, (off_t) (offset >> PAGE_SHIFT));
__ptr_t result;
__ptrvalue (result) = INLINE_SYSCALL (mmap2, 6, __ptrvalue (addr), len, prot,
flags, fd, (off_t) (offset >> PAGE_SHIFT));
#if __BOUNDED_POINTERS__
__ptrlow (result) = __ptrvalue (result);
__ptrhigh (result) = __ptrvalue (result) + len;
#endif
#ifndef __ASSUME_MMAP2_SYSCALL
if (result != (__ptr_t) -1 || errno != ENOSYS)
#endif