1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 0 stevel * Common Development and Distribution License, Version 1.0 only 6 0 stevel * (the "License"). You may not use this file except in compliance 7 0 stevel * with the License. 8 0 stevel * 9 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel * or http://www.opensolaris.org/os/licensing. 11 0 stevel * See the License for the specific language governing permissions 12 0 stevel * and limitations under the License. 13 0 stevel * 14 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel * If applicable, add the following below this CDDL HEADER, with the 17 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel * 20 0 stevel * CDDL HEADER END 21 0 stevel */ 22 0 stevel /* 23 0 stevel * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 0 stevel * Use is subject to license terms. 25 0 stevel */ 26 0 stevel 27 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 28 0 stevel 29 0 stevel /* 30 0 stevel * Adr memory based encoding 31 0 stevel */ 32 0 stevel 33 0 stevel #include <sys/feature_tests.h> 34 0 stevel 35 0 stevel #pragma weak adr_ushort = adr_short 36 0 stevel #pragma weak adr_uint32 = adr_int32 37 0 stevel #pragma weak adr_uint64 = adr_int64 38 0 stevel #pragma weak adr_getushort = adr_getshort 39 0 stevel #pragma weak adr_getuint32 = adr_getint32 40 0 stevel #pragma weak adr_getuint64 = adr_getint64 41 0 stevel 42 0 stevel #include <sys/types.h> 43 0 stevel #include <sys/t_lock.h> 44 0 stevel #include <sys/systm.h> 45 0 stevel #include <sys/mutex.h> 46 0 stevel #include <sys/thread.h> 47 0 stevel #include <c2/audit.h> 48 0 stevel #include <c2/audit_kernel.h> 49 0 stevel #include <c2/audit_record.h> 50 0 stevel 51 0 stevel void 52 0 stevel adr_start(adr_t *adr, char *p) 53 0 stevel { 54 0 stevel adr->adr_stream = p; 55 0 stevel adr->adr_now = p; 56 0 stevel } 57 0 stevel 58 0 stevel int 59 0 stevel adr_count(adr_t *adr) 60 0 stevel { 61 0 stevel return ((int)((uintptr_t)adr->adr_now - (uintptr_t)adr->adr_stream)); 62 0 stevel } 63 0 stevel 64 0 stevel 65 0 stevel /* 66 0 stevel * adr_char - pull out characters 67 0 stevel */ 68 0 stevel void 69 0 stevel adr_char(adr_t *adr, char *cp, int count) 70 0 stevel { 71 0 stevel while (count-- > 0) 72 0 stevel *adr->adr_now++ = *cp++; 73 0 stevel } 74 0 stevel 75 0 stevel /* 76 0 stevel * adr_short - pull out shorts 77 0 stevel */ 78 0 stevel void 79 0 stevel adr_short(adr_t *adr, short *sp, int count) 80 0 stevel { 81 0 stevel 82 0 stevel for (; count-- > 0; sp++) { 83 0 stevel *adr->adr_now++ = (char)((*sp >> (int)8) & 0x00ff); 84 0 stevel *adr->adr_now++ = (char)(*sp & 0x00ff); 85 0 stevel } 86 0 stevel } 87 0 stevel 88 0 stevel /* 89 0 stevel * adr_int32 - pull out int32 90 0 stevel */ 91 0 stevel void 92 0 stevel adr_int32(adr_t *adr, int32_t *lp, int count) 93 0 stevel { 94 0 stevel int i; /* index for counting */ 95 0 stevel int32_t l; /* value for shifting */ 96 0 stevel 97 0 stevel for (; count-- > 0; lp++) { 98 0 stevel for (i = 0, l = *lp; i < 4; i++) { 99 0 stevel *adr->adr_now++ = (char)((l & (int32_t)0xff000000) >> 100 0 stevel (int)24); 101 0 stevel l <<= (int)8; 102 0 stevel } 103 0 stevel } 104 0 stevel } 105 0 stevel 106 0 stevel /* 107 0 stevel * adr_int64 - pull out int64 108 0 stevel */ 109 0 stevel void 110 0 stevel adr_int64(adr_t *adr, int64_t *lp, int count) 111 0 stevel { 112 0 stevel int i; /* index for counting */ 113 0 stevel int64_t l; /* value for shifting */ 114 0 stevel 115 0 stevel for (; count-- > 0; lp++) { 116 0 stevel for (i = 0, l = *lp; i < 8; i++) { 117 0 stevel *adr->adr_now++ = 118 0 stevel (char)((l & (int64_t)0xff00000000000000) >> (int)56); 119 0 stevel l <<= (int)8; 120 0 stevel } 121 0 stevel } 122 0 stevel } 123 0 stevel 124 0 stevel 125 0 stevel char * 126 0 stevel adr_getchar(adr_t *adr, char *cp) 127 0 stevel { 128 0 stevel char *old; 129 0 stevel 130 0 stevel old = adr->adr_now; 131 0 stevel *cp = *adr->adr_now++; 132 0 stevel return (old); 133 0 stevel } 134 0 stevel 135 0 stevel char * 136 0 stevel adr_getshort(adr_t *adr, short *sp) 137 0 stevel { 138 0 stevel char *old; 139 0 stevel 140 0 stevel old = adr->adr_now; 141 0 stevel *sp = *adr->adr_now++; 142 0 stevel *sp >>= (int)8; 143 0 stevel *sp = *adr->adr_now++; 144 0 stevel *sp >>= (int)8; 145 0 stevel return (old); 146 0 stevel } 147 0 stevel 148 0 stevel char * 149 0 stevel adr_getint32(adr_t *adr, int32_t *lp) 150 0 stevel { 151 0 stevel char *old; 152 0 stevel int i; 153 0 stevel 154 0 stevel old = adr->adr_now; 155 0 stevel for (i = 0; i < 4; i++) { 156 0 stevel *lp <<= 8; 157 0 stevel *lp += ((int32_t)*adr->adr_now++) & 0x000000ff; 158 0 stevel 159 0 stevel } 160 0 stevel return (old); 161 0 stevel } 162 0 stevel 163 0 stevel char * 164 0 stevel adr_getint64(adr_t *adr, int64_t *lp) 165 0 stevel { 166 0 stevel char *old; 167 0 stevel int i; 168 0 stevel 169 0 stevel old = adr->adr_now; 170 0 stevel for (i = 0; i < 8; i++) { 171 0 stevel *lp <<= 8; 172 0 stevel *lp += ((int64_t)*adr->adr_now++) & 0x00000000000000ff; 173 0 stevel } 174 0 stevel return (old); 175 0 stevel } 176