diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2013-02-14 12:05:10 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2013-02-14 12:05:10 -0800 |
commit | 35b3a27e67b60e547ac8bc9388e7724d1f829959 (patch) | |
tree | 42aabed9384e977d28c33039d7ec6bfffe28e371 /src | |
parent | 9e16c3b44bcf407678563f0bd679c0887ec3011c (diff) | |
download | emacs-35b3a27e67b60e547ac8bc9388e7724d1f829959.tar.gz |
Fix AIX port.
* configure.ac (DATA_START, DATA_SEG_BITS): Set to 0x20000000 on AIX.
(GC_MARK_STACK): Do not set to GC_USE_GCPROS_AS_BEFORE, as that
runs afoul of some other bug in Emacs, and the default value
GC_MAKE_GCPROS_NOOPS has been tested and works.
* src/lisp.h (XPNTR) [!USE_LSB_TAG && DATA_SEG_BITS]:
Fix bug introduced in 2012-07-27 change. DATA_SEG_BITS, if set,
was #undeffed earlier, so it cannot be used as a macro here.
Use the constant and not the macro. Tested on AIX.
* src/unexaix.c: Revert 2013-02-11 and 2013-02-12 changes to this
file. They're almost surely OK but we're just before a release so
we should avoid changes unless they're clearly needed. Instead,
make the following minor change:
(ADDR_CORRECT): New macro.
Fixes: debbugs:13650
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 13 | ||||
-rw-r--r-- | src/lisp.h | 4 | ||||
-rw-r--r-- | src/unexaix.c | 96 |
3 files changed, 64 insertions, 49 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e1b8a23e6b2..e283d2bb48c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2013-02-14 Paul Eggert <eggert@cs.ucla.edu> + + Fix AIX port (Bug#13650). + * lisp.h (XPNTR) [!USE_LSB_TAG && DATA_SEG_BITS]: + Fix bug introduced in 2012-07-27 change. DATA_SEG_BITS, if set, + was #undeffed earlier, so it cannot be used as a macro here. + Use the constant and not the macro. + * unexaix.c: Revert 2013-02-11 and 2013-02-12 changes to this + file. They're almost surely OK but we're just before a release so + we should avoid changes unless they're clearly needed. Instead, + make the following minor change: + (ADDR_CORRECT): New macro. + 2013-02-13 Eli Zaretskii <eliz@gnu.org> * w32proc.c (new_child): If no vacant slots are found in diff --git a/src/lisp.h b/src/lisp.h index a62842c117a..eca3caefd8c 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -496,13 +496,9 @@ static EMACS_INT const VALMASK (XIL ((EMACS_INT) ((EMACS_UINT) (type) << VALBITS) \ + ((intptr_t) (ptr) & VALMASK))) -#if DATA_SEG_BITS /* DATA_SEG_BITS forces extra bits to be or'd in with any pointers which were stored in a Lisp_Object. */ #define XPNTR(a) ((uintptr_t) ((XLI (a) & VALMASK)) | DATA_SEG_BITS)) -#else -#define XPNTR(a) ((uintptr_t) (XLI (a) & VALMASK)) -#endif #endif /* not USE_LSB_TAG */ diff --git a/src/unexaix.c b/src/unexaix.c index da44480fdca..885d7a9f6d7 100644 --- a/src/unexaix.c +++ b/src/unexaix.c @@ -51,8 +51,6 @@ what you give them. Help stamp out software-hoarding! */ #include "getpagesize.h" #include <sys/types.h> -#include <inttypes.h> -#include <stdarg.h> #include <stdio.h> #include <sys/stat.h> #include <errno.h> @@ -61,8 +59,10 @@ what you give them. Help stamp out software-hoarding! */ #include "mem-limits.h" -extern char _data[]; -extern char _text[]; +char *start_of_text (void); /* Start of text */ + +extern int _data; +extern int _text; #include <filehdr.h> #include <aouthdr.h> @@ -71,15 +71,15 @@ extern char _text[]; static struct filehdr f_hdr; /* File header */ static struct aouthdr f_ohdr; /* Optional file header (a.out) */ -static off_t bias; /* Bias to add for growth */ -static off_t lnnoptr; /* Pointer to line-number info within file */ +static long bias; /* Bias to add for growth */ +static long lnnoptr; /* Pointer to line-number info within file */ -static off_t text_scnptr; -static off_t data_scnptr; +static long text_scnptr; +static long data_scnptr; #define ALIGN(val, pwr) (((val) + ((1L<<(pwr))-1)) & ~((1L<<(pwr))-1)) -static off_t load_scnptr; -static off_t orig_load_scnptr; -static off_t orig_data_scnptr; +static long load_scnptr; +static long orig_load_scnptr; +static long orig_data_scnptr; static int unrelocate_symbols (int, int, const char *, const char *); #ifndef MAX_SECTIONS @@ -92,30 +92,26 @@ static int pagemask; #include "lisp.h" -static _Noreturn void +static void report_error (const char *file, int fd) { if (fd) - { - int failed_errno = errno; - close (fd); - errno = failed_errno; - } + close (fd); report_file_error ("Cannot unexec", Fcons (build_string (file), Qnil)); } -#define ERROR0(msg) report_error_1 (new, msg) -#define ERROR1(msg,x) report_error_1 (new, msg, x) -#define ERROR2(msg,x,y) report_error_1 (new, msg, x, y) +#define ERROR0(msg) report_error_1 (new, msg, 0, 0); return -1 +#define ERROR1(msg,x) report_error_1 (new, msg, x, 0); return -1 +#define ERROR2(msg,x,y) report_error_1 (new, msg, x, y); return -1 -static _Noreturn void ATTRIBUTE_FORMAT_PRINTF (2, 3) -report_error_1 (int fd, const char *msg, ...) +#undef ADDR_CORRECT +#define ADDR_CORRECT(x) ((int)(x)) + +static void +report_error_1 (int fd, const char *msg, int a1, int a2) { - va_list ap; close (fd); - va_start (ap, msg); - verror (msg, ap); - va_end (ap); + error (msg, a1, a2); } static int make_hdr (int, int, const char *, const char *); @@ -170,8 +166,8 @@ make_hdr (int new, int a_out, const char *a_name, const char *new_name) { int scns; - uintptr_t bss_start; - uintptr_t data_start; + unsigned int bss_start; + unsigned int data_start; struct scnhdr section[MAX_SECTIONS]; struct scnhdr * f_thdr; /* Text section header */ @@ -186,17 +182,17 @@ make_hdr (int new, int a_out, pagemask = getpagesize () - 1; /* Adjust text/data boundary. */ - data_start = (uintptr_t) _data; + data_start = (long) start_of_data (); + data_start = ADDR_CORRECT (data_start); data_start = data_start & ~pagemask; /* (Down) to page boundary. */ - bss_start = (uintptr_t) sbrk (0) + pagemask; + bss_start = ADDR_CORRECT (sbrk (0)) + pagemask; bss_start &= ~ pagemask; if (data_start > bss_start) /* Can't have negative data size. */ { - ERROR2 (("unexec: data_start (0x%"PRIxPTR - ") can't be greater than bss_start (0x%"PRIxPTR")"), + ERROR2 ("unexec: data_start (%u) can't be greater than bss_start (%u)", data_start, bss_start); } @@ -286,7 +282,7 @@ make_hdr (int new, int a_out, /* fix scnptr's */ { - off_t ptr = section[0].s_scnptr; + ulong ptr = section[0].s_scnptr; bias = -1; for (scns = 0; scns < f_hdr.f_nscns; scns++) @@ -382,12 +378,12 @@ copy_text_and_data (int new) char *end; char *ptr; - lseek (new, text_scnptr, SEEK_SET); - ptr = _text + text_scnptr; + lseek (new, (long) text_scnptr, SEEK_SET); + ptr = start_of_text () + text_scnptr; end = ptr + f_ohdr.tsize; write_segment (new, ptr, end); - lseek (new, data_scnptr, SEEK_SET); + lseek (new, (long) data_scnptr, SEEK_SET); ptr = (char *) f_ohdr.data_start; end = ptr + f_ohdr.dsize; write_segment (new, ptr, end); @@ -400,6 +396,7 @@ static void write_segment (int new, char *ptr, char *end) { int i, nwrite, ret; + char buf[80]; char zeros[UnexBlockSz]; for (i = 0; ptr < end;) @@ -420,13 +417,9 @@ write_segment (int new, char *ptr, char *end) } else if (nwrite != ret) { - int write_errno = errno; - char buf[1000]; - void *addr = ptr; sprintf (buf, - "unexec write failure: addr %p, fileno %d, size 0x%x, wrote 0x%x, errno %d", - addr, new, nwrite, ret, errno); - errno = write_errno; + "unexec write failure: addr 0x%lx, fileno %d, size 0x%x, wrote 0x%x, errno %d", + (unsigned long)ptr, new, nwrite, ret, errno); PERROR (buf); } i += nwrite; @@ -547,13 +540,13 @@ unrelocate_symbols (int new, int a_out, int i; LDHDR ldhdr; LDREL ldrel; - off_t t_reloc = (intptr_t) _text - f_ohdr.text_start; + ulong t_reloc = (ulong) &_text - f_ohdr.text_start; #ifndef ALIGN_DATA_RELOC - off_t d_reloc = (intptr_t) _data - f_ohdr.data_start; + ulong d_reloc = (ulong) &_data - f_ohdr.data_start; #else /* This worked (and was needed) before AIX 4.2. I have no idea why. -- Mike */ - off_t d_reloc = (intptr_t) _data - ALIGN (f_ohdr.data_start, 2); + ulong d_reloc = (ulong) &_data - ALIGN (f_ohdr.data_start, 2); #endif int * p; @@ -638,3 +631,16 @@ unrelocate_symbols (int new, int a_out, } return 0; } + +/* + * Return the address of the start of the text segment prior to + * doing an unexec. After unexec the return value is undefined. + * See crt0.c for further explanation and _start. + * + */ + +char * +start_of_text (void) +{ + return ((char *) 0x10000000); +} |