Commit c3b5f109 authored by Dan Nicolaescu's avatar Dan Nicolaescu
Browse files

* m/mips.h: Remove boilerplate comments and code for systems that

 do not use this file.
* m/arm.h (SIGN_EXTEND_CHAR): Remove, unused.
* unexmips.c: Remove file, unused.
parent 6b0273cd
2008-07-16 Dan Nicolaescu <>
* m/mips.h: Remove boilerplate comments and code for systems that
do not use this file.
* m/arm.h (SIGN_EXTEND_CHAR): Remove, unused.
* unexmips.c: Remove file, unused.
* editfns.c (Fuser_full_name): Replace the only use of
USER_FULL_NAME with its value.
* Regenerate.
......@@ -34,11 +34,6 @@ along with GNU Emacs. If not, see <>. */
/* Define how to take a char and sign-extend into an int.
On machines where char is signed, this is a no-op. */
#define SIGN_EXTEND_CHAR(c) (((int)(c) << 24) >> 24)
#define NO_REMAP
/* arch-tag: 07856f0c-f0c8-4bd8-99af-0b7fa1e5ee42
......@@ -23,8 +23,7 @@ along with GNU Emacs. If not, see <>. */
Use mips4.h for RISCOS version 4; use s-bsd4-3.h with the BSD world.
Note that the proper m file for the Decstation is pmax.h.
This is only used on GNU/Linux.
/* Define WORDS_BIG_ENDIAN if lowest-numbered byte in a word
......@@ -39,15 +38,8 @@ NOTE-END */
#define NO_ARG_ARRAY
/* Define how to take a char and sign-extend into an int.
On machines where char is signed, this is a no-op. */
#define SIGN_EXTEND_CHAR(c) ((signed char)(c))
/* Now define a symbol for the cpu type, if your compiler
does not define it automatically:
Ones defined so far include vax, m68000, ns16000, pyramid,
orion, tahoe, APOLLO and many others */
does not define it automatically. */
#ifndef mips
# define mips
......@@ -68,28 +60,6 @@ NOTE-END */
#define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / 256.0)
/* CDC EP/IX 1.4.3 uses /unix */
#ifndef __linux__
#define KERNEL_FILE "/unix"
#endif /* not __linux__ */
/* Define CANNOT_DUMP on machines where unexec does not work.
Then the function dump-emacs will not be defined
and temacs will do (load "loadup") automatically unless told otherwise. */
/* Define VIRT_ADDR_VARIES if the virtual addresses of
pure and impure space as loaded can vary, and even their
relative order cannot be relied on.
Otherwise Emacs assumes that text space precedes data space,
numerically. */
/* #define VIRT_ADDR_VARIES */
/* Define NO_REMAP if memory segmentation makes it not work well
to change the boundary between the text section and data section
when Emacs is dumped. If you define this, the preloaded Lisp
......@@ -97,59 +67,12 @@ NOTE-END */
#define NO_REMAP
/* This machine requires completely different unexec code
which lives in a separate file. Specify the file name. */
#if !defined(__linux__) && !defined(__NetBSD__)
#undef UNEXEC
#define UNEXEC unexmips.o
#endif /* not __linux__ && not __NetBSD__ */
/* Describe layout of the address space in an executing process. */
#ifdef __linux__
#define TEXT_START 0x00400000
#define DATA_START 0x10000000
#define DATA_SEG_BITS 0x10000000
#else /* not __linux__ */
#define TEXT_START 0x400000
#define DATA_START 0x800000
#endif /* __linux__ */
/* Alter some of the options used when linking. */
#if !defined(__linux__)
/* DECstations don't have this library.
#define LIBS_MACHINE -lmld */
#define LD_SWITCH_MACHINE -D 800000
#define LIBS_DEBUG
#if defined (__NetBSD__) || defined (__OpenBSD__)
#else /* bsd with elf */
#define LINKER /bsd43/bin/ld
#define LD_SWITCH_MACHINE -D 800000 -g3
#define START_FILES pre-crt0.o /usr/lib/crt1.o
#define LIB_STANDARD -lbsd -lc /usr/lib/crtn.o
#define LIBS_TERMCAP -lcurses
#define C_SWITCH_MACHINE -I/usr/include/bsd
#define C_DEBUG_SWITCH -O -g3
#endif /* bsd with elf */
#else /* not BSD_SYSTEM */
#if defined(__GNUC__) && defined(_ABIN32)
#define LIBS_MACHINE -lmld
#endif /* not BSD_SYSTEM */
#endif /* not __linux__ */
/* The standard definitions of these macros would work ok,
but these are faster because the constants are short. */
......@@ -160,47 +83,6 @@ NOTE-END */
((var) = \
((int)(type) << VALBITS) \
+ (((unsigned) (ptr) << (BITS_PER_INT-VALBITS)) >> (BITS_PER_INT-VALBITS)))
#if !defined (__linux__)
#ifdef USG
/* Cancel certain parts of standard sysV support. */
#undef static
/* Don't try to use SIGIO or FIONREAD even though they are defined. */
/* Describe special kernel features. */
#if defined(emacs)
#include <bsd/sys/time.h>
/* The `select' in the system won't work for pipes, so don't use it. */
#undef HAVE_SELECT /* override configuration decision */
#define HAVE_PTYS
/* ??? */
#define IRIS
#endif /* USG */
#define COFF
#define TERMINFO
#undef MAIL_USE_FLOCK /* Someone should check this. */
#endif /* BSD_SYSTEM */
#endif /* not __linux__ */
/* arch-tag: 8fd020ee-78a7-4d87-96ce-6129f52f7bee
(do not change this comment) */
/* Unexec for MIPS (including IRIS4D).
Note that the GNU project considers support for MIPS operation
a peripheral activity which should not be allowed to divert effort
from development of the GNU system. Changes in this code will be
installed when users send them in, but aside from that
we don't plan to think about it, or about whether other Emacs
maintenance might break it.
Copyright (C) 1988, 1994, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <>. */
#include <config.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
#include <varargs.h>
#ifdef MACH
#include <a.out.h>
/* I don't know why this isn't defined. */
#ifndef STYP_INIT
#define STYP_INIT 0x80000000
/* I don't know why this isn't defined. */
#ifndef _RDATA
#define _RDATA ".rdata"
#define STYP_RDATA 0x00000100
/* Small ("near") data section. */
#ifndef _SDATA
#define _SDATA ".sdata"
#define STYP_SDATA 0x00000200
/* Small ("near") bss section. */
#ifndef _SBSS
#define _SBSS ".sbss"
#define STYP_SBSS 0x00000400
/* We don't seem to have a sym.h or syms.h anywhere, so we'll do it the
hard way. This stinks. */
typedef struct {
short magic;
short vstamp;
long ilineMax;
struct { long foo, offset; } offsets[11];
#else /* not MACH */
#include <filehdr.h>
#include <aouthdr.h>
#include <scnhdr.h>
#include <sym.h>
#endif /* not MACH */
#if defined (IRIS_4D)
#include "getpagesize.h"
#include <fcntl.h>
static void fatal_unexec ();
static void mark_x ();
#define READ(_fd, _buffer, _size, _error_message, _error_arg) \
errno = EEOF; \
if (read (_fd, _buffer, _size) != _size) \
fatal_unexec (_error_message, _error_arg);
#define WRITE(_fd, _buffer, _size, _error_message, _error_arg) \
if (write (_fd, _buffer, _size) != _size) \
fatal_unexec (_error_message, _error_arg);
#define SEEK(_fd, _position, _error_message, _error_arg) \
errno = EEOF; \
if (lseek (_fd, _position, L_SET) != _position) \
fatal_unexec (_error_message, _error_arg);
extern int errno;
extern char *strerror ();
#define EEOF -1
static struct scnhdr *text_section;
static struct scnhdr *init_section;
static struct scnhdr *finit_section;
static struct scnhdr *rdata_section;
static struct scnhdr *data_section;
static struct scnhdr *lit8_section;
static struct scnhdr *lit4_section;
static struct scnhdr *sdata_section;
static struct scnhdr *sbss_section;
static struct scnhdr *bss_section;
struct headers {
struct filehdr fhdr;
struct aouthdr aout;
struct scnhdr section[10];
/* Define name of label for entry point for the dumped executable. */
unexec (new_name, a_name, data_start, bss_start, entry_address)
char *new_name, *a_name;
unsigned data_start, bss_start, entry_address;
int new, old;
int pagesize, brk;
int newsyms, symrel;
int nread;
struct headers hdr;
int i;
int vaddr, scnptr;
#define BUFSIZE 8192
char buffer[BUFSIZE];
old = open (a_name, O_RDONLY, 0);
if (old < 0) fatal_unexec ("opening %s", a_name);
new = creat (new_name, 0666);
if (new < 0) fatal_unexec ("creating %s", new_name);
hdr = *((struct headers *)TEXT_START);
if (hdr.fhdr.f_magic != MIPSELMAGIC
&& hdr.fhdr.f_magic != MIPSEBMAGIC)
fprintf (stderr, "unexec: input file magic number is %x, not %x or %x.\n",
hdr.fhdr.f_magic, MIPSELMAGIC, MIPSEBMAGIC);
exit (1);
if (hdr.fhdr.f_opthdr != sizeof (hdr.aout))
fprintf (stderr, "unexec: input a.out header is %d bytes, not %d.\n",
hdr.fhdr.f_opthdr, sizeof (hdr.aout));
exit (1);
if (hdr.aout.magic != ZMAGIC)
fprintf (stderr, "unexec: input file a.out magic number is %o, not %o.\n",
hdr.aout.magic, ZMAGIC);
exit (1);
#define CHECK_SCNHDR(ptr, name, flags) \
ptr = NULL; \
for (i = 0; i < hdr.fhdr.f_nscns && !ptr; i++) \
if (strcmp (hdr.section[i].s_name, name) == 0) \
{ \
if (hdr.section[i].s_flags != flags) \
fprintf (stderr, "unexec: %x flags (%x expected) in %s section.\n", \
hdr.section[i].s_flags, flags, name); \
ptr = hdr.section + i; \
} \
CHECK_SCNHDR (text_section, _TEXT, STYP_TEXT);
CHECK_SCNHDR (init_section, _INIT, STYP_INIT);
CHECK_SCNHDR (data_section, _DATA, STYP_DATA);
#ifdef _LIT8
CHECK_SCNHDR (lit8_section, _LIT8, STYP_LIT8);
CHECK_SCNHDR (lit4_section, _LIT4, STYP_LIT4);
#endif /* _LIT8 */
CHECK_SCNHDR (sbss_section, _SBSS, STYP_SBSS);
CHECK_SCNHDR (bss_section, _BSS, STYP_BSS);
#if 0 /* Apparently this error check goes off on irix 3.3,
but it doesn't indicate a real problem. */
if (i != hdr.fhdr.f_nscns)
fprintf (stderr, "unexec: %d sections found instead of %d.\n",
i, hdr.fhdr.f_nscns);
text_section->s_scnptr = 0;
pagesize = getpagesize ();
/* Casting to int avoids compiler error on NEWS-OS 5.0.2. */
brk = (((int) (sbrk (0))) + pagesize - 1) & (-pagesize);
hdr.aout.dsize = brk - DATA_START;
hdr.aout.bsize = 0;
if (entry_address == 0)
hdr.aout.entry = (unsigned)DEFAULT_ENTRY_ADDRESS;
hdr.aout.entry = entry_address;
hdr.aout.bss_start = hdr.aout.data_start + hdr.aout.dsize;
rdata_section->s_size = data_start - DATA_START;
/* Adjust start and virtual addresses of rdata_section, too. */
rdata_section->s_vaddr = DATA_START;
rdata_section->s_paddr = DATA_START;
rdata_section->s_scnptr = text_section->s_scnptr + hdr.aout.tsize;
data_section->s_vaddr = data_start;
data_section->s_paddr = data_start;
data_section->s_size = brk - data_start;
data_section->s_scnptr = rdata_section->s_scnptr + rdata_section->s_size;
vaddr = data_section->s_vaddr + data_section->s_size;
scnptr = data_section->s_scnptr + data_section->s_size;
if (lit8_section != NULL)
lit8_section->s_vaddr = vaddr;
lit8_section->s_paddr = vaddr;
lit8_section->s_size = 0;
lit8_section->s_scnptr = scnptr;
if (lit4_section != NULL)
lit4_section->s_vaddr = vaddr;
lit4_section->s_paddr = vaddr;
lit4_section->s_size = 0;
lit4_section->s_scnptr = scnptr;
if (sdata_section != NULL)
sdata_section->s_vaddr = vaddr;
sdata_section->s_paddr = vaddr;
sdata_section->s_size = 0;
sdata_section->s_scnptr = scnptr;
if (sbss_section != NULL)
sbss_section->s_vaddr = vaddr;
sbss_section->s_paddr = vaddr;
sbss_section->s_size = 0;
sbss_section->s_scnptr = scnptr;
if (bss_section != NULL)
bss_section->s_vaddr = vaddr;
bss_section->s_paddr = vaddr;
bss_section->s_size = 0;
bss_section->s_scnptr = scnptr;
WRITE (new, (char *)TEXT_START, hdr.aout.tsize,
"writing text section to %s", new_name);
WRITE (new, (char *)DATA_START, hdr.aout.dsize,
"writing data section to %s", new_name);
SEEK (old, hdr.fhdr.f_symptr, "seeking to start of symbols in %s", a_name);
errno = EEOF;
nread = read (old, buffer, BUFSIZE);
if (nread < sizeof (HDRR)) fatal_unexec ("reading symbols from %s", a_name);
newsyms = hdr.aout.tsize + hdr.aout.dsize;
symrel = newsyms - hdr.fhdr.f_symptr;
hdr.fhdr.f_symptr = newsyms;
#define symhdr ((pHDRR)buffer)
#ifdef MACH
for (i = 0; i < 11; i++)
symhdr->offsets[i].offset += symrel;
symhdr->cbLineOffset += symrel;
symhdr->cbDnOffset += symrel;
symhdr->cbPdOffset += symrel;
symhdr->cbSymOffset += symrel;
symhdr->cbOptOffset += symrel;
symhdr->cbAuxOffset += symrel;
symhdr->cbSsOffset += symrel;
symhdr->cbSsExtOffset += symrel;
symhdr->cbFdOffset += symrel;
symhdr->cbRfdOffset += symrel;
symhdr->cbExtOffset += symrel;
#undef symhdr
if (write (new, buffer, nread) != nread)
fatal_unexec ("writing symbols to %s", new_name);
nread = read (old, buffer, BUFSIZE);
if (nread < 0) fatal_unexec ("reading symbols from %s", a_name);
#undef BUFSIZE
} while (nread != 0);
SEEK (new, 0, "seeking to start of header in %s", new_name);
WRITE (new, &hdr, sizeof (hdr),
"writing header of %s", new_name);
close (old);
close (new);
mark_x (new_name);
* mark_x
* After successfully building the new a.out, mark it executable
static void
mark_x (name)
char *name;
struct stat sbuf;
int um = umask (777);
umask (um);
if (stat (name, &sbuf) < 0)
fatal_unexec ("getting protection on %s", name);
sbuf.st_mode |= 0111 & ~um;
if (chmod (name, sbuf.st_mode) < 0)
fatal_unexec ("setting protection on %s", name);
static void
fatal_unexec (s, va_alist)
va_list ap;
if (errno == EEOF)
fputs ("unexec: unexpected end of file, ", stderr);
fprintf (stderr, "unexec: %s, ", strerror (errno));
va_start (ap);
_doprnt (s, ap, stderr);
fputs (".\n", stderr);
exit (1);
/* arch-tag: ebdd2058-3bbc-4de4-b5c7-5760379ab153
(do not change this comment) */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment