diff options
| author | David S. Miller <davem@nuts.ninka.net> | 2002-09-03 00:47:25 -0700 |
|---|---|---|
| committer | David S. Miller <davem@nuts.ninka.net> | 2002-09-03 00:47:25 -0700 |
| commit | 85b8e609d4b59acfbfdd67838eed89a313e9c2ef (patch) | |
| tree | ce06499495516b7f830241de799eec593bc1c87b | |
| parent | 1314cad1540faf6b81e455b2267ce23c2fa1d698 (diff) | |
| parent | 17f90f08f0d9711019c6aad4a3200947360dc080 (diff) | |
Merge nuts.ninka.net:/home/davem/src/BK/sparcwork-2.5
into nuts.ninka.net:/home/davem/src/BK/sparc-2.5
| -rw-r--r-- | arch/sparc64/kernel/ioctl32.c | 39 | ||||
| -rw-r--r-- | arch/sparc64/lib/VIScsum.S | 95 |
2 files changed, 133 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c index 8804e569e7ea..24dd0668177e 100644 --- a/arch/sparc64/kernel/ioctl32.c +++ b/arch/sparc64/kernel/ioctl32.c @@ -99,6 +99,7 @@ #include <linux/usbdevice_fs.h> #include <linux/nbd.h> #include <linux/random.h> +#include <linux/filter.h> /* Use this to get at 32-bit user passed pointers. See sys_sparc32.c for description about these. */ @@ -1668,6 +1669,35 @@ out: return err; } +struct sock_fprog32 { + __u16 len; + __u32 filter; +}; + +#define PPPIOCSPASS32 _IOW('t', 71, struct sock_fprog32) +#define PPPIOCSACTIVE32 _IOW('t', 70, struct sock_fprog32) + +static int ppp_sock_fprog_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct sock_fprog32 *u_fprog32 = (struct sock_fprog32 *) arg; + struct sock_fprog *u_fprog64 = alloc_user_space(sizeof(struct sock_fprog)); + void *fptr64; + u32 fptr32; + u16 flen; + + if (get_user(flen, &u_fprog32->len) || + get_user(fptr32, &u_fprog32->filter)) + return -EFAULT; + + fptr64 = (void *) A(fptr32); + + if (put_user(flen, &u_fprog64->len) || + put_user(fptr64, &u_fprog64->filter)) + return -EFAULT; + + return sys_ioctl(fd, cmd, (unsigned long) u_fprog64); +} + struct ppp_option_data32 { __kernel_caddr_t32 ptr; __u32 length; @@ -4237,13 +4267,16 @@ COMPATIBLE_IOCTL(PPPIOCGMRU) COMPATIBLE_IOCTL(PPPIOCSMRU) COMPATIBLE_IOCTL(PPPIOCSMAXCID) COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP) -COMPATIBLE_IOCTL(LPGETSTATUS) COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP) COMPATIBLE_IOCTL(PPPIOCXFERUNIT) +/* PPPIOCSCOMPRESS is translated */ COMPATIBLE_IOCTL(PPPIOCGNPMODE) COMPATIBLE_IOCTL(PPPIOCSNPMODE) +/* PPPIOCSPASS is translated */ +/* PPPIOCSACTIVE is translated */ COMPATIBLE_IOCTL(PPPIOCGDEBUG) COMPATIBLE_IOCTL(PPPIOCSDEBUG) +/* PPPIOCGIDLE is translated */ COMPATIBLE_IOCTL(PPPIOCNEWUNIT) COMPATIBLE_IOCTL(PPPIOCATTACH) COMPATIBLE_IOCTL(PPPIOCDETACH) @@ -4252,6 +4285,8 @@ COMPATIBLE_IOCTL(PPPIOCCONNECT) COMPATIBLE_IOCTL(PPPIOCDISCONN) COMPATIBLE_IOCTL(PPPIOCATTCHAN) COMPATIBLE_IOCTL(PPPIOCGCHAN) +/* LP */ +COMPATIBLE_IOCTL(LPGETSTATUS) /* PPPOX */ COMPATIBLE_IOCTL(PPPOEIOCSFWD) COMPATIBLE_IOCTL(PPPOEIOCDFWD) @@ -4677,6 +4712,8 @@ HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans) HANDLE_IOCTL(SG_IO,sg_ioctl_trans) HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans) HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans) +HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans) +HANDLE_IOCTL(PPPIOCSACTIVE32, ppp_sock_fprog_ioctl_trans) HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans) HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans) HANDLE_IOCTL(MTIOCGETCONFIG32, mt_ioctl_trans) diff --git a/arch/sparc64/lib/VIScsum.S b/arch/sparc64/lib/VIScsum.S index d399f97109b2..ae00e9fb17e6 100644 --- a/arch/sparc64/lib/VIScsum.S +++ b/arch/sparc64/lib/VIScsum.S @@ -212,6 +212,8 @@ csum_partial: mov 1, %g5 /* IEU0 Group */ cmp %o1, 6 /* IEU1 */ bl,pn %icc, 21f /* CTI */ + andcc %o0, 1, %g0 /* IEU1 Group */ + bne,pn %icc, csump_really_slow /* CTI */ andcc %o0, 2, %g0 /* IEU1 Group */ be,pt %icc, 1f /* CTI */ and %o0, 4, %g7 /* IEU0 */ @@ -449,3 +451,96 @@ csum_partial: add %o2, 1, %o2 /* IEU0 */ 1: ba,pt %xcc, 25b /* CTI Group */ sllx %o2, 32, %g1 /* IEU0 */ + + /* When buff is byte aligned and len is large, we backoff to + * this really slow handling. The issue is that we cannot do + * the VIS stuff when buff is byte aligned as unaligned.c will + * not fix it up. + */ +csump_really_slow: + mov %o0, %o3 + mov %o1, %o4 + cmp %o1, 0 + ble,pn %icc, 9f + mov 0, %o0 + andcc %o3, 1, %o5 + be,pt %icc, 1f + sra %o4, 1, %g3 + add %o1, -1, %o4 + ldub [%o3], %o0 + add %o3, 1, %o3 + sra %o4, 1, %g3 +1: + cmp %g3, 0 + be,pt %icc, 3f + and %o4, 1, %g2 + and %o3, 2, %g2 + brz,a,pt %g2, 1f + sra %g3, 1, %g3 + add %g3, -1, %g3 + add %o4, -2, %o4 + lduh [%o3], %g2 + add %o3, 2, %o3 + add %o0, %g2, %o0 + sra %g3, 1, %g3 +1: + cmp %g3, 0 + be,pt %icc, 2f + and %o4, 2, %g2 +1: + ld [%o3], %g2 + addcc %o0, %g2, %o0 + addx %o0, %g0, %o0 + addcc %g3, -1, %g3 + bne,pt %icc, 1b + add %o3, 4, %o3 + srl %o0, 16, %o1 + sethi %hi(64512), %g2 + or %g2, 1023, %g2 + and %o0, %g2, %g3 + add %g3, %o1, %g3 + srl %g3, 16, %o0 + and %g3, %g2, %g2 + add %g2, %o0, %g3 + sll %g3, 16, %g3 + srl %g3, 16, %o0 + and %o4, 2, %g2 +2: + cmp %g2, 0 + be,pt %icc, 3f + and %o4, 1, %g2 + lduh [%o3], %g2 + add %o3, 2, %o3 + add %o0, %g2, %o0 + and %o4, 1, %g2 +3: + cmp %g2, 0 + be,pt %icc, 1f + srl %o0, 16, %o1 + ldub [%o3], %g2 + sll %g2, 8, %g2 + add %o0, %g2, %o0 + srl %o0, 16, %o1 +1: + sethi %hi(64512), %g2 + or %g2, 1023, %g2 + cmp %o5, 0 + and %o0, %g2, %g3 + add %g3, %o1, %g3 + srl %g3, 16, %o0 + and %g3, %g2, %g2 + add %g2, %o0, %g3 + sll %g3, 16, %g3 + srl %g3, 16, %o0 + srl %g3, 24, %g3 + and %o0, 255, %g2 + sll %g2, 8, %g2 + bne,pt %icc, 1f + or %g3, %g2, %g2 +9: + mov %o0, %g2 +1: + addcc %g2, %o2, %g2 + addx %g2, %g0, %g2 + retl + srl %g2, 0, %o0 |
