From 199709bdffc37e9e0fc37b893eba4cd7c73f603b Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Sun, 1 Sep 2002 12:59:04 -0700 Subject: arch/sparc64/kernel/ioctl32.c: Translate PPPIOCS{PASS,ACTIVE} --- arch/sparc64/kernel/ioctl32.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) 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 #include #include +#include /* 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) -- cgit v1.2.3 From e10b134a585a6a21417a9d856e6db19a2a3cb339 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 2 Sep 2002 14:26:03 -0700 Subject: arch/sparc64/lib/VIScsum.S: Do not use VIS on oddly aligned buffer. --- arch/sparc64/lib/VIScsum.S | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/arch/sparc64/lib/VIScsum.S b/arch/sparc64/lib/VIScsum.S index d399f97109b2..3939f8bb41eb 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,83 @@ 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: + cmp %o1, 0 + ble,pn %icc, 9f + mov 0, %o3 + andcc %o0, 1, %o4 + be,pt %icc, 1f + sra %o1, 1, %g3 + add %o1, -1, %o1 + ldub [%o0], %g1 + add %o0, 1, %o0 + sll %g1, 8, %o3 + sra %o1, 1, %g3 +1: + cmp %g3, 0 + be,pt %icc, 3f + and %o1, 1, %g5 + and %o0, 2, %g1 + brz,a,pt %g1, 1f + sra %g3, 1, %g3 + add %g3, -1, %g3 + add %o1, -2, %o1 + lduh [%o0], %g5 + add %o0, 2, %o0 + add %o3, %g5, %o3 + sra %g3, 1, %g3 +1: + cmp %g3, 0 + be,a,pt %icc, 2f + and %o1, 2, %g3 +1: + ld [%o0], %g7 + addcc %o3, %g7, %o3 + addx %o3, %g0, %o3 + addcc %g3, -1, %g3 + bne,pt %icc, 1b + add %o0, 4, %o0 + and %o1, 2, %g3 +2: + cmp %g3, 0 + be,pt %icc, 3f + and %o1, 1, %g5 + lduh [%o0], %g1 + add %o0, 2, %o0 + add %o3, %g1, %o3 +3: + cmp %g5, 0 + be,pt %icc, 1f + srl %o3, 16, %g3 + ldub [%o0], %o1 + add %o3, %o1, %o3 + srl %o3, 16, %g3 +1: + sethi %hi(64512), %o1 + or %o1, 1023, %o0 + cmp %o4, 0 + and %o3, %o0, %g7 + add %g7, %g3, %o4 + srl %o4, 16, %g1 + and %o4, %o0, %g5 + add %g5, %g1, %o3 + sll %o3, 16, %g2 + srl %g2, 16, %o3 + srl %g2, 24, %o4 + and %o3, 255, %g7 + sll %g7, 8, %o0 + bne,pt %icc, 1f + or %o4, %o0, %g2 +9: + mov %o3, %g2 +1: + addcc %g2, %o2, %g2 + addx %g2, %g0, %g2 + retl + srl %g2, 0, %o0 -- cgit v1.2.3 From 17f90f08f0d9711019c6aad4a3200947360dc080 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 2 Sep 2002 14:48:26 -0700 Subject: arch/sparc64/lib/VIScsum.S: Fix endianness bugs in previous change. --- arch/sparc64/lib/VIScsum.S | 107 +++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/arch/sparc64/lib/VIScsum.S b/arch/sparc64/lib/VIScsum.S index 3939f8bb41eb..ae00e9fb17e6 100644 --- a/arch/sparc64/lib/VIScsum.S +++ b/arch/sparc64/lib/VIScsum.S @@ -458,74 +458,87 @@ csum_partial: * not fix it up. */ csump_really_slow: + mov %o0, %o3 + mov %o1, %o4 cmp %o1, 0 ble,pn %icc, 9f - mov 0, %o3 - andcc %o0, 1, %o4 + mov 0, %o0 + andcc %o3, 1, %o5 be,pt %icc, 1f - sra %o1, 1, %g3 - add %o1, -1, %o1 - ldub [%o0], %g1 - add %o0, 1, %o0 - sll %g1, 8, %o3 - sra %o1, 1, %g3 + 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 %o1, 1, %g5 - and %o0, 2, %g1 - brz,a,pt %g1, 1f + and %o4, 1, %g2 + and %o3, 2, %g2 + brz,a,pt %g2, 1f sra %g3, 1, %g3 add %g3, -1, %g3 - add %o1, -2, %o1 - lduh [%o0], %g5 - add %o0, 2, %o0 - add %o3, %g5, %o3 + add %o4, -2, %o4 + lduh [%o3], %g2 + add %o3, 2, %o3 + add %o0, %g2, %o0 sra %g3, 1, %g3 1: cmp %g3, 0 - be,a,pt %icc, 2f - and %o1, 2, %g3 + be,pt %icc, 2f + and %o4, 2, %g2 1: - ld [%o0], %g7 - addcc %o3, %g7, %o3 - addx %o3, %g0, %o3 + ld [%o3], %g2 + addcc %o0, %g2, %o0 + addx %o0, %g0, %o0 addcc %g3, -1, %g3 bne,pt %icc, 1b - add %o0, 4, %o0 - and %o1, 2, %g3 + 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 %g3, 0 + cmp %g2, 0 be,pt %icc, 3f - and %o1, 1, %g5 - lduh [%o0], %g1 - add %o0, 2, %o0 - add %o3, %g1, %o3 + and %o4, 1, %g2 + lduh [%o3], %g2 + add %o3, 2, %o3 + add %o0, %g2, %o0 + and %o4, 1, %g2 3: - cmp %g5, 0 + cmp %g2, 0 be,pt %icc, 1f - srl %o3, 16, %g3 - ldub [%o0], %o1 - add %o3, %o1, %o3 - srl %o3, 16, %g3 + srl %o0, 16, %o1 + ldub [%o3], %g2 + sll %g2, 8, %g2 + add %o0, %g2, %o0 + srl %o0, 16, %o1 1: - sethi %hi(64512), %o1 - or %o1, 1023, %o0 - cmp %o4, 0 - and %o3, %o0, %g7 - add %g7, %g3, %o4 - srl %o4, 16, %g1 - and %o4, %o0, %g5 - add %g5, %g1, %o3 - sll %o3, 16, %g2 - srl %g2, 16, %o3 - srl %g2, 24, %o4 - and %o3, 255, %g7 - sll %g7, 8, %o0 + 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 %o4, %o0, %g2 + or %g3, %g2, %g2 9: - mov %o3, %g2 + mov %o0, %g2 1: addcc %g2, %o2, %g2 addx %g2, %g0, %g2 -- cgit v1.2.3