mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 04:12:10 +08:00
275602c398
macro-020506-branch'. Sprout from gdb_5_2-branch 2002-03-27 05:12:36 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'gdb_5_2-branch'.' Cherrypick from gdb_5_2-branch 2002-03-02 23:00:05 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'gdb_5_2-branch'.': intl/ChangeLog intl/Makefile.in Cherrypick from master 2002-05-06 21:00:21 UTC Jim Blandy <jimb@codesourcery.com> 'Separate the job of reading the line number info statement program': ChangeLog MAINTAINERS Makefile.in bfd/ChangeLog bfd/ChangeLog-9495 bfd/Makefile.am bfd/Makefile.in bfd/aix5ppc-core.c bfd/aout-adobe.c bfd/aout-target.h bfd/aout-tic30.c bfd/aoutx.h bfd/archive.c bfd/archures.c bfd/bfd-in.h bfd/bfd-in2.h bfd/bfd.c bfd/binary.c bfd/bout.c bfd/coff-arm.c bfd/coff-h8300.c bfd/coff-mcore.c bfd/coff-ppc.c bfd/coff-rs6000.c bfd/coff-sh.c bfd/coff-z8k.c bfd/coff64-rs6000.c bfd/coffcode.h bfd/cofflink.c bfd/coffswap.h bfd/config.bfd bfd/configure bfd/configure.in bfd/cpu-h8300.c bfd/cpu-i370.c bfd/cpu-i386.c bfd/cpu-mips.c bfd/cpu-powerpc.c bfd/cpu-s390.c bfd/cpu-sh.c bfd/cpu-sparc.c bfd/dep-in.sed bfd/doc/ChangeLog bfd/doc/Makefile.in bfd/dwarf2.c bfd/ecoff.c bfd/elf-bfd.h bfd/elf-eh-frame.c bfd/elf-hppa.h bfd/elf-m10300.c bfd/elf.c bfd/elf32-arm.h bfd/elf32-cris.c bfd/elf32-hppa.c bfd/elf32-hppa.h bfd/elf32-i370.c bfd/elf32-i386.c bfd/elf32-m32r.c bfd/elf32-m68k.c bfd/elf32-mips.c bfd/elf32-ppc.c bfd/elf32-s390.c bfd/elf32-sh.c bfd/elf32-sh64.c bfd/elf32-sparc.c bfd/elf32-xstormy16.c bfd/elf64-alpha.c bfd/elf64-hppa.c bfd/elf64-mips.c bfd/elf64-mmix.c bfd/elf64-ppc.c bfd/elf64-ppc.h bfd/elf64-s390.c bfd/elf64-sh64.c bfd/elf64-sparc.c bfd/elf64-x86-64.c bfd/elfarm-nabi.c bfd/elflink.c bfd/elflink.h bfd/elfxx-ia64.c bfd/elfxx-mips.c bfd/elfxx-mips.h bfd/elfxx-target.h bfd/i386linux.c bfd/i386msdos.c bfd/i386os9k.c bfd/ieee.c bfd/ihex.c bfd/libbfd-in.h bfd/libbfd.c bfd/libbfd.h bfd/libcoff-in.h bfd/libcoff.h bfd/libecoff.h bfd/libxcoff.h bfd/linker.c bfd/m68klinux.c bfd/merge.c bfd/mmo.c bfd/nlm-target.h bfd/oasys.c bfd/opncls.c bfd/pdp11.c bfd/po/SRC-POTFILES.in bfd/po/fr.po bfd/ppcboot.c bfd/reloc.c bfd/rs6000-core.c bfd/som.c bfd/sparclinux.c bfd/srec.c bfd/sunos.c bfd/syms.c bfd/targets.c bfd/tekhex.c bfd/versados.c bfd/version.h bfd/vms.c bfd/xcofflink.c config.guess config.sub config/ChangeLog config/acinclude.m4 config/mh-a68bsd config/mh-apollo68 config/mh-cxux config/mh-decstation config/mh-dgux config/mh-dgux386 config/mh-djgpp config/mh-hp300 config/mh-hpux config/mh-hpux8 config/mh-interix config/mh-irix5 config/mh-irix6 config/mh-lynxrs6k config/mh-mingw32 config/mh-ncr3000 config/mh-ncrsvr43 config/mh-necv4 config/mh-openedition config/mh-riscos config/mh-sco config/mh-solaris config/mh-sysv config/mh-sysv4 config/mh-sysv5 config/mt-aix43 config/mt-alphaieee config/mt-linux configure configure.in gdb/ChangeLog gdb/MAINTAINERS gdb/Makefile.in gdb/NEWS gdb/PROBLEMS gdb/README gdb/acconfig.h gdb/acinclude.m4 gdb/aclocal.m4 gdb/alpha-linux-tdep.c gdb/alpha-nat.c gdb/alpha-osf1-tdep.c gdb/alpha-tdep.c gdb/alpha-tdep.h gdb/alphabsd-nat.c gdb/alphafbsd-tdep.c gdb/alphanbsd-nat.c gdb/alphanbsd-tdep.c gdb/arc-tdep.c gdb/arch-utils.c gdb/arch-utils.h gdb/arm-tdep.c gdb/arm-tdep.h gdb/avr-tdep.c gdb/bcache.c gdb/blockframe.c gdb/breakpoint.c gdb/builtin-regs.c gdb/builtin-regs.h gdb/c-exp.y gdb/c-lang.c gdb/cli-out.c gdb/cli/cli-cmds.c gdb/cli/cli-decode.c gdb/cli/cli-decode.h gdb/cli/cli-dump.c gdb/cli/cli-dump.h gdb/cli/cli-script.c gdb/coffread.c gdb/command.h gdb/completer.c gdb/config.in gdb/config/alpha/alpha-linux.mt gdb/config/alpha/alpha-osf1.mt gdb/config/alpha/nbsd.mh gdb/config/alpha/nbsd.mt gdb/config/alpha/nm-linux.h gdb/config/alpha/nm-nbsd.h gdb/config/alpha/nm-osf.h gdb/config/alpha/tm-alpha.h gdb/config/alpha/tm-alphalinux.h gdb/config/alpha/tm-fbsd.h gdb/config/alpha/tm-nbsd.h gdb/config/arc/tm-arc.h gdb/config/avr/avr.mt gdb/config/djgpp/README gdb/config/h8500/tm-h8500.h gdb/config/i386/fbsd.mh gdb/config/i386/i386gnu.mh gdb/config/i386/i386lynx.mh gdb/config/i386/i386v42mp.mh gdb/config/i386/nbsd.mt gdb/config/i386/nbsdelf.mt gdb/config/i386/nm-fbsd.h gdb/config/i386/nm-x86-64.h gdb/config/i386/tm-linux.h gdb/config/i386/x86-64linux.mt gdb/config/i960/tm-i960.h gdb/config/m32r/m32r.mt gdb/config/m68k/m68klynx.mh gdb/config/m68k/nbsd.mt gdb/config/m68k/sun3os4.mh gdb/config/m68k/tm-nbsd.h gdb/config/mcore/tm-mcore.h gdb/config/mips/vr5000.mt gdb/config/mn10200/tm-mn10200.h gdb/config/ns32k/nbsd.mt gdb/config/pa/hppabsd.mh gdb/config/pa/hppaosf.mh gdb/config/pa/hpux1020.mh gdb/config/pa/hpux11.mh gdb/config/pa/hpux11w.mh gdb/config/pa/tm-hppa.h gdb/config/powerpc/nbsd.mt gdb/config/powerpc/tm-ppc-eabi.h gdb/config/rs6000/rs6000lynx.mh gdb/config/rs6000/tm-rs6000.h gdb/config/s390/s390.mh gdb/config/s390/s390.mt gdb/config/s390/s390x.mt gdb/config/sparc/fbsd.mh gdb/config/sparc/fbsd.mt gdb/config/sparc/linux.mh gdb/config/sparc/sparclynx.mh gdb/config/sparc/sun4os4.mh gdb/config/sparc/tm-linux.h gdb/config/sparc/tm-sp64.h gdb/config/sparc/tm-sp64linux.h gdb/config/sparc/tm-sparc.h gdb/config/v850/tm-v850.h gdb/config/vax/tm-vax.h gdb/configure gdb/configure.host gdb/configure.in gdb/configure.tgt gdb/core-sol2.c gdb/corefile.c gdb/corelow.c gdb/cp-valprint.c gdb/cris-tdep.c gdb/d10v-tdep.c gdb/d30v-tdep.c gdb/dbxread.c gdb/defs.h gdb/doc/ChangeLog gdb/doc/gdb.texinfo gdb/doc/gdbint.texinfo gdb/dwarf2cfi.c gdb/dwarf2read.c gdb/elfread.c gdb/eval.c gdb/event-top.c gdb/exec.c gdb/f-exp.y gdb/f-lang.c gdb/fbsd-proc.c gdb/findvar.c gdb/frame.c gdb/frame.h gdb/gcore.c gdb/gdb-events.c gdb/gdb-events.h gdb/gdb-events.sh gdb/gdbarch.c gdb/gdbarch.h gdb/gdbarch.sh gdb/gdbserver/Makefile.in gdb/gdbserver/config.in gdb/gdbserver/configure gdb/gdbserver/configure.in gdb/gdbserver/gdbreplay.c gdb/gdbserver/inferiors.c gdb/gdbserver/linux-arm-low.c gdb/gdbserver/linux-i386-low.c gdb/gdbserver/linux-ia64-low.c gdb/gdbserver/linux-low.c gdb/gdbserver/linux-low.h gdb/gdbserver/linux-m68k-low.c gdb/gdbserver/linux-mips-low.c gdb/gdbserver/linux-ppc-low.c gdb/gdbserver/linux-s390-low.c gdb/gdbserver/linux-sh-low.c gdb/gdbserver/linux-x86-64-low.c gdb/gdbserver/mem-break.c gdb/gdbserver/mem-break.h gdb/gdbserver/regcache.c gdb/gdbserver/regcache.h gdb/gdbserver/remote-utils.c gdb/gdbserver/server.c gdb/gdbserver/server.h gdb/gdbserver/target.c gdb/gdbserver/target.h gdb/gdbserver/utils.c gdb/gdbtypes.c gdb/gdbtypes.h gdb/gnu-nat.c gdb/gnu-v3-abi.c gdb/go32-nat.c gdb/gregset.h gdb/h8300-tdep.c gdb/h8500-tdep.c gdb/hppa-tdep.c gdb/hpread.c gdb/i386-linux-tdep.c gdb/i386-tdep.c gdb/i386gnu-nat.c gdb/i387-nat.c gdb/i960-tdep.c gdb/ia64-tdep.c gdb/infcmd.c gdb/inferior.h gdb/inflow.c gdb/infrun.c gdb/jv-exp.y gdb/kod.c gdb/language.c gdb/lin-lwp.c gdb/linespec.c gdb/linux-proc.c gdb/m2-exp.y gdb/m3-nat.c gdb/m68hc11-tdep.c gdb/m68klinux-nat.c gdb/maint.c gdb/mcore-tdep.c gdb/mdebugread.c gdb/mem-break.c gdb/mi/ChangeLog gdb/mi/mi-cmd-break.c gdb/mi/mi-cmd-disas.c gdb/mi/mi-cmd-stack.c gdb/mi/mi-cmd-var.c gdb/mi/mi-console.c gdb/mi/mi-main.c gdb/mi/mi-out.c gdb/mi/mi-parse.c gdb/minsyms.c gdb/mips-tdep.c gdb/mipsread.c gdb/mn10300-tdep.c gdb/monitor.c gdb/ocd.c gdb/p-exp.y gdb/p-lang.c gdb/p-lang.h gdb/p-typeprint.c gdb/p-valprint.c gdb/parse.c gdb/parser-defs.h gdb/ppc-bdm.c gdb/ppc-linux-nat.c gdb/ppc-linux-tdep.c gdb/ppc-tdep.h gdb/printcmd.c gdb/proc-api.c gdb/regcache.c gdb/regformats/reg-ppc.dat gdb/regformats/reg-x86-64.dat gdb/remote-array.c gdb/remote-e7000.c gdb/remote-es.c gdb/remote-mips.c gdb/remote-os9k.c gdb/remote-rdi.c gdb/remote-rdp.c gdb/remote-st.c gdb/remote-utils.c gdb/remote-vxsparc.c gdb/remote.c gdb/rs6000-nat.c gdb/rs6000-tdep.c gdb/s390-tdep.c gdb/scm-lang.c gdb/ser-unix.h gdb/serial.c gdb/sh-tdep.c gdb/solib-legacy.c gdb/solib-svr4.c gdb/solib.c gdb/somread.c gdb/source.c gdb/sparc-nat.c gdb/sparc-tdep.c gdb/stabsread.c gdb/stack.c gdb/std-regs.c gdb/symfile.c gdb/symfile.h gdb/symmisc.c gdb/symtab.c gdb/symtab.h gdb/target.c gdb/target.h gdb/testsuite/ChangeLog gdb/testsuite/config/sid.exp gdb/testsuite/gdb.asm/Makefile.in gdb/testsuite/gdb.asm/asm-source.exp gdb/testsuite/gdb.asm/configure gdb/testsuite/gdb.asm/configure.in gdb/testsuite/gdb.asm/powerpc.inc gdb/testsuite/gdb.asm/sparc64.inc gdb/testsuite/gdb.base/annota1.exp gdb/testsuite/gdb.base/attach.exp gdb/testsuite/gdb.base/bar.c gdb/testsuite/gdb.base/baz.c gdb/testsuite/gdb.base/completion.exp gdb/testsuite/gdb.base/cvexpr.c gdb/testsuite/gdb.base/dbx.exp gdb/testsuite/gdb.base/default.exp gdb/testsuite/gdb.base/dump.c gdb/testsuite/gdb.base/dump.exp gdb/testsuite/gdb.base/ending-run.exp gdb/testsuite/gdb.base/foo.c gdb/testsuite/gdb.base/funcargs.c gdb/testsuite/gdb.base/funcargs.exp gdb/testsuite/gdb.base/gcore.exp gdb/testsuite/gdb.base/grbx.c gdb/testsuite/gdb.base/help.exp gdb/testsuite/gdb.base/list.exp gdb/testsuite/gdb.base/long_long.exp gdb/testsuite/gdb.base/maint.exp gdb/testsuite/gdb.base/opaque.exp gdb/testsuite/gdb.base/overlays.exp gdb/testsuite/gdb.base/ovlymgr.c gdb/testsuite/gdb.base/printcmds.exp gdb/testsuite/gdb.base/ptype.exp gdb/testsuite/gdb.base/relocate.c gdb/testsuite/gdb.base/relocate.exp gdb/testsuite/gdb.base/scope.exp gdb/testsuite/gdb.base/shlib-call.exp gdb/testsuite/gdb.base/step-test.exp gdb/testsuite/gdb.base/watchpoint.exp gdb/testsuite/gdb.base/whatis.exp gdb/testsuite/gdb.c++/classes.exp gdb/testsuite/gdb.c++/cplusfuncs.exp gdb/testsuite/gdb.c++/hang.H gdb/testsuite/gdb.c++/hang.exp gdb/testsuite/gdb.c++/hang1.C gdb/testsuite/gdb.c++/hang2.C gdb/testsuite/gdb.c++/hang3.C gdb/testsuite/gdb.c++/local.cc gdb/testsuite/gdb.c++/local.exp gdb/testsuite/gdb.c++/method.exp gdb/testsuite/gdb.c++/misc.exp gdb/testsuite/gdb.c++/ovldbreak.exp gdb/testsuite/gdb.gdb/xfullpath.exp gdb/testsuite/gdb.java/jmisc1.exp gdb/testsuite/gdb.java/jmisc2.exp gdb/testsuite/gdb.mi/ChangeLog gdb/testsuite/gdb.mi/mi-var-cmd.exp gdb/testsuite/gdb.mi/mi0-var-cmd.exp gdb/testsuite/gdb.threads/linux-dp.exp gdb/testsuite/gdb.trace/gdb_c_test.c gdb/testsuite/lib/gdb.exp gdb/thread-db.c gdb/thread.c gdb/top.c gdb/top.h gdb/tracepoint.c gdb/tui/ChangeLog gdb/tui/tui-out.c gdb/ui-file.c gdb/ui-out.c gdb/utils.c gdb/valarith.c gdb/valops.c gdb/valprint.c gdb/value.h gdb/varobj.c gdb/vax-tdep.c gdb/vax-tdep.h gdb/version.in gdb/win32-nat.c gdb/x86-64-linux-nat.c gdb/x86-64-tdep.c gdb/x86-64-tdep.h gdb/xcoffread.c gdb/xstormy16-tdep.c gdb/z8k-tdep.c include/ChangeLog include/coff/ChangeLog include/coff/rs6k64.h include/dyn-string.h include/elf/ChangeLog include/elf/dwarf2.h include/floatformat.h include/opcode/ChangeLog include/opcode/i386.h include/opcode/mips.h include/opcode/pdp11.h include/xregex2.h libiberty/ChangeLog libiberty/Makefile.in libiberty/config.table libiberty/configure libiberty/configure.in libiberty/cp-demangle.c libiberty/dyn-string.c libiberty/floatformat.c libiberty/functions.texi libiberty/hashtab.c libiberty/hex.c libiberty/splay-tree.c libiberty/strtod.c libiberty/xatexit.c libiberty/xmalloc.c ltmain.sh mmalloc/ChangeLog mmalloc/mmap-sup.c opcodes/ChangeLog opcodes/Makefile.am opcodes/Makefile.in opcodes/configure opcodes/configure.in opcodes/dep-in.sed opcodes/i386-dis.c opcodes/mips-dis.c opcodes/mips-opc.c opcodes/pdp11-dis.c opcodes/pdp11-opc.c opcodes/po/fr.po opcodes/po/id.po opcodes/ppc-opc.c opcodes/s390-dis.c opcodes/z8k-dis.c opcodes/z8k-opc.h opcodes/z8kgen.c sim/ChangeLog sim/MAINTAINERS sim/arm/ChangeLog sim/arm/wrapper.c sim/common/ChangeLog sim/common/callback.c sim/igen/ChangeLog sim/igen/gen.c sim/igen/igen.c sim/m68hc11/ChangeLog sim/m68hc11/dv-m68hc11.c sim/m68hc11/dv-m68hc11spi.c sim/m68hc11/dv-m68hc11tim.c sim/m68hc11/interp.c sim/m68hc11/interrupts.c sim/m68hc11/interrupts.h sim/m68hc11/m68hc11_sim.c sim/m68hc11/sim-main.h sim/mips/ChangeLog sim/mips/Makefile.in sim/mips/configure sim/mips/configure.in sim/mips/cp1.c sim/mips/interp.c sim/mips/mips.igen sim/mips/sim-main.h sim/ppc/ChangeLog sim/ppc/hw_disk.c sim/ppc/ppc-instructions sim/ppc/sim_calls.c sim/z8k/ChangeLog sim/z8k/writecode.c Delete: config/mh-irix4 config/mh-lynxos config/mh-sun3 config/mh-vaxult2 config/mt-armpic config/mt-elfalphapic config/mt-i370pic config/mt-ia64pic config/mt-m68kpic config/mt-papic config/mt-ppcpic config/mt-s390pic config/mt-sparcpic config/mt-x86pic gdb/a29k-tdep.c gdb/config/a29k/a29k-udi.mt gdb/config/a29k/a29k.mt gdb/config/a29k/tm-a29k.h gdb/config/a29k/tm-vx29k.h gdb/config/a29k/vx29k.mt gdb/remote-adapt.c gdb/remote-eb.c gdb/remote-mm.c gdb/remote-udi.c gdb/signals.c gdb/testsuite/gdb.hp/gdb.threads-hp/usrthbasic.c gdb/testsuite/gdb.hp/gdb.threads-hp/usrthbasic.exp gdb/testsuite/gdb.hp/gdb.threads-hp/usrthcore.c gdb/testsuite/gdb.hp/gdb.threads-hp/usrthcore.exp gdb/testsuite/gdb.hp/gdb.threads-hp/usrthfork.c gdb/testsuite/gdb.hp/gdb.threads-hp/usrthfork.exp
221 lines
6.0 KiB
C
221 lines
6.0 KiB
C
/* Support for an sbrk-like function that uses mmap.
|
|
Copyright 1992, 2000 Free Software Foundation, Inc.
|
|
|
|
Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
|
|
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with the GNU C Library; see the file COPYING.LIB. If
|
|
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA. */
|
|
|
|
#if defined(HAVE_MMAP)
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h> /* Prototypes for lseek */
|
|
#endif
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <sys/mman.h>
|
|
|
|
#ifndef SEEK_SET
|
|
#define SEEK_SET 0
|
|
#endif
|
|
|
|
#include "mmprivate.h"
|
|
|
|
/* Cache the pagesize for the current host machine. Note that if the host
|
|
does not readily provide a getpagesize() function, we need to emulate it
|
|
elsewhere, not clutter up this file with lots of kluges to try to figure
|
|
it out. */
|
|
|
|
static size_t pagesize;
|
|
#if NEED_DECLARATION_GETPAGESIZE
|
|
extern int getpagesize PARAMS ((void));
|
|
#endif
|
|
|
|
#define PAGE_ALIGN(addr) (caddr_t) (((long)(addr) + pagesize - 1) & \
|
|
~(pagesize - 1))
|
|
|
|
|
|
/* Return MAP_PRIVATE if MDP represents /dev/zero. Otherwise, return
|
|
MAP_SHARED. */
|
|
|
|
#define MAP_PRIVATE_OR_SHARED(MDP) ((MDP -> flags & MMALLOC_DEVZERO) \
|
|
? MAP_PRIVATE \
|
|
: MAP_SHARED)
|
|
|
|
|
|
/* Get core for the memory region specified by MDP, using SIZE as the
|
|
amount to either add to or subtract from the existing region. Works
|
|
like sbrk(), but using mmap(). */
|
|
|
|
PTR
|
|
__mmalloc_mmap_morecore (mdp, size)
|
|
struct mdesc *mdp;
|
|
int size;
|
|
{
|
|
PTR result = NULL;
|
|
off_t foffset; /* File offset at which new mapping will start */
|
|
size_t mapbytes; /* Number of bytes to map */
|
|
caddr_t moveto; /* Address where we wish to move "break value" to */
|
|
caddr_t mapto; /* Address we actually mapped to */
|
|
char buf = 0; /* Single byte to write to extend mapped file */
|
|
|
|
if (pagesize == 0)
|
|
{
|
|
pagesize = getpagesize ();
|
|
}
|
|
if (size == 0)
|
|
{
|
|
/* Just return the current "break" value. */
|
|
result = mdp -> breakval;
|
|
}
|
|
else if (size < 0)
|
|
{
|
|
/* We are deallocating memory. If the amount requested would cause
|
|
us to try to deallocate back past the base of the mmap'd region
|
|
then do nothing, and return NULL. Otherwise, deallocate the
|
|
memory and return the old break value. */
|
|
if (mdp -> breakval + size >= mdp -> base)
|
|
{
|
|
result = (PTR) mdp -> breakval;
|
|
mdp -> breakval += size;
|
|
moveto = PAGE_ALIGN (mdp -> breakval);
|
|
munmap (moveto, (size_t) (mdp -> top - moveto));
|
|
mdp -> top = moveto;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* We are allocating memory. Make sure we have an open file
|
|
descriptor and then go on to get the memory. */
|
|
if (mdp -> fd < 0)
|
|
{
|
|
result = NULL;
|
|
}
|
|
else if (mdp -> breakval + size > mdp -> top)
|
|
{
|
|
/* The request would move us past the end of the currently
|
|
mapped memory, so map in enough more memory to satisfy
|
|
the request. This means we also have to grow the mapped-to
|
|
file by an appropriate amount, since mmap cannot be used
|
|
to extend a file. */
|
|
moveto = PAGE_ALIGN (mdp -> breakval + size);
|
|
mapbytes = moveto - mdp -> top;
|
|
foffset = mdp -> top - mdp -> base;
|
|
/* FIXME: Test results of lseek() and write() */
|
|
lseek (mdp -> fd, foffset + mapbytes - 1, SEEK_SET);
|
|
write (mdp -> fd, &buf, 1);
|
|
if (mdp -> base == 0)
|
|
{
|
|
/* Let mmap pick the map start address */
|
|
mapto = mmap (0, mapbytes, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE_OR_SHARED (mdp), mdp -> fd, foffset);
|
|
if (mapto != (caddr_t) -1)
|
|
{
|
|
mdp -> base = mdp -> breakval = mapto;
|
|
mdp -> top = mdp -> base + mapbytes;
|
|
result = (PTR) mdp -> breakval;
|
|
mdp -> breakval += size;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mapto = mmap (mdp -> top, mapbytes, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED, mdp -> fd,
|
|
foffset);
|
|
if (mapto == mdp -> top)
|
|
{
|
|
mdp -> top = moveto;
|
|
result = (PTR) mdp -> breakval;
|
|
mdp -> breakval += size;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = (PTR) mdp -> breakval;
|
|
mdp -> breakval += size;
|
|
}
|
|
}
|
|
return (result);
|
|
}
|
|
|
|
PTR
|
|
__mmalloc_remap_core (mdp)
|
|
struct mdesc *mdp;
|
|
{
|
|
caddr_t base;
|
|
|
|
/* FIXME: Quick hack, needs error checking and other attention. */
|
|
|
|
base = mmap (mdp -> base, mdp -> top - mdp -> base,
|
|
PROT_READ | PROT_WRITE, MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED,
|
|
mdp -> fd, 0);
|
|
return ((PTR) base);
|
|
}
|
|
|
|
PTR
|
|
mmalloc_findbase (size)
|
|
int size;
|
|
{
|
|
int fd;
|
|
int flags;
|
|
caddr_t base = NULL;
|
|
|
|
#ifdef MAP_ANONYMOUS
|
|
flags = MAP_PRIVATE | MAP_ANONYMOUS;
|
|
fd = -1;
|
|
#else
|
|
#ifdef MAP_FILE
|
|
flags = MAP_PRIVATE | MAP_FILE;
|
|
#else
|
|
flags = MAP_PRIVATE;
|
|
#endif
|
|
fd = open ("/dev/zero", O_RDWR);
|
|
if (fd != -1)
|
|
{
|
|
return ((PTR) NULL);
|
|
}
|
|
#endif
|
|
base = mmap (0, size, PROT_READ | PROT_WRITE, flags, fd, 0);
|
|
if (base != (caddr_t) -1)
|
|
{
|
|
munmap (base, (size_t) size);
|
|
}
|
|
if (fd != -1)
|
|
{
|
|
close (fd);
|
|
}
|
|
if (base == 0)
|
|
{
|
|
/* Don't allow mapping at address zero. We use that value
|
|
to signal an error return, and besides, it is useful to
|
|
catch NULL pointers if it is unmapped. Instead start
|
|
at the next page boundary. */
|
|
base = (caddr_t) getpagesize ();
|
|
}
|
|
else if (base == (caddr_t) -1)
|
|
{
|
|
base = NULL;
|
|
}
|
|
return ((PTR) base);
|
|
}
|
|
|
|
#else /* defined(HAVE_MMAP) */
|
|
/* Prevent "empty translation unit" warnings from the idiots at X3J11. */
|
|
static char ansi_c_idiots = 69;
|
|
#endif /* defined(HAVE_MMAP) */
|