Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | /*---------------------------------------------------------------- * compatibility macros for AWE32 driver *----------------------------------------------------------------*/ /* redefine following macros */ #undef IOCTL_IN #undef IOCTL_OUT #undef OUTW #undef COPY_FROM_USER #undef COPY_TO_USER #undef GET_BYTE_FROM_USER #undef GET_SHORT_FROM_USER #undef IOCTL_TO_USER #ifdef linux /*================================================================ * Linux macros *================================================================*/ /* use inline prefix */ #define INLINE inline /*---------------------------------------------------------------- * memory management for linux *----------------------------------------------------------------*/ #ifdef AWE_OBSOLETE_VOXWARE /* old type linux system */ /* i/o requests; nothing */ #define awe_check_port() 0 /* always false */ #define awe_request_region() /* nothing */ #define awe_release_region() /* nothing */ static int _mem_start; /* memory pointer for permanent buffers */ #define my_malloc_init(memptr) _mem_start = (memptr) #define my_malloc_memptr() _mem_start #define my_free(ptr) /* do nothing */ #define my_realloc(buf,oldsize,size) NULL /* no realloc */ static void *my_malloc(int size) { char *ptr; PERMANENT_MALLOC(ptr, char*, size, _mem_start); return (void*)ptr; } /* allocate buffer only once */ #define INIT_TABLE(buffer,index,nums,type) {\ buffer = my_malloc(sizeof(type) * (nums)); index = (nums);\ } #else #define AWE_DYNAMIC_BUFFER #define my_malloc_init(ptr) /* nothing */ #define my_malloc_memptr() 0 #define my_malloc(size) vmalloc(size) #define my_free(ptr) if (ptr) {vfree(ptr);} static void *my_realloc(void *buf, int oldsize, int size) { void *ptr; if ((ptr = vmalloc(size)) == NULL) return NULL; memcpy(ptr, buf, ((oldsize < size) ? oldsize : size) ); vfree(buf); return ptr; } /* do not allocate buffer at beginning */ #define INIT_TABLE(buffer,index,nums,type) {buffer=NULL; index=0;} /* old type macro */ #define RET_ERROR(err) -err #endif /*---------------------------------------------------------------- * i/o interfaces for linux *----------------------------------------------------------------*/ #define OUTW(data,addr) outw(data, addr) #ifdef AWE_NEW_KERNEL_INTERFACE #define COPY_FROM_USER(target,source,offs,count) \ copy_from_user(target, (source)+(offs), count) #define GET_BYTE_FROM_USER(target,addr,offs) \ get_user(target, (unsigned char*)&((addr)[offs])) #define GET_SHORT_FROM_USER(target,addr,offs) \ get_user(target, (unsigned short*)&((addr)[offs])) #ifdef AWE_OSS38_AND_IM_A_BANANA #define IOCTL_TO_USER(target,offs,source,count) \ memcpy(target, (source)+(offs), count) #define IO_WRITE_CHECK(cmd) (_SIOC_DIR(cmd) & _IOC_WRITE) #else #define IOCTL_TO_USER(target,offs,source,count) \ copy_to_user(target, (source)+(offs), count) #define IO_WRITE_CHECK(cmd) (_IOC_DIR(cmd) & _IOC_WRITE) #endif /* AWE_OSS38 */ #define COPY_TO_USER IOCTL_TO_USER #define IOCTL_IN(arg) (*(int*)(arg)) #define IOCTL_OUT(arg,val) (*(int*)(arg) = (val)) #else /* old type i/o */ #define COPY_FROM_USER(target,source,offs,count) \ memcpy_fromfs(target, (source)+(offs), (count)) #define GET_BYTE_FROM_USER(target,addr,offs) \ *((char *)&(target)) = get_fs_byte((addr)+(offs)) #define GET_SHORT_FROM_USER(target,addr,offs) \ *((short *)&(target)) = get_fs_word((addr)+(offs)) #define IOCTL_TO_USER(target,offs,source,count) \ memcpy_tofs(target, (source)+(offs), (count)) #define COPY_TO_USER IOCTL_TO_USER #define IO_WRITE_CHECK(cmd) (cmd & IOC_IN) #define IOCTL_IN(arg) get_fs_long((long *)(arg)) #define IOCTL_OUT(arg,ret) snd_ioctl_return((int *)arg, ret) #endif /* AWE_NEW_KERNEL_INTERFACE */ #define BZERO(target,len) memset(target, 0, len) #define MEMCPY(dst,src,len) memcpy(dst, src, len) #elif defined(__FreeBSD__) /*================================================================ * FreeBSD macros *================================================================*/ /* inline is not checked yet.. maybe it'll work */ #define INLINE /*inline*/ /*---------------------------------------------------------------- * memory management for freebsd *----------------------------------------------------------------*/ /* i/o requests; nothing */ #define awe_check_port() 0 /* always false */ #define awe_request_region() /* nothing */ #define awe_release_region() /* nothing */ #define AWE_DYNAMIC_BUFFER #define my_malloc_init(ptr) /* nothing */ #define my_malloc_memptr() 0 #define my_malloc(size) malloc(size, M_TEMP, M_WAITOK) #define my_free(ptr) if (ptr) {free(ptr, M_TEMP);} #define INIT_TABLE(buffer,index,nums,type) {buffer=NULL; index=0;} /* it should be realloc? */ static void *my_realloc(void *buf, int oldsize, int size) { void *ptr; if ((ptr = my_malloc(size)) == NULL) return NULL; memcpy(ptr, buf, ((oldsize < size) ? oldsize : size) ); my_free(buf); return ptr; } /*---------------------------------------------------------------- * i/o interfaces for freebsd *----------------------------------------------------------------*/ /* according to linux rule; the arguments are swapped */ #define OUTW(data,addr) outw(addr, data) #define COPY_FROM_USER(target,source,offs,count) \ uiomove(((caddr_t)(target)),(count),((struct uio *)(source))) #define COPY_TO_USER(target,source,offs,count) \ uiomove(((caddr_t)(source)),(count),((struct uio *)(target))) #define GET_BYTE_FROM_USER(target,addr,offs) \ uiomove(((char*)&(target)), 1, ((struct uio *)(addr))) #define GET_SHORT_FROM_USER(target,addr,offs) \ uiomove(((char*)&(target)), 2, ((struct uio *)(addr))) #define IOCTL_TO_USER(target,offs,source,count) \ memcpy(&((target)[offs]), (source), (count)) #define IO_WRITE_CHECK(cmd) (cmd & IOC_IN) #define IOCTL_IN(arg) (*(int*)(arg)) #define IOCTL_OUT(arg,val) (*(int*)(arg) = (val)) #define BZERO(target,len) bzero((caddr_t)target, len) #define MEMCPY(dst,src,len) bcopy((caddr_t)src, (caddr_t)dst, len) #endif |