1 /* Bounded-pointer definitions for PowerPC assembler. 2 Copyright (C) 2000 Free Software Foundation, Inc. 3 Contributed by Greg McGary <greg@mcgary.org> 4 This file is part of the GNU C Library. Its master source is NOT part of 5 the C library, however. The master source lives in the GNU MP Library. 6 7 The GNU C Library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public 9 License as published by the Free Software Foundation; either 10 version 2.1 of the License, or (at your option) any later version. 11 12 The GNU C Library 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 GNU 15 Lesser General Public License for more details. 16 17 You should have received a copy of the GNU Lesser General Public 18 License along with the GNU C Library; if not, write to the Free 19 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 20 02111-1307 USA. */ 21 22 #if __BOUNDED_POINTERS__ 23 24 /* Byte offsets of BP components. */ 25 # define oVALUE 0 26 # define oLOW 4 27 # define oHIGH 8 28 29 /* Don't check bounds, just convert the BP register to its simple 30 pointer value. */ 31 32 # define DISCARD_BOUNDS(rBP) \ 33 lwz rBP, oVALUE(rBP) 34 35 /* Check low bound, with the side effect that the BP register is converted 36 its simple pointer value. Move the high bound into a register for 37 later use. */ 38 39 # define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) \ 40 lwz rHIGH, oHIGH(rBP); \ 41 lwz rLOW, oLOW(rBP); \ 42 lwz rBP, oVALUE(rBP); \ 43 twllt rBP, rLOW 44 45 /* Check the high bound, which is in a register, using the given 46 conditional trap instruction. */ 47 48 # define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) \ 49 TWLcc rVALUE, rHIGH 50 51 /* Check the high bound, which is stored at the return-value's high 52 bound slot, using the given conditional trap instruction. */ 53 54 # define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) \ 55 lwz rHIGH, oHIGH(rRTN); \ 56 TWLcc rVALUE, rHIGH 57 58 /* Check both bounds, with the side effect that the BP register is 59 converted to its simple pointer value. */ 60 61 # define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) \ 62 CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH); \ 63 twlge rBP, rHIGH 64 65 /* Check bounds on a memory region of given length, with the side 66 effect that the BP register is converted to its simple pointer 67 value. */ 68 69 # define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) \ 70 CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \ 71 sub rHIGH, rHIGH, rLENGTH; \ 72 twlgt rBP, rHIGH 73 74 # define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) \ 75 CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \ 76 subi rHIGH, rHIGH, LENGTH; \ 77 twlgt rBP, rHIGH 78 79 /* Store a pointer value register into the return-value's pointer 80 value slot. */ 81 82 # define STORE_RETURN_VALUE(rVALUE) \ 83 stw rVALUE, oVALUE(rRTN) 84 85 /* Store a low and high bounds into the return-value's pointer bounds 86 slots. */ 87 88 # define STORE_RETURN_BOUNDS(rLOW, rHIGH) \ 89 stw rLOW, oLOW(rRTN); \ 90 stw rHIGH, oHIGH(rRTN) 91 92 /* Stuff zero value/low/high into the BP addressed by rRTN. */ 93 94 # define RETURN_NULL_BOUNDED_POINTER \ 95 li r4, 0; \ 96 STORE_RETURN_VALUE (r4); \ 97 STORE_RETURN_BOUNDS (r4, r4) 98 99 #else 100 101 # define DISCARD_BOUNDS(rBP) 102 # define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) 103 # define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) 104 # define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) 105 # define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) 106 # define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) 107 # define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) 108 # define STORE_RETURN_VALUE(rVALUE) 109 # define STORE_RETURN_BOUNDS(rLOW, rHIGH) 110 111 # define RETURN_NULL_BOUNDED_POINTER li rRTN, 0 112 113 #endif 114 115