diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/m/hp800.h | 187 | ||||
| -rw-r--r-- | src/m/sr2k.h | 160 | ||||
| -rw-r--r-- | src/unexhp9k800.c | 322 |
4 files changed, 6 insertions, 669 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index efb8c4b7e71..917377a10f5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2007-01-27 Chong Yidong <cyd@stupidchicken.com> | ||
| 2 | |||
| 3 | * unexhp9k800.c: Remove due to lack of legal papers. | ||
| 4 | |||
| 5 | * m/sr2k.h, m/hp800.h: Remove due to dependence on above. | ||
| 6 | |||
| 1 | 2007-01-27 Eli Zaretskii <eliz@gnu.org> | 7 | 2007-01-27 Eli Zaretskii <eliz@gnu.org> |
| 2 | 8 | ||
| 3 | * keyboard.c (Fthis_command_keys, Fthis_command_keys_vector): Doc fix. | 9 | * keyboard.c (Fthis_command_keys, Fthis_command_keys_vector): Doc fix. |
diff --git a/src/m/hp800.h b/src/m/hp800.h deleted file mode 100644 index f48f4c8152e..00000000000 --- a/src/m/hp800.h +++ /dev/null | |||
| @@ -1,187 +0,0 @@ | |||
| 1 | /* machine description file for hp9000 series 800 machines. | ||
| 2 | Copyright (C) 1987, 2001, 2002, 2003, 2004, 2005, | ||
| 3 | 2006, 2007 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | This file is part of GNU Emacs. | ||
| 6 | |||
| 7 | GNU Emacs is free software; you can redistribute it and/or modify | ||
| 8 | it under the terms of the GNU General Public License as published by | ||
| 9 | the Free Software Foundation; either version 2, or (at your option) | ||
| 10 | any later version. | ||
| 11 | |||
| 12 | GNU Emacs is distributed in the hope that it will be useful, | ||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | GNU General Public License for more details. | ||
| 16 | |||
| 17 | You should have received a copy of the GNU General Public License | ||
| 18 | along with GNU Emacs; see the file COPYING. If not, write to | ||
| 19 | the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 20 | Boston, MA 02110-1301, USA. */ | ||
| 21 | |||
| 22 | |||
| 23 | /* The following line tells the configuration script what sort of | ||
| 24 | operating system this machine is likely to run. | ||
| 25 | USUAL-OPSYS="hpux" */ | ||
| 26 | |||
| 27 | /* Define WORDS_BIG_ENDIAN iff lowest-numbered byte in a word | ||
| 28 | is the most significant byte. */ | ||
| 29 | |||
| 30 | #define WORDS_BIG_ENDIAN | ||
| 31 | |||
| 32 | /* Define NO_ARG_ARRAY if you cannot take the address of the first of a | ||
| 33 | * group of arguments and treat it as an array of the arguments. */ | ||
| 34 | |||
| 35 | #define NO_ARG_ARRAY | ||
| 36 | |||
| 37 | /* Define WORD_MACHINE if addresses and such have | ||
| 38 | * to be corrected before they can be used as byte counts. */ | ||
| 39 | |||
| 40 | #undef WORD_MACHINE | ||
| 41 | |||
| 42 | /* Now define a symbol for the cpu type, if your compiler | ||
| 43 | does not define it automatically: | ||
| 44 | Ones defined so far include vax, m68000, ns16000, pyramid, | ||
| 45 | orion, tahoe, APOLLO and many others */ | ||
| 46 | #ifndef hp9000s800 | ||
| 47 | # define hp9000s800 | ||
| 48 | #endif | ||
| 49 | |||
| 50 | /* Use type int rather than a union, to represent Lisp_Object */ | ||
| 51 | /* This is desirable for most machines. */ | ||
| 52 | |||
| 53 | #define NO_UNION_TYPE | ||
| 54 | |||
| 55 | /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend | ||
| 56 | the bit field into an int. In other words, if bit fields | ||
| 57 | are always unsigned. | ||
| 58 | |||
| 59 | If you use NO_UNION_TYPE, this flag does not matter. */ | ||
| 60 | |||
| 61 | #define EXPLICIT_SIGN_EXTEND | ||
| 62 | |||
| 63 | /* The standard definitions of these macros would work ok, | ||
| 64 | but these are faster because the constants are short. */ | ||
| 65 | |||
| 66 | |||
| 67 | #define XUINT(a) (((unsigned)(a) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS) | ||
| 68 | |||
| 69 | #define XSET(var, type, ptr) \ | ||
| 70 | ((var) = ((int)(type) << VALBITS) + (((unsigned) (ptr) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS)) | ||
| 71 | |||
| 72 | /* Common definitions for HPUX and GNU/Linux. */ | ||
| 73 | |||
| 74 | #if defined (__hpux) || defined (GNU_LINUX) | ||
| 75 | /* Now define a symbol for the cpu type, if your compiler | ||
| 76 | does not define it automatically: | ||
| 77 | Ones defined so far include vax, m68000, ns16000, pyramid, | ||
| 78 | orion, tahoe, APOLLO and many others */ | ||
| 79 | #ifndef hp9000s800 | ||
| 80 | # define hp9000s800 | ||
| 81 | #endif | ||
| 82 | |||
| 83 | /* Define CANNOT_DUMP on machines where unexec does not work. | ||
| 84 | Then the function dump-emacs will not be defined | ||
| 85 | and temacs will do (load "loadup") automatically unless told otherwise. */ | ||
| 86 | |||
| 87 | #undef CANNOT_DUMP | ||
| 88 | |||
| 89 | /* Define NO_REMAP if memory segmentation makes it not work well | ||
| 90 | to change the boundary between the text section and data section | ||
| 91 | when Emacs is dumped. If you define this, the preloaded Lisp | ||
| 92 | code will not be sharable; but that's better than failing completely. */ | ||
| 93 | |||
| 94 | #define NO_REMAP | ||
| 95 | |||
| 96 | #endif /* __hpux or GNU_LINUX */ | ||
| 97 | |||
| 98 | /* Stuff for just GNU/Linux. */ | ||
| 99 | |||
| 100 | #ifdef GNU_LINUX | ||
| 101 | |||
| 102 | /* Data type of load average, as read out of kmem. */ | ||
| 103 | |||
| 104 | #define LOAD_AVE_TYPE long | ||
| 105 | |||
| 106 | /* Convert that into an integer that is 100 for a load average of 1.0 */ | ||
| 107 | |||
| 108 | #define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / FSCALE) | ||
| 109 | |||
| 110 | #endif /* GNU_LINUX */ | ||
| 111 | |||
| 112 | /* Stuff for just HPUX. */ | ||
| 113 | |||
| 114 | #ifdef __hpux | ||
| 115 | |||
| 116 | /* Define VIRT_ADDR_VARIES if the virtual addresses of | ||
| 117 | pure and impure space as loaded can vary, and even their | ||
| 118 | relative order cannot be relied on. | ||
| 119 | |||
| 120 | Otherwise Emacs assumes that text space precedes data space, | ||
| 121 | numerically. */ | ||
| 122 | |||
| 123 | #define VIRT_ADDR_VARIES | ||
| 124 | |||
| 125 | /* the data segment on this machine always starts at address 0x40000000. */ | ||
| 126 | |||
| 127 | #define DATA_SEG_BITS 0x40000000 | ||
| 128 | |||
| 129 | #define DATA_START 0x40000000 | ||
| 130 | #define TEXT_START 0x00000000 | ||
| 131 | |||
| 132 | /* This machine requires completely different unexec code | ||
| 133 | which lives in a separate file. Specify the file name. */ | ||
| 134 | |||
| 135 | #define UNEXEC unexhp9k800.o | ||
| 136 | |||
| 137 | #define LIBS_MACHINE | ||
| 138 | #define LIBS_DEBUG | ||
| 139 | |||
| 140 | /* Include the file bsdtty.h, since this machine has job control. */ | ||
| 141 | #define NEED_BSDTTY | ||
| 142 | |||
| 143 | /* Data type of load average, as read out of kmem. */ | ||
| 144 | |||
| 145 | #define LOAD_AVE_TYPE double | ||
| 146 | |||
| 147 | /* Convert that into an integer that is 100 for a load average of 1.0 */ | ||
| 148 | |||
| 149 | #define LOAD_AVE_CVT(x) ((int) (x * 100.0)) | ||
| 150 | |||
| 151 | /* The symbol in the kernel where the load average is found | ||
| 152 | is named _avenrun. At this time there are two major flavors | ||
| 153 | of hp-ux (there is the s800 and s300 (s200) flavors). The | ||
| 154 | differences are thusly moved to the corresponding machine description file. | ||
| 155 | */ | ||
| 156 | |||
| 157 | /* no underscore please */ | ||
| 158 | #define LDAV_SYMBOL "avenrun" | ||
| 159 | |||
| 160 | #if 0 /* Supposedly no longer true. */ | ||
| 161 | /* In hpux, for unknown reasons, S_IFLNK is defined even though | ||
| 162 | symbolic links do not exist. | ||
| 163 | Make sure our conditionals based on S_IFLNK are not confused. | ||
| 164 | |||
| 165 | Here we assume that stat.h is included before config.h | ||
| 166 | so that we can override it here. */ | ||
| 167 | |||
| 168 | #undef S_IFLNK | ||
| 169 | #endif | ||
| 170 | |||
| 171 | /* On USG systems these have different names. */ | ||
| 172 | |||
| 173 | #define index strchr | ||
| 174 | #define rindex strrchr | ||
| 175 | |||
| 176 | #endif /* __hpux */ | ||
| 177 | |||
| 178 | /* Systems with GCC don't need to lose. */ | ||
| 179 | #ifdef __NetBSD__ | ||
| 180 | # ifdef __GNUC__ | ||
| 181 | # define alloca __builtin_alloca | ||
| 182 | # define HAVE_ALLOCA | ||
| 183 | # endif /* __GNUC__ */ | ||
| 184 | #endif /* __NetBSD__ */ | ||
| 185 | |||
| 186 | /* arch-tag: 809436e6-1645-4b92-b40d-2de5d6e7227c | ||
| 187 | (do not change this comment) */ | ||
diff --git a/src/m/sr2k.h b/src/m/sr2k.h deleted file mode 100644 index 2342bf8ef20..00000000000 --- a/src/m/sr2k.h +++ /dev/null | |||
| @@ -1,160 +0,0 @@ | |||
| 1 | /* machine description file for Hitachi SR2001/SR2201 machines. | ||
| 2 | Copyright (C) 1996, 2001, 2002, 2003, 2004, 2005, | ||
| 3 | 2006, 2007 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | This file is part of GNU Emacs. | ||
| 6 | |||
| 7 | GNU Emacs is free software; you can redistribute it and/or modify | ||
| 8 | it under the terms of the GNU General Public License as published by | ||
| 9 | the Free Software Foundation; either version 2, or (at your option) | ||
| 10 | any later version. | ||
| 11 | |||
| 12 | GNU Emacs is distributed in the hope that it will be useful, | ||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | GNU General Public License for more details. | ||
| 16 | |||
| 17 | You should have received a copy of the GNU General Public License | ||
| 18 | along with GNU Emacs; see the file COPYING. If not, write to | ||
| 19 | the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 20 | Boston, MA 02110-1301, USA. */ | ||
| 21 | |||
| 22 | |||
| 23 | /* The following line tells the configuration script what sort of | ||
| 24 | operating system this machine is likely to run. | ||
| 25 | USUAL-OPSYS="hpux" */ | ||
| 26 | |||
| 27 | /* Define WORDS_BIG_ENDIAN iff lowest-numbered byte in a word | ||
| 28 | is the most significant byte. */ | ||
| 29 | |||
| 30 | #define WORDS_BIG_ENDIAN | ||
| 31 | |||
| 32 | /* Define NO_ARG_ARRAY if you cannot take the address of the first of a | ||
| 33 | * group of arguments and treat it as an array of the arguments. */ | ||
| 34 | |||
| 35 | #define NO_ARG_ARRAY | ||
| 36 | |||
| 37 | /* Define WORD_MACHINE if addresses and such have | ||
| 38 | * to be corrected before they can be used as byte counts. */ | ||
| 39 | |||
| 40 | #undef WORD_MACHINE | ||
| 41 | |||
| 42 | /* Now define a symbol for the cpu type, if your compiler | ||
| 43 | does not define it automatically: | ||
| 44 | Ones defined so far include vax, m68000, ns16000, pyramid, | ||
| 45 | orion, tahoe, APOLLO and many others */ | ||
| 46 | #ifndef hp9000s800 | ||
| 47 | # define hp9000s800 | ||
| 48 | #endif | ||
| 49 | |||
| 50 | /* Use type int rather than a union, to represent Lisp_Object */ | ||
| 51 | /* This is desirable for most machines. */ | ||
| 52 | |||
| 53 | #define NO_UNION_TYPE | ||
| 54 | |||
| 55 | /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend | ||
| 56 | the bit field into an int. In other words, if bit fields | ||
| 57 | are always unsigned. | ||
| 58 | |||
| 59 | If you use NO_UNION_TYPE, this flag does not matter. */ | ||
| 60 | |||
| 61 | #define EXPLICIT_SIGN_EXTEND | ||
| 62 | |||
| 63 | /* The standard definitions of these macros would work ok, | ||
| 64 | but these are faster because the constants are short. */ | ||
| 65 | |||
| 66 | |||
| 67 | #define XUINT(a) (((unsigned)(a) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS) | ||
| 68 | |||
| 69 | #define XSET(var, type, ptr) \ | ||
| 70 | ((var) = ((int)(type) << VALBITS) + (((unsigned) (ptr) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS)) | ||
| 71 | |||
| 72 | /* #ifdef __hpux */ | ||
| 73 | /* Now define a symbol for the cpu type, if your compiler | ||
| 74 | does not define it automatically: | ||
| 75 | Ones defined so far include vax, m68000, ns16000, pyramid, | ||
| 76 | orion, tahoe, APOLLO and many others */ | ||
| 77 | |||
| 78 | #ifndef hp9000s800 | ||
| 79 | # define hp9000s800 | ||
| 80 | #endif | ||
| 81 | |||
| 82 | |||
| 83 | /* Data type of load average, as read out of kmem. */ | ||
| 84 | |||
| 85 | #define LOAD_AVE_TYPE double | ||
| 86 | |||
| 87 | /* Convert that into an integer that is 100 for a load average of 1.0 */ | ||
| 88 | |||
| 89 | #define LOAD_AVE_CVT(x) ((int) (x * 100.0)) | ||
| 90 | |||
| 91 | |||
| 92 | /* Define CANNOT_DUMP on machines where unexec does not work. | ||
| 93 | Then the function dump-emacs will not be defined | ||
| 94 | and temacs will do (load "loadup") automatically unless told otherwise. */ | ||
| 95 | |||
| 96 | #undef CANNOT_DUMP | ||
| 97 | |||
| 98 | /* Define VIRT_ADDR_VARIES if the virtual addresses of | ||
| 99 | pure and impure space as loaded can vary, and even their | ||
| 100 | relative order cannot be relied on. | ||
| 101 | |||
| 102 | Otherwise Emacs assumes that text space precedes data space, | ||
| 103 | numerically. */ | ||
| 104 | |||
| 105 | #define VIRT_ADDR_VARIES | ||
| 106 | |||
| 107 | /* the data segment on this machine always starts at address 0x40000000. */ | ||
| 108 | |||
| 109 | #define DATA_SEG_BITS 0x40000000 | ||
| 110 | |||
| 111 | #define DATA_START 0x40000000 | ||
| 112 | #define TEXT_START 0x00000000 | ||
| 113 | |||
| 114 | /* Define NO_REMAP if memory segmentation makes it not work well | ||
| 115 | to change the boundary between the text section and data section | ||
| 116 | when Emacs is dumped. If you define this, the preloaded Lisp | ||
| 117 | code will not be sharable; but that's better than failing completely. */ | ||
| 118 | |||
| 119 | #define NO_REMAP | ||
| 120 | |||
| 121 | /* This machine requires completely different unexec code | ||
| 122 | which lives in a separate file. Specify the file name. */ | ||
| 123 | |||
| 124 | #define UNEXEC unexhp9k800.o | ||
| 125 | |||
| 126 | #define LIBS_MACHINE | ||
| 127 | #define LIBS_DEBUG | ||
| 128 | |||
| 129 | /* Include the file bsdtty.h, since this machine has job control. */ | ||
| 130 | /* #define NEED_BSDTTY */ | ||
| 131 | |||
| 132 | /* The symbol in the kernel where the load average is found | ||
| 133 | is named _avenrun. At this time there are two major flavors | ||
| 134 | of hp-ux (there is the s800 and s300 (s200) flavors). The | ||
| 135 | differences are thusly moved to the corresponding machine description file. | ||
| 136 | */ | ||
| 137 | |||
| 138 | /* no underscore please */ | ||
| 139 | #define LDAV_SYMBOL "avenrun" | ||
| 140 | |||
| 141 | #if 0 /* Supposedly no longer true. */ | ||
| 142 | /* In hpux, for unknown reasons, S_IFLNK is defined even though | ||
| 143 | symbolic links do not exist. | ||
| 144 | Make sure our conditionals based on S_IFLNK are not confused. | ||
| 145 | |||
| 146 | Here we assume that stat.h is included before config.h | ||
| 147 | so that we can override it here. */ | ||
| 148 | |||
| 149 | #undef S_IFLNK | ||
| 150 | #endif | ||
| 151 | |||
| 152 | /* On USG systems these have different names. */ | ||
| 153 | |||
| 154 | #define index strchr | ||
| 155 | #define rindex strrchr | ||
| 156 | |||
| 157 | /* #endif */ | ||
| 158 | |||
| 159 | /* arch-tag: 4ced5b51-ffe6-4be1-9954-eb40657023a5 | ||
| 160 | (do not change this comment) */ | ||
diff --git a/src/unexhp9k800.c b/src/unexhp9k800.c deleted file mode 100644 index 146cc5707da..00000000000 --- a/src/unexhp9k800.c +++ /dev/null | |||
| @@ -1,322 +0,0 @@ | |||
| 1 | /* Unexec for HP 9000 Series 800 machines. | ||
| 2 | Bob Desinger <hpsemc!bd@hplabs.hp.com> | ||
| 3 | |||
| 4 | Note that the GNU project considers support for HP operation a | ||
| 5 | peripheral activity which should not be allowed to divert effort | ||
| 6 | from development of the GNU system. Changes in this code will be | ||
| 7 | installed when users send them in, but aside from that we don't | ||
| 8 | plan to think about it, or about whether other Emacs maintenance | ||
| 9 | might break it. | ||
| 10 | |||
| 11 | |||
| 12 | Unexec creates a copy of the old a.out file, and replaces the old data | ||
| 13 | area with the current data area. When the new file is executed, the | ||
| 14 | process will see the same data structures and data values that the | ||
| 15 | original process had when unexec was called. | ||
| 16 | |||
| 17 | Unlike other versions of unexec, this one copies symbol table and | ||
| 18 | debug information to the new a.out file. Thus, the new a.out file | ||
| 19 | may be debugged with symbolic debuggers. | ||
| 20 | |||
| 21 | If you fix any bugs in this, I'd like to incorporate your fixes. | ||
| 22 | Send them to uunet!hpda!hpsemc!jmorris or jmorris%hpsemc@hplabs.HP.COM. | ||
| 23 | |||
| 24 | CAVEATS: | ||
| 25 | This routine saves the current value of all static and external | ||
| 26 | variables. This means that any data structure that needs to be | ||
| 27 | initialized must be explicitly reset. Variables will not have their | ||
| 28 | expected default values. | ||
| 29 | |||
| 30 | Unfortunately, the HP-UX signal handler has internal initialization | ||
| 31 | flags which are not explicitly reset. Thus, for signals to work in | ||
| 32 | conjunction with this routine, the following code must executed when | ||
| 33 | the new process starts up. | ||
| 34 | |||
| 35 | void _sigreturn (); | ||
| 36 | ... | ||
| 37 | sigsetreturn (_sigreturn); | ||
| 38 | */ | ||
| 39 | |||
| 40 | #ifdef emacs | ||
| 41 | #include <config.h> | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #include <stdio.h> | ||
| 45 | #include <fcntl.h> | ||
| 46 | #include <errno.h> | ||
| 47 | |||
| 48 | #include <a.out.h> | ||
| 49 | |||
| 50 | #ifdef HPUX_USE_SHLIBS | ||
| 51 | #include <dl.h> | ||
| 52 | #endif | ||
| 53 | |||
| 54 | /* brk value to restore, stored as a global. | ||
| 55 | This is really used only if we used shared libraries. */ | ||
| 56 | static long brk_on_dump = 0; | ||
| 57 | |||
| 58 | /* Called from main, if we use shared libraries. */ | ||
| 59 | int | ||
| 60 | run_time_remap (ignored) | ||
| 61 | char *ignored; | ||
| 62 | { | ||
| 63 | brk ((char *) brk_on_dump); | ||
| 64 | } | ||
| 65 | |||
| 66 | #undef roundup | ||
| 67 | #define roundup(x,n) (((x) + ((n) - 1)) & ~((n) - 1)) /* n is power of 2 */ | ||
| 68 | #define min(x,y) (((x) < (y)) ? (x) : (y)) | ||
| 69 | |||
| 70 | |||
| 71 | /* Create a new a.out file, same as old but with current data space */ | ||
| 72 | |||
| 73 | unexec (new_name, old_name, new_end_of_text, dummy1, dummy2) | ||
| 74 | char new_name[]; /* name of the new a.out file to be created */ | ||
| 75 | char old_name[]; /* name of the old a.out file */ | ||
| 76 | char *new_end_of_text; /* ptr to new edata/etext; NOT USED YET */ | ||
| 77 | int dummy1, dummy2; /* not used by emacs */ | ||
| 78 | { | ||
| 79 | int old, new; | ||
| 80 | int old_size, new_size; | ||
| 81 | struct header hdr; | ||
| 82 | struct som_exec_auxhdr auxhdr; | ||
| 83 | long i; | ||
| 84 | |||
| 85 | /* For the greatest flexibility, should create a temporary file in | ||
| 86 | the same directory as the new file. When everything is complete, | ||
| 87 | rename the temp file to the new name. | ||
| 88 | This way, a program could update its own a.out file even while | ||
| 89 | it is still executing. If problems occur, everything is still | ||
| 90 | intact. NOT implemented. */ | ||
| 91 | |||
| 92 | /* Open the input and output a.out files */ | ||
| 93 | old = open (old_name, O_RDONLY); | ||
| 94 | if (old < 0) | ||
| 95 | { perror (old_name); exit (1); } | ||
| 96 | new = open (new_name, O_CREAT|O_RDWR|O_TRUNC, 0777); | ||
| 97 | if (new < 0) | ||
| 98 | { perror (new_name); exit (1); } | ||
| 99 | |||
| 100 | /* Read the old headers */ | ||
| 101 | read_header (old, &hdr, &auxhdr); | ||
| 102 | |||
| 103 | brk_on_dump = (long) sbrk (0); | ||
| 104 | |||
| 105 | /* Decide how large the new and old data areas are */ | ||
| 106 | old_size = auxhdr.exec_dsize; | ||
| 107 | /* I suspect these two statements are separate | ||
| 108 | to avoid a compiler bug in hpux version 8. */ | ||
| 109 | i = (long) sbrk (0); | ||
| 110 | new_size = i - auxhdr.exec_dmem; | ||
| 111 | |||
| 112 | /* Copy the old file to the new, up to the data space */ | ||
| 113 | lseek (old, 0, 0); | ||
| 114 | copy_file (old, new, auxhdr.exec_dfile); | ||
| 115 | |||
| 116 | /* Skip the old data segment and write a new one */ | ||
| 117 | lseek (old, old_size, 1); | ||
| 118 | save_data_space (new, &hdr, &auxhdr, new_size); | ||
| 119 | |||
| 120 | /* Copy the rest of the file */ | ||
| 121 | copy_rest (old, new); | ||
| 122 | |||
| 123 | /* Update file pointers since we probably changed size of data area */ | ||
| 124 | update_file_ptrs (new, &hdr, &auxhdr, auxhdr.exec_dfile, new_size-old_size); | ||
| 125 | |||
| 126 | /* Save the modified header */ | ||
| 127 | write_header (new, &hdr, &auxhdr); | ||
| 128 | |||
| 129 | /* Close the binary file */ | ||
| 130 | close (old); | ||
| 131 | close (new); | ||
| 132 | return 0; | ||
| 133 | } | ||
| 134 | |||
| 135 | /* Save current data space in the file, update header. */ | ||
| 136 | |||
| 137 | save_data_space (file, hdr, auxhdr, size) | ||
| 138 | int file; | ||
| 139 | struct header *hdr; | ||
| 140 | struct som_exec_auxhdr *auxhdr; | ||
| 141 | int size; | ||
| 142 | { | ||
| 143 | /* Write the entire data space out to the file */ | ||
| 144 | if (write (file, auxhdr->exec_dmem, size) != size) | ||
| 145 | { perror ("Can't save new data space"); exit (1); } | ||
| 146 | |||
| 147 | /* Update the header to reflect the new data size */ | ||
| 148 | auxhdr->exec_dsize = size; | ||
| 149 | auxhdr->exec_bsize = 0; | ||
| 150 | } | ||
| 151 | |||
| 152 | /* Update the values of file pointers when something is inserted. */ | ||
| 153 | |||
| 154 | update_file_ptrs (file, hdr, auxhdr, location, offset) | ||
| 155 | int file; | ||
| 156 | struct header *hdr; | ||
| 157 | struct som_exec_auxhdr *auxhdr; | ||
| 158 | unsigned int location; | ||
| 159 | int offset; | ||
| 160 | { | ||
| 161 | struct subspace_dictionary_record subspace; | ||
| 162 | int i; | ||
| 163 | |||
| 164 | /* Increase the overall size of the module */ | ||
| 165 | hdr->som_length += offset; | ||
| 166 | |||
| 167 | /* Update the various file pointers in the header */ | ||
| 168 | #define update(ptr) if (ptr > location) ptr = ptr + offset | ||
| 169 | update (hdr->aux_header_location); | ||
| 170 | update (hdr->space_strings_location); | ||
| 171 | update (hdr->init_array_location); | ||
| 172 | update (hdr->compiler_location); | ||
| 173 | update (hdr->symbol_location); | ||
| 174 | update (hdr->fixup_request_location); | ||
| 175 | update (hdr->symbol_strings_location); | ||
| 176 | update (hdr->unloadable_sp_location); | ||
| 177 | update (auxhdr->exec_tfile); | ||
| 178 | update (auxhdr->exec_dfile); | ||
| 179 | |||
| 180 | /* Do for each subspace dictionary entry */ | ||
| 181 | lseek (file, hdr->subspace_location, 0); | ||
| 182 | for (i = 0; i < hdr->subspace_total; i++) | ||
| 183 | { | ||
| 184 | if (read (file, &subspace, sizeof (subspace)) != sizeof (subspace)) | ||
| 185 | { perror ("Can't read subspace record"); exit (1); } | ||
| 186 | |||
| 187 | /* If subspace has a file location, update it */ | ||
| 188 | if (subspace.initialization_length > 0 | ||
| 189 | && subspace.file_loc_init_value > location) | ||
| 190 | { | ||
| 191 | subspace.file_loc_init_value += offset; | ||
| 192 | lseek (file, -sizeof (subspace), 1); | ||
| 193 | if (write (file, &subspace, sizeof (subspace)) != sizeof (subspace)) | ||
| 194 | { perror ("Can't update subspace record"); exit (1); } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | /* Do for each initialization pointer record */ | ||
| 199 | /* (I don't think it applies to executable files, only relocatables) */ | ||
| 200 | #undef update | ||
| 201 | } | ||
| 202 | |||
| 203 | /* Read in the header records from an a.out file. */ | ||
| 204 | |||
| 205 | read_header (file, hdr, auxhdr) | ||
| 206 | int file; | ||
| 207 | struct header *hdr; | ||
| 208 | struct som_exec_auxhdr *auxhdr; | ||
| 209 | { | ||
| 210 | |||
| 211 | /* Read the header in */ | ||
| 212 | lseek (file, 0, 0); | ||
| 213 | if (read (file, hdr, sizeof (*hdr)) != sizeof (*hdr)) | ||
| 214 | { perror ("Couldn't read header from a.out file"); exit (1); } | ||
| 215 | |||
| 216 | if (hdr->a_magic != EXEC_MAGIC && hdr->a_magic != SHARE_MAGIC | ||
| 217 | && hdr->a_magic != DEMAND_MAGIC) | ||
| 218 | { | ||
| 219 | fprintf (stderr, "a.out file doesn't have legal magic number\n"); | ||
| 220 | exit (1); | ||
| 221 | } | ||
| 222 | |||
| 223 | lseek (file, hdr->aux_header_location, 0); | ||
| 224 | if (read (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr)) | ||
| 225 | { | ||
| 226 | perror ("Couldn't read auxiliary header from a.out file"); | ||
| 227 | exit (1); | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | /* Write out the header records into an a.out file. */ | ||
| 232 | |||
| 233 | write_header (file, hdr, auxhdr) | ||
| 234 | int file; | ||
| 235 | struct header *hdr; | ||
| 236 | struct som_exec_auxhdr *auxhdr; | ||
| 237 | { | ||
| 238 | /* Update the checksum */ | ||
| 239 | hdr->checksum = calculate_checksum (hdr); | ||
| 240 | |||
| 241 | /* Write the header back into the a.out file */ | ||
| 242 | lseek (file, 0, 0); | ||
| 243 | if (write (file, hdr, sizeof (*hdr)) != sizeof (*hdr)) | ||
| 244 | { perror ("Couldn't write header to a.out file"); exit (1); } | ||
| 245 | lseek (file, hdr->aux_header_location, 0); | ||
| 246 | if (write (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr)) | ||
| 247 | { perror ("Couldn't write auxiliary header to a.out file"); exit (1); } | ||
| 248 | } | ||
| 249 | |||
| 250 | /* Calculate the checksum of a SOM header record. */ | ||
| 251 | |||
| 252 | calculate_checksum (hdr) | ||
| 253 | struct header *hdr; | ||
| 254 | { | ||
| 255 | int checksum, i, *ptr; | ||
| 256 | |||
| 257 | checksum = 0; ptr = (int *) hdr; | ||
| 258 | |||
| 259 | for (i = 0; i < sizeof (*hdr) / sizeof (int) - 1; i++) | ||
| 260 | checksum ^= ptr[i]; | ||
| 261 | |||
| 262 | return (checksum); | ||
| 263 | } | ||
| 264 | |||
| 265 | /* Copy size bytes from the old file to the new one. */ | ||
| 266 | |||
| 267 | copy_file (old, new, size) | ||
| 268 | int new, old; | ||
| 269 | int size; | ||
| 270 | { | ||
| 271 | int len; | ||
| 272 | int buffer[8192]; /* word aligned will be faster */ | ||
| 273 | |||
| 274 | for (; size > 0; size -= len) | ||
| 275 | { | ||
| 276 | len = min (size, sizeof (buffer)); | ||
| 277 | if (read (old, buffer, len) != len) | ||
| 278 | { perror ("Read failure on a.out file"); exit (1); } | ||
| 279 | if (write (new, buffer, len) != len) | ||
| 280 | { perror ("Write failure in a.out file"); exit (1); } | ||
| 281 | } | ||
| 282 | } | ||
| 283 | |||
| 284 | /* Copy the rest of the file, up to EOF. */ | ||
| 285 | |||
| 286 | copy_rest (old, new) | ||
| 287 | int new, old; | ||
| 288 | { | ||
| 289 | int buffer[4096]; | ||
| 290 | int len; | ||
| 291 | |||
| 292 | /* Copy bytes until end of file or error */ | ||
| 293 | while ((len = read (old, buffer, sizeof (buffer))) > 0) | ||
| 294 | if (write (new, buffer, len) != len) break; | ||
| 295 | |||
| 296 | if (len != 0) | ||
| 297 | { perror ("Unable to copy the rest of the file"); exit (1); } | ||
| 298 | } | ||
| 299 | |||
| 300 | #ifdef DEBUG | ||
| 301 | display_header (hdr, auxhdr) | ||
| 302 | struct header *hdr; | ||
| 303 | struct som_exec_auxhdr *auxhdr; | ||
| 304 | { | ||
| 305 | /* Display the header information (debug) */ | ||
| 306 | printf ("\n\nFILE HEADER\n"); | ||
| 307 | printf ("magic number %d \n", hdr->a_magic); | ||
| 308 | printf ("text loc %.8x size %d \n", auxhdr->exec_tmem, auxhdr->exec_tsize); | ||
| 309 | printf ("data loc %.8x size %d \n", auxhdr->exec_dmem, auxhdr->exec_dsize); | ||
| 310 | printf ("entry %x \n", auxhdr->exec_entry); | ||
| 311 | printf ("Bss segment size %u\n", auxhdr->exec_bsize); | ||
| 312 | printf ("\n"); | ||
| 313 | printf ("data file loc %d size %d\n", | ||
| 314 | auxhdr->exec_dfile, auxhdr->exec_dsize); | ||
| 315 | printf ("som_length %d\n", hdr->som_length); | ||
| 316 | printf ("unloadable sploc %d size %d\n", | ||
| 317 | hdr->unloadable_sp_location, hdr->unloadable_sp_size); | ||
| 318 | } | ||
| 319 | #endif /* DEBUG */ | ||
| 320 | |||
| 321 | /* arch-tag: d55a09ac-9427-4ec4-8496-cb9d7710774f | ||
| 322 | (do not change this comment) */ | ||