1/* 2 * sys32.S: I-cache tricks for 32-bit compatability layer simple 3 * conversions. 4 * 5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 6 * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) 7 * Copyright (C) 2000 Ken Aaker (kdaaker@rchland.vnet.ibm.com) 8 * For PPC ABI convention is parms in Regs 3-10. 9 * The router in entry.S clears the high 32 bits in the first 10 * 4 arguments (R3-R6). 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 15 * 2 of the License, or (at your option) any later version. 16 */ 17 18#include "ppc_asm.h" 19#include <asm/errno.h> 20#include <asm/processor.h> 21 22 .text 23 24_GLOBAL(sys32_mmap) 25 clrldi r7, r7, 32 /* int fd parm */ 26 clrldi r8, r8, 32 /* off_t offset parm */ 27 b .sys_mmap 28 29_GLOBAL(sys32_lseek) 30 extsw r4,r4 /* sign extend off_t offset parm */ 31 b .sys_lseek 32 33_GLOBAL(sys32_sendto) 34 clrldi r7, r7, 32 /* struct sockaddr *addr parm */ 35 clrldi r8, r8, 32 /* int addr_len parm */ 36 b .sys_sendto 37 38_GLOBAL(sys32_recvfrom) 39 clrldi r7, r7, 32 /* struct sockaddr *addr parm */ 40 clrldi r8, r8, 32 /* int *addr_len parm */ 41 b .sys_recvfrom 42 43_GLOBAL(sys32_getsockopt) 44 clrldi r7, r7, 32 /* int *optlen parm */ 45 b .sys_getsockopt 46 47_GLOBAL(sys32_bdflush) 48 extsw r4,r4 /* sign extend long data parm */ 49 b .sys_bdflush 50 51_GLOBAL(ppc32_mmap2) 52 clrldi r7, r7, 32 /* unsigned long fd parm */ 53 clrldi r8, r8, 32 /* unsigned long pgoff */ 54 b .sys32_mmap2 55 56_GLOBAL(sys32_socketcall) /* r3=call, r4=args */ 57 cmpwi r3, 1 58 blt- .do_einval 59 cmpwi r3, 17 60 bgt- .do_einval 61 subi r3, r3, 1 /* index into socketcall_table vectors and jmp */ 62 sldi r3, r3, 3 /* each entry is 8 bytes */ 63 LOADADDR(r10,.socketcall_table_begin) 64 ldx r10, r10, r3 65 mtctr r10 66 bctr 67 68/* Socket function vectored fix ups for 32 bit */ 69_STATIC(do_sys_socket) /* sys_socket(int, int, int) */ 70 mr r10,r4 71 lwa r3,0(r10) 72 lwa r4,4(r10) 73 lwa r5,8(r10) 74 b .sys_socket 75 76_STATIC(do_sys_bind) /* sys_bind(int fd, struct sockaddr *, int) */ 77 mr r10,r4 78 lwa r3,0(r10) 79 lwz r4,4(r10) 80 lwa r5,8(r10) 81 b .sys_bind 82 83_STATIC(do_sys_connect) /* sys_connect(int, struct sockaddr *, int) */ 84 mr r10,r4 85 lwa r3,0(r10) 86 lwz r4,4(r10) 87 lwa r5,8(r10) 88 b .sys_connect 89 90_STATIC(do_sys_listen) /* sys_listen(int, int) */ 91 mr r10,r4 92 lwa r3,0(r10) 93 lwa r4,4(r10) 94 b .sys_listen 95 96_STATIC(do_sys_accept) /* sys_accept(int, struct sockaddr *, int *) */ 97 mr r10,r4 98 lwa r3,0(r10) 99 lwz r4,4(r10) 100 lwz r5,8(r10) 101 b .sys_accept 102 103_STATIC(do_sys_getsockname) /* sys_getsockname(int, struct sockaddr *, int *) */ 104 mr r10,r4 105 lwa r3,0(r10) 106 lwz r4,4(r10) 107 lwz r5,8(r10) 108 b .sys_getsockname 109 110_STATIC(do_sys_getpeername) /* sys_getpeername(int, struct sockaddr *, int *) */ 111 mr r10,r4 112 lwa r3,0(r10) 113 lwz r4,4(r10) 114 lwz r5,8(r10) 115 b .sys_getpeername 116 117_STATIC(do_sys_socketpair) /* sys_socketpair(int, int, int, int *) */ 118 mr r10,r4 119 lwa r3,0(r10) 120 lwa r4,4(r10) 121 lwa r5,8(r10) 122 lwz r6,12(r10) 123 b .sys_socketpair 124 125_STATIC(do_sys_send) /* sys_send(int, void *, size_t, unsigned int) */ 126 mr r10,r4 127 lwa r3,0(r10) 128 lwz r4,4(r10) 129 lwz r5,8(r10) 130 lwz r6,12(r10) 131 b .sys_send 132 133_STATIC(do_sys_recv) /* sys_recv(int, void *, size_t, unsigned int) */ 134 mr r10,r4 135 lwa r3,0(r10) 136 lwz r4,4(r10) 137 lwz r5,8(r10) 138 lwz r6,12(r10) 139 b .sys_recv 140 141_STATIC(do_sys_sendto) /* sys32_sendto(int, u32, __kernel_size_t32, unsigned int, u32, int) */ 142 mr r10,r4 143 lwa r3,0(r10) 144 lwz r4,4(r10) 145 lwz r5,8(r10) 146 lwz r6,12(r10) 147 lwz r7,16(r10) 148 lwa r8,20(r10) 149 b .sys32_sendto 150 151_STATIC(do_sys_recvfrom) /* sys32_recvfrom(int, u32, __kernel_size_t32, unsigned int, u32, u32) */ 152 mr r10,r4 153 lwa r3,0(r10) 154 lwz r4,4(r10) 155 lwz r5,8(r10) 156 lwz r6,12(r10) 157 lwz r7,16(r10) 158 lwz r8,20(r10) 159 b .sys32_recvfrom 160 161_STATIC(do_sys_shutdown) /* sys_shutdown(int, int) */ 162 mr r10,r4 163 lwa r3,0(r10) 164 lwa r4,4(r10) 165 b .sys_shutdown 166 167_STATIC(do_sys_setsockopt) /* sys32_setsockopt(int, int, int, char *, int) */ 168 mr r10,r4 169 lwa r3,0(r10) 170 lwa r4,4(r10) 171 lwa r5,8(r10) 172 lwz r6,12(r10) 173 lwa r7,16(r10) 174 b .sys32_setsockopt 175 176_STATIC(do_sys_getsockopt) /* sys32_getsockopt(int, int, int, u32, u32) */ 177 mr r10,r4 178 lwa r3,0(r10) 179 lwa r4,4(r10) 180 lwa r5,8(r10) 181 lwz r6,12(r10) 182 lwz r7,16(r10) 183 b .sys32_getsockopt 184 185_STATIC(do_sys_sendmsg) /* sys32_sendmsg(int, struct msghdr32 *, unsigned int) */ 186 mr r10,r4 187 lwa r3,0(r10) 188 lwz r4,4(r10) 189 lwa r5,8(r10) 190 b .sys32_sendmsg 191 192_STATIC(do_sys_recvmsg) /* sys32_recvmsg(int, struct msghdr32 *, unsigned int) */ 193 mr r10,r4 194 lwa r3,0(r10) 195 lwz r4,4(r10) 196 lwa r5,8(r10) 197 b .sys32_recvmsg 198 199_STATIC(do_einval) 200 li r3,-EINVAL 201 b .ret_from_syscall_1 202_STATIC(do_efault) 203 li r3,-EFAULT 204 b .ret_from_syscall_1 205 206 .data 207 .align 8 208_GLOBAL(socketcall_table_begin) 209 .llong .do_sys_socket 210 .llong .do_sys_bind 211 .llong .do_sys_connect 212 .llong .do_sys_listen 213 .llong .do_sys_accept 214 .llong .do_sys_getsockname 215 .llong .do_sys_getpeername 216 .llong .do_sys_socketpair 217 .llong .do_sys_send 218 .llong .do_sys_recv 219 .llong .do_sys_sendto 220 .llong .do_sys_recvfrom 221 .llong .do_sys_shutdown 222 .llong .do_sys_setsockopt 223 .llong .do_sys_getsockopt 224 .llong .do_sys_sendmsg 225 .llong .do_sys_recvmsg 226_GLOBAL(socketcall_table_end) 227 .section __ex_table,"a" 228 .align 3 229 .llong .socketcall_table_begin 230 .llong 0 231 .llong .socketcall_table_end 232 .llong .do_efault 233 .previous 234

