|
|
1.1.1.7 ! root 1: /* platform.h - computer platform customization for PGP ! 2: multiprecision math package. #Included in mpilib.h. ! 3: */ ! 4: #ifndef PLATFORM_H ! 5: #define PLATFORM_H ! 6: ! 7: /* Platform customization: ! 8: * A version which runs on almost any computer can be implemented by ! 9: * defining PORTABLE and MPORTABLE, preferably as a command line ! 10: * parameter. Faster versions can be generated by specifying specific ! 11: * parameters, such as size of unit and MULTUNIT, and by supplying some ! 12: * of the critical in assembly. ! 13: * ! 14: * This file holds customizations for different environments. ! 15: * This is done in one of two ways: ! 16: * 1. A symbol is defined on the command line which designates a ! 17: * particular environment, such as MSDOS. This file detects the ! 18: * environment symbol and sets the appropriate low-level defines. ! 19: * ! 20: * 2. If no environment is named, the low-level defines are set in ! 21: * the same manner as for PGP 2.0, thereby providing an easy upgrade. ! 22: * ! 23: * Following are a description of the low-level definition symbols: ! 24: * ! 25: * The following preprocessor symbols should be conditionally set to ! 26: * optimize for a particular environment. ! 27: * ! 28: * Define one of the following: ! 29: * UNIT8, UNIT16, or UNIT32 - specifies size of operands for ! 30: * multiprecision add, subtract, shift, and initialization operations. ! 31: * Define one of the following: ! 32: * MUNIT8, MUNIT16, MUNIT32 - specified size of operands for ! 33: * multiprecision multiply and mod_mult. This must be less than or ! 34: * equal to unit size. It should be the word size for the native ! 35: * atomic multiply instruction. For a 16x16 bit multiply yielding a ! 36: * 32-bit product, MUNIT16 should be set. ! 37: * Define one (or more) of the following: ! 38: * PEASANT, MERRITT, UPTON, SMITH -algorithm used for modmult.All defined ! 39: * algorithms are compiled, but the first defined name listed will be ! 40: * assigned to the generic entry point symbols. Multiple algorithms are ! 41: * used primarily for testing. ! 42: * HIGHFIRST - specified if longs are stored with the most significant ! 43: * bit at the lowest address (Motorola), undefined otherwise. This should ! 44: * be defined on the command line, normally in the makefile. ! 45: * ! 46: * The following symbol, if initialized, is set to specific values: ! 47: * ALIGN - variable declaration attribute which forces optimum alignment ! 48: * of words, e.g. for VAX C: ALIGN=_align(quadword) ! 49: * ! 50: * The following symbols correspond to individual multiprecision routines ! 51: * that may be implemented with assembly language. If they are implemented ! 52: * in assembly, the symbols should be defined with the name of the ! 53: * corresponding external entry points, e.g., mp_addc=P_ADDC ! 54: * mp_setp - set precision for external routines ! 55: * mp_addc - add with carry ! 56: * mp_subb - subtract with borrow ! 57: * mp_rotate_left - rotate left ! 58: * mp_compare - compare ! 59: * mp_move - move ! 60: * unitfill0 - zero fill ! 61: * mp_smul - multiply vector by single word * ! 62: * mp_smula - multiply vector by single word and accumulate * ! 63: * mp_dmul - full multiply ! 64: * mp_set_recip - setup for mp_quo_digit ! 65: * mp_quo_digit - quotient digit for modulus reduction ! 66: * ! 67: * Either mp_smul or mp_smula should be defined. mp_smula provides ! 68: * for accumulation to an existing value, while mp_smul is for use of the ! 69: * older definition of mp_smul, used in PGP 2.0, which assumed that the high ! 70: * order accumulator word is zero. Use of mp_smula causes one less word of ! 71: * precision to be used, thereby slightly increasing speed. ! 72: */ ! 73: ! 74: /******************************************************************** ! 75: * Environment customization. Please send any additions or corrections ! 76: * to Philip Zimmermann. ! 77: */ ! 78: #ifndef PORTABLE ! 79: ! 80: #ifdef MSDOS ! 81: #ifndef i386 /* gcc */ ! 82: #define UNIT16 ! 83: #define MUNIT16 ! 84: #define mp_setp P_SETP ! 85: #define mp_addc P_ADDC ! 86: #define mp_subb P_SUBB ! 87: #define mp_rotate_left P_ROTL ! 88: #define mp_smula P_SMULA ! 89: #define mp_quo_digit P_QUO_DIGIT ! 90: #define mp_set_recip P_SETRECIP ! 91: #define SMITH ! 92: #define PLATFORM_SPECIFIED ! 93: #endif /* i386 */ ! 94: #endif /* MSDOS */ ! 95: ! 96: #ifdef VMS ! 97: ! 98: #ifdef __DECC ! 99: #define _VMS_DECC /* Compiler is DECC */ ! 100: #ifdef __alpha ! 101: #define _VMS_ALPHA /* Platform alpha */ ! 102: #define _VMS_T_PLATFORM "DECC/Alpha" ! 103: #endif ! 104: #ifdef __vax ! 105: #define _VMS_VAX /* Platform VAX */ ! 106: #define _VMS_T_PLATFORM "DECC/VAX" ! 107: #endif ! 108: #else /* #ifdef __DECC */ ! 109: #ifdef VAXC ! 110: #define _VMS_VAX /* Platform _must_ be VAX for VAXC w/o __DECC */ ! 111: #define _VMS_VAXC /* Compiler _is_ VAXC */ ! 112: #define _VMS_T_PLATFORM "VAXC/VAX" ! 113: #endif /* #ifdef VAXC */ ! 114: #endif /* #else (#ifdef __DECC) */ ! 115: ! 116: #define UNIT32 /* use 32-bit units */ ! 117: #define MUNIT16 /* not used in C code, only in assembler */ ! 118: #define UPTON ! 119: #ifndef __ALPHA ! 120: #define mp_setp p_setp ! 121: #define mp_addc p_addc ! 122: #define mp_subb p_subb ! 123: #define mp_rotate_left p_rotl ! 124: #define mp_smul p_smul ! 125: #define mp_dmul p_dmul ! 126: #define mp_compare p_cmp ! 127: #endif ! 128: #define ALIGN _align(quadword) ! 129: ! 130: #pragma builtins ! 131: #ifdef __DECC ! 132: #define mp_move( dst, src) memcpy((char *) dst,(char *) src, global_precision*4) ! 133: #define unitfill0( r, unitcount) memset( (char *) r, 0, unitcount*4) ! 134: #define mp_burn(r) memset( (char *) r, 0, global_precision*4) ! 135: #define mp_init0(r) mp_burn(r) /* Just for documentation purposes */ ! 136: #else ! 137: #define mp_move( dst, src) _MOVC3( global_precision*4, (char *) src, (char *) dst) ! 138: #define unitfill0( r, unitcount) _MOVC5( 0, (char *) 0, 0, unitcount*4, (char *) r) ! 139: #define mp_burn(r) _MOVC5(0, (char *) 0, 0, global_precision*4, (char *) r) ! 140: #define mp_init0(r) mp_burn(r) /* Just for documentation purposes */ ! 141: #endif /* __DECC */ ! 142: ! 143: #define PLATFORM_SPECIFIED ! 144: #endif /* #ifdef VMS */ ! 145: ! 146: #if defined(mips) || defined(__mips) ! 147: /* ! 148: * Needs r3kd.s and r3000.s (or r3000.c) ! 149: */ ! 150: #define UNIT32 ! 151: #define MUNIT32 ! 152: #define SMITH ! 153: #define mp_dmul p_dmul ! 154: #define mp_setp p_setp ! 155: #define mp_addc p_addc ! 156: #define mp_subb p_subb ! 157: #define mp_rotate_left p_rotl ! 158: #define mp_smula p_smula ! 159: #define mp_quo_digit p_quo_digit ! 160: #define mp_set_recip p_setrecip ! 161: #define PLATFORM_SPECIFIED ! 162: #endif /* mips */ ! 163: ! 164: #ifdef i386 ! 165: /* ! 166: * Needs 80386.S ! 167: */ ! 168: #define UNIT32 ! 169: #define MUNIT32 ! 170: #define SMITH ! 171: #define mp_setp P_SETP ! 172: #define mp_addc P_ADDC ! 173: #define mp_subb P_SUBB ! 174: #define mp_rotate_left P_ROTL ! 175: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 176: #define mp_smula P_SMULA ! 177: #define mp_quo_digit p_quo_digit ! 178: #define mp_set_recip p_setrecip ! 179: #define PLATFORM_SPECIFIED ! 180: #endif /* i386 */ ! 181: ! 182: #ifdef sparc ! 183: /* ! 184: * Needs sparc.s ! 185: */ ! 186: #define UNIT32 ! 187: #define MERRITT ! 188: #define mp_setp P_SETP ! 189: #define mp_addc P_ADDC ! 190: #define mp_subb P_SUBB ! 191: #define mp_rotate_left P_ROTL ! 192: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 193: #define PLATFORM_SPECIFIED ! 194: #endif /* sparc */ ! 195: ! 196: #if defined(mc68000) || defined(mc68020) ! 197: /* ! 198: * Needs mc68020.S ! 199: */ ! 200: #define UNIT32 ! 201: #define mp_setp P_SETP ! 202: #define mp_addc P_ADDC ! 203: #define mp_subb P_SUBB ! 204: #define mp_rotate_left P_ROTL ! 205: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 206: #if defined(sun3) || defined(mc68020) ! 207: # define UPTON ! 208: # define MUNIT32 ! 209: # define mp_smul P_SMUL ! 210: /* # define mp_dmul P_DMUL */ /* mc68020.s has a bug in P_DMUL */ ! 211: #else ! 212: # define SMITH ! 213: # define MUNIT16 ! 214: #endif ! 215: #define PLATFORM_SPECIFIED ! 216: #endif /* mc68000 */ ! 217: ! 218: #ifdef AMIGA ! 219: #define UNIT32 ! 220: #define mp_addc P_ADDC ! 221: #define mp_subb P_SUBB ! 222: #define mp_rotate_left P_ROTL ! 223: #define mp_setp P_SETP ! 224: #ifdef _M68020 ! 225: #define mp_smul P_SMUL ! 226: #define UPTON ! 227: #define MUNIT32 /* 32-bit multiplies for >=68020 */ ! 228: #else /* _M68020 */ ! 229: #define SMITH ! 230: #define MUNIT16 ! 231: #endif /* _M68020 */ ! 232: #define PLATFORM_SPECIFIED ! 233: #endif /* AMIGA */ ! 234: ! 235: /* ! 236: * Notes on the WIN32 port: (David Boreham [email protected]) ! 237: * ! 238: * The port is very lightweight, save for the assembler routines for MP arithmetic. ! 239: * In general, the old DOS code is used, except where it is broken for NT and Win95, ! 240: * for example we don't use short pathnames or fold filenames to lowercase. ! 241: * The MP arithmetic routines in PGP can work in a portable mode using the MERRITT ! 242: * code. This is very much slower than Thad Smith's code. Unfortunately, Thad's ! 243: * code assumes that sizeof(long) > sizeof (int), which is not the case in Win32. ! 244: * This means that his C code will not work. I have re-implemented his 8086 assembler ! 245: * in 386 code, optimised for the Pentium pipeline. This works fine and if you're ! 246: * building for one of the 386 compatible processors (386, 486, Pentium, clones etc.) ! 247: * define USE_WIN_ASSEMBLER in the project options and build that version. ! 248: * If you're building for another processor (PowerPC, MIPS, Alpha) then you need to ! 249: * either a) write assembler routines for those processors (and send the code back ! 250: * for inclusion in the distribution) or b) use the portable, slower, code by not ! 251: * defining USE_WIN32_ASSEMBLER. ! 252: * The assembler code needs the Microsoft compiler. The non-assembler version ! 253: * should work with any compiler. I've not tested any other compilers. ! 254: * I've done extensive profiling on this and other versions of PGP on NT. ! 255: * Some of the optimisations I've tried out are not in this code because they ! 256: * didn't give a significant performance improvement, but did make the code ! 257: * rather un-portable back to the other supported platforms (DOS, OS/2 etc). ! 258: * Lastly, if you're underwhelmed by the speed of this PGP compared to the ! 259: * old 16-bit DOS version, don't blame me: PGP uses the IDEA encryption ! 260: * system, which is inherently 16-bit. It also suffers from some rather ! 261: * poor I/O code design, which can soak up performance on a proper operating ! 262: * system. ! 263: */ ! 264: #ifdef WIN32 ! 265: #define UNIT32 ! 266: #ifdef USE_WIN32_ASSEMBLER ! 267: #define SMITH ! 268: #define MUNIT32 ! 269: #else ! 270: #define MERRITT ! 271: #endif ! 272: #define PLATFORM_SPECIFIED ! 273: #endif ! 274: ! 275: #ifdef MACTC5 ! 276: /* ! 277: * needs mp_macasm.c ! 278: */ ! 279: #define UNIT32 ! 280: #if defined(M68030) || defined(CODEWARRIOR) /* 680[234]0 capable */ ! 281: #define MUNIT32 ! 282: #else ! 283: #define MUNIT16 ! 284: #endif ! 285: #define mp_setp P_SETP ! 286: #define mp_addc P_ADDC ! 287: #define mp_subb P_SUBB ! 288: #define mp_smul P_SMUL ! 289: #define mp_rotate_left P_ROTL ! 290: #define UPTON ! 291: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 292: #define PLATFORM_SPECIFIED ! 293: #endif /* MACTC5 */ ! 294: ! 295: #ifdef ATARI ! 296: #define UNIT32 ! 297: #define MUNIT16 ! 298: #define mp_setp P_SETP ! 299: #define mp_addc P_ADDC ! 300: #define mp_subb P_SUBB ! 301: #define mp_smul P_SMUL ! 302: #define mp_rotate_left P_ROTL ! 303: #define UPTON ! 304: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 305: #define PLATFORM_SPECIFIED ! 306: #endif /* ATARI */ ! 307: ! 308: /* Add additional platforms here ... */ ! 309: ! 310: /**************** End of system specification ************************/ ! 311: ! 312: #ifndef PLATFORM_SPECIFIED ! 313: /* No platform explicitly selected. Customization is controlled by ! 314: * PORTABLE and MPORTABLE. ! 315: */ ! 316: #define mp_setp P_SETP ! 317: #define mp_addc P_ADDC ! 318: #define mp_subb P_SUBB ! 319: #define mp_rotate_left P_ROTL ! 320: #define UPTON ! 321: #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit)) ! 322: #ifndef MPORTABLE ! 323: #define mp_smul P_SMUL ! 324: #endif /* MPORTABLE */ ! 325: #endif /* PLATFORM_SPECIFIED */ ! 326: #endif /* PORTABLE */ ! 327: #endif /* PLATFORM_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.