[OpenAFS-devel] openafs ppc64 port for Kernel 2.6

Sven Oehme oehmes@de.ibm.com
Fri, 1 Apr 2005 18:35:37 +0200


--=_mixed 005B24BFC1256FD6_=
Content-Type: multipart/alternative; boundary="=_alternative 005B24BFC1256FD6_="


--=_alternative 005B24BFC1256FD6_=
Content-Type: text/plain; charset="US-ASCII"

Hi,

my Team has ported Openafs to ppc64 on Kernel 2.6. we have done some 
testing right now, because of several requests i will submit the patch at 
that stage, so far no known Problems ...

Patch Description :

- This patch add OpenAFS support to Linux 2.6 on PPC64.
- No kernel patch is required.
- Automatic probing for sys_call_table and sys_call_table32.

tested under SUSE LINUX Enterprise Server 9 Kernel 2.6.5-7.111-pseries64 
SMP 



diff -ruN openafs-cvs/acinclude.m4 openafs-cvs.ppc64/acinclude.m4
--- openafs-cvs/acinclude.m4    2005-03-31 16:59:46.979877016 +0200
+++ openafs-cvs.ppc64/acinclude.m4      2005-03-31 16:58:20.119902008 
+0200
@@ -460,7 +460,7 @@
                        AFS_SYSNAME="ia64_linuxXX"
                        ;;
                powerpc-*-linux*)
-                       AFS_SYSNAME="ppc_linuxXX"
+                       AFS_SYSNAME="`/bin/arch`_linuxXX"
                        ;;
                powerpc64-*-linux*)
                        AFS_SYSNAME="ppc64_linuxXX"
diff -ruN openafs-cvs/src/afs/LINUX/osi_flush.s 
openafs-cvs.ppc64/src/afs/LINUX/osi_flush.s
--- openafs-cvs/src/afs/LINUX/osi_flush.s       1970-01-01 
01:00:00.000000000 +0100
+++ openafs-cvs.ppc64/src/afs/LINUX/osi_flush.s 2005-03-31 
16:58:20.121901704 +0200
@@ -0,0 +1,41 @@
+/* Taken from linux-2.6/arch/ppc64/boot/string.S 
+ *
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * Copyright 2000, International Business Machines Corporation and 
others.
+ * All Rights Reserved.
+ * 
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ *
+ * Flush the dcache and invalidate the icache for a range of addresses.
+ *
+ * flush_cache(addr, len)
+ */
+       .section        ".text"
+       .align          2
+       .globl          flush_cache
+       .section        ".opd","aw"
+       .align          3
+flush_cache:
+       .quad           .flush_cache,.TOC.@tocbase,0
+       .previous
+       .size           flush_cache,24
+       .globl          .flush_cache
+.flush_cache:
+        addi    4,4,0x1f        /* len = (len + 0x1f) / 0x20 */
+        rlwinm. 4,4,27,5,31
+        mtctr   4
+        beqlr
+1:      dcbf    0,3
+        icbi    0,3
+        addi    3,3,0x20
+        bdnz    1b
+        sync
+        isync
+        blr
+       .long           0
+       .byte           0,12,0,0,0,0,0,0
+       .type           .flush_cache,@function
+       .size           .flush_cache,.-.flush_cache
diff -ruN openafs-cvs/src/afs/LINUX/osi_probe.c 
openafs-cvs.ppc64/src/afs/LINUX/osi_probe.c
--- openafs-cvs/src/afs/LINUX/osi_probe.c       2005-03-11 
05:35:42.000000000 +0100
+++ openafs-cvs.ppc64/src/afs/LINUX/osi_probe.c 2005-03-31 
16:58:20.125901096 +0200
@@ -65,6 +65,10 @@
 #include <linux/unistd.h>
 #include <linux/mm.h>
 
+#if defined(AFS_PPC64_LINUX26_ENV)
+#include <asm/abs_addr.h>
+#endif
+
 #ifdef AFS_AMD64_LINUX20_ENV
 #include <asm/ia32_unistd.h>
 #endif
@@ -78,6 +82,8 @@
 /* lower bound of valid kernel text pointers */
 #ifdef AFS_IA64_LINUX20_ENV
 #define ktxt_lower_bound (((unsigned long)&kernel_thread )  & 
0xfff00000L)
+#elif defined(AFS_PPC64_LINUX20_ENV)
+#define ktxt_lower_bound (KERNELBASE)
 #else
 #define ktxt_lower_bound (((unsigned long)&kernel_thread )  & ~0xfffffL)
 #endif
@@ -188,6 +194,7 @@
 extern SYSCALLTYPE sys_call_table32[] __attribute__((weak));
 extern SYSCALLTYPE sys_call_table_emu[] __attribute__((weak));
 
+extern asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, 
size_t count) __attribute__((weak));
 extern asmlinkage long sys_close(unsigned int) __attribute__((weak));
 extern asmlinkage long sys_chdir(const char *) __attribute__((weak));
 extern asmlinkage ssize_t sys_write(unsigned int, const char *, size_t) 
__attribute__((weak));
@@ -480,6 +487,10 @@
     (unsigned long)(&tasklist_lock) - 0x30000,
     0,
     0x6000,
+#elif defined(AFS_PPC64_LINUX26_ENV)
+    (unsigned long)(&do_signal),
+    0xfff,
+    0x400,
 #elif defined(AFS_PPC_LINUX20_ENV) || defined(AFS_PPC_LINUX20_ENV)
     (unsigned long)&init_mm,
     0xffff,
@@ -617,6 +628,10 @@
 
 /********** Probing Configuration: ppc64, sparc64 sys_call_table32 
**********/
 #elif defined(AFS_PPC64_LINUX20_ENV) || defined(AFS_SPARC64_LINUX20_ENV)
+struct fptr {
+    void *ip;
+    unsigned long gp;
+};
 
 /* 
  * syscall pairs/triplets to probe
@@ -692,6 +707,10 @@
     (unsigned long)(&sys_close),
     0xfffff,
     0x10000,
+#elif defined(AFS_PPC64_LINUX26_ENV)
+    (unsigned long)(&do_signal),
+    0xfff,
+    0x400,
 #else
     (unsigned long)&init_mm,
     0,
@@ -859,7 +878,7 @@
     return -1;
 }
 
-static void *try(probectl *P, tryctl *T, PROBETYPE *ptr,
+static void *try(probectl *P, tryctl *T, PROBETYPE *aptr,
                 unsigned long datalen)
 {
 #ifdef OSI_PROBE_KALLSYMS
@@ -870,8 +889,9 @@
 #endif
     unsigned long offset, ip1, ip2, ip3;
     int ret;
+    PROBETYPE *ptr;
 
-#ifdef AFS_IA64_LINUX20_ENV
+#if defined(AFS_IA64_LINUX20_ENV) || defined(AFS_PPC64_LINUX20_ENV)
     ip1 = T->fn1 ? (unsigned long)((struct fptr *)T->fn1)->ip : 0;
     ip2 = T->fn2 ? (unsigned long)((struct fptr *)T->fn2)->ip : 0;
     ip3 = T->fn3 ? (unsigned long)((struct fptr *)T->fn3)->ip : 0;
@@ -890,11 +910,19 @@
     if (!ip1 || !ip2 || (T->NR3 >= 0 && !ip3))
        return 0;
 
-    for (offset = 0; offset < datalen; offset++, ptr++) {
+    for (offset = 0; offset < datalen; offset++, aptr++) {
+#if defined(AFS_PPC64_LINUX20_ENV)
+       ptr = (PROBETYPE*)(*aptr);
+       if ((unsigned long)ptr <= KERNELBASE) {
+               continue;
+       }
+#else
+       ptr = aptr;
+#endif
        ret = check_table(P, ptr);
        if (ret >= 0) {
            /* return value is number of entries to skip */
-           ptr    += ret;
+           aptr    += ret;
            offset += ret;
            continue;
        }
@@ -957,7 +985,7 @@
        }
     }
 
-#ifdef AFS_IA64_LINUX20_ENV
+#if defined(AFS_IA64_LINUX20_ENV) || defined(AFS_PPC64_LINUX20_ENV)
     ip1 = P->verify_fn ? (unsigned long)((struct fptr 
*)(P->verify_fn))->ip : 0;
 #else
     ip1 = (unsigned long)(P->verify_fn);
diff -ruN openafs-cvs/src/afs/LINUX/osi_syscall.c 
openafs-cvs.ppc64/src/afs/LINUX/osi_syscall.c
--- openafs-cvs/src/afs/LINUX/osi_syscall.c     2005-03-11 
05:35:42.000000000 +0100
+++ openafs-cvs.ppc64/src/afs/LINUX/osi_syscall.c       2005-03-31 
16:58:20.131900184 +0200
@@ -36,6 +36,9 @@
 #include <linux/sched.h>
 #endif
 
+#ifndef NR_syscalls
+#define NR_syscalls 222
+#endif
 
 /* On SPARC64 and S390X, sys_call_table contains 32-bit entries
  * even though pointers are 64 bit quantities.
@@ -96,12 +99,30 @@
 
 
 /***** PPC64 *****/
-#ifdef AFS_PPC64_LINUX20_ENV
-extern SYSCALLTYPE *afs_sys_call_table32;
+#ifdef AFS_PPC64_LINUX26_ENV
+static SYSCALLTYPE *afs_sys_call_table32;
 static SYSCALLTYPE afs_ni_syscall32 = 0;
+static SYSCALLTYPE old_sys_setgroupsp = 0;
+static SYSCALLTYPE old_sys32_setgroupsp = 0;
 
 extern int afs32_xsetgroups();
 asmlinkage long (*sys32_setgroupsp)(int gidsetsize, gid_t *grouplist);
+
+asmlinkage long sys_close(unsigned int fd);
+static void sys_setgroups_stub() 
+       __attribute__ ((pure,const,no_instrument_function));
+static void sys_setgroups_stub() 
+{ 
+       printf("*** error! sys_setgroups_stub called\n");
+}
+
+static void sys32_setgroups_stub() 
+       __attribute__ ((pure,const,no_instrument_function));
+static void sys32_setgroups_stub() 
+{ 
+       printf("*** error! sys32_setgroups_stub called\n");
+}
+
 #endif /* AFS_AMD64_LINUX20_ENV */
 
 
@@ -213,6 +234,127 @@
 
 #endif /* AFS_IA64_LINUX20_ENV */
 
+/***** PPC64 ***** 
+ * Spring 2005
+ * sys_call_table hook for PPC64 
+ * by Soewono Effendi <Soewono.Effendi@sysgo.de>
+ * for IBM Deutschland
+ * Thanks go to SYSGO's team for their support:
+ * Horst Birthelmer <Horst.Birthelmer@sysgo.de>
+ * Marius Groeger <Marius.Groeger@sysgo.de>
+ */
+#if defined(AFS_PPC64_LINUX26_ENV)
+extern void flush_cache(void *, unsigned long);
+#define PPC_LO(v) ((v) & 0xffff)
+#define PPC_HI(v) (((v) >> 16) & 0xffff)
+#define PPC_HA(v) PPC_HI ((v) + 0x8000)
+#define PPC_HLO(v) ((short)(((v) >> 32) & 0xffff))
+#define PPC_HHI(v) ((short)(((v) >> 48) & 0xffff))
+
+struct ppc64_opd
+{
+       unsigned long funcaddr;
+       unsigned long r2;
+};
+
+struct ppc64_stub
+{
+       unsigned char jump[136];
+       unsigned long r2;
+       unsigned long lr;
+       struct ppc64_opd opd;
+} __attribute__ ((packed));
+
+/* a stub to fix up r2 (TOC ptr) and to jump to our sys_call hook
+   function.  We patch the new r2 value and function pointer into 
+   the stub. */
+#define PPC64_STUB(stub) \
+static struct ppc64_stub stub = \
+{ .jump = { \
+        0xf8, 0x41, 0x00, 0x28, /*     std     r2,40(r1) */ \
+        0xfb, 0xc1, 0xff, 0xf0, /*     std     r30,-16(r1) */ \
+        0xfb, 0xa1, 0xff, 0xe8, /*     std     r29,-24(r1) */ \
+        0x7c, 0x5d, 0x13, 0x78, /*     mr      r29,r2 */ \
+        0x3c, 0x40, 0x12, 0x34, /*16:  lis     r2,4660 */ \
+        0x60, 0x42, 0x56, 0x78, /*20:  ori     r2,r2,22136 */ \
+        0x78, 0x42, 0x07, 0xc6, /*     rldicr  r2,r2,32,31 */ \
+        0x64, 0x42, 0x90, 0xab, /*28:  oris    r2,r2,37035 */ \
+        0x60, 0x42, 0xcd, 0xef, /*32:  ori     r2,r2,52719 */ \
+        0x3f, 0xc2, 0x00, 0x00, /*36:  addis   r30,r2,0 */ \
+        0x3b, 0xde, 0x00, 0x00, /*40:  addi    r30,r30,0 */ \
+        0xfb, 0xbe, 0x00, 0x88, /*     std     r29,136(r30) */ \
+        0x7f, 0xa8, 0x02, 0xa6, /*     mflr    r29 */ \
+        0xfb, 0xbe, 0x00, 0x90, /*     std     r29,144(r30) */ \
+        0xeb, 0xde, 0x00, 0x98, /*     ld      r30,152(r30) */ \
+        0x7f, 0xc8, 0x03, 0xa6, /*     mtlr    r30 */ \
+        0xeb, 0xa1, 0xff, 0xe8, /*     ld      r29,-24(r1) */ \
+        0xeb, 0xc1, 0xff, 0xf0, /*     ld      r30,-16(r1) */ \
+        0x4e, 0x80, 0x00, 0x21, /*     blrl */ \
+        0x3c, 0x40, 0x12, 0x34, /*76:  lis     r2,4660 */ \
+        0x60, 0x42, 0x56, 0x78, /*80:  ori     r2,r2,22136 */ \
+        0x78, 0x42, 0x07, 0xc6, /*     rldicr  r2,r2,32,31 */ \
+        0x64, 0x42, 0x90, 0xab, /*88:  oris    r2,r2,37035 */ \
+        0x60, 0x42, 0xcd, 0xef, /*92:  ori     r2,r2,52719 */ \
+        0xfb, 0xc1, 0xff, 0xf0, /*     std     r30,-16(r1) */ \
+        0xfb, 0xa1, 0xff, 0xe8, /*     std     r29,-24(r1) */ \
+        0x3f, 0xc2, 0xab, 0xcd, /*104: addis   r30,r2,-21555 */ \
+        0x3b, 0xde, 0x78, 0x90, /*108: addi    r30,r30,30864 */ \
+        0xeb, 0xbe, 0x00, 0x90, /*     ld      r29,144(r30) */ \
+        0x7f, 0xa8, 0x03, 0xa6, /*     mtlr    r29 */ \
+        0xe8, 0x5e, 0x00, 0x88, /*     ld      r2,136(r30) */ \
+        0xeb, 0xa1, 0xff, 0xe8, /*     ld      r29,-24(r1) */ \
+        0xeb, 0xc1, 0xff, 0xf0, /*     ld      r30,-16(r1) */ \
+        0x4e, 0x80, 0x00, 0x20  /*     blr */ \
+}} 
+
+static void * create_stub(struct ppc64_stub *stub,
+                          struct ppc64_opd *opd)
+{
+       unsigned short *p1, *p2, *p3, *p4;
+       unsigned long addr;
+
+       stub->opd.funcaddr = opd->funcaddr;
+       stub->opd.r2 = opd->r2;
+       addr = (unsigned long) opd->r2;
+       p1 = (unsigned short*) &stub->jump[18];
+       p2 = (unsigned short*) &stub->jump[22];
+       p3 = (unsigned short*) &stub->jump[30];
+       p4 = (unsigned short*) &stub->jump[34];
+
+       *p1 = PPC_HHI(addr);
+       *p2 = PPC_HLO(addr);
+       *p3 = PPC_HI(addr);
+       *p4 = PPC_LO(addr);
+
+       addr = (unsigned long) stub - opd->r2;
+       p1 = (unsigned short*) &stub->jump[38];
+       p2 = (unsigned short*) &stub->jump[42];
+       *p1 = PPC_HA(addr);
+       *p2 = PPC_LO(addr);
+       p1 = (unsigned short*) &stub->jump[106];
+       p2 = (unsigned short*) &stub->jump[110];
+       *p1 = PPC_HA(addr);
+       *p2 = PPC_LO(addr);
+
+       addr = (unsigned long) opd->r2;
+       p1 = (unsigned short*) &stub->jump[78];
+       p2 = (unsigned short*) &stub->jump[82];
+       p3 = (unsigned short*) &stub->jump[90];
+       p4 = (unsigned short*) &stub->jump[94];
+
+       *p1 = PPC_HHI(addr);
+       *p2 = PPC_HLO(addr);
+       *p3 = PPC_HI(addr);
+       *p4 = PPC_LO(addr);
+
+        flush_cache((void *)stub, sizeof(*stub));
+        return ((void*)(stub));
+}
+
+PPC64_STUB(afs_sys_call_stub);
+PPC64_STUB(afs_xsetgroups_stub);
+PPC64_STUB(afs_xsetgroups32_stub);
+#endif /* AFS_PPC64_LINUX26_ENV */
 
 
 /**********************************************************************/
@@ -264,7 +406,51 @@
     /* XXX no 32-bit syscalls on IA64? */
 
 
-/***** COMMON (except IA64) *****/
+#elif defined(AFS_PPC64_LINUX26_ENV)
+
+    afs_sys_call_table = osi_find_syscall_table(0);
+    if (afs_sys_call_table) {
+       SYSCALLTYPE p;
+       struct ppc64_opd* opd = (struct ppc64_opd*) sys_close;
+       unsigned long r2 = opd->r2;
+       opd = (struct ppc64_opd*) afs_syscall;
+       afs_sys_call_table32 = (unsigned long)afs_sys_call_table - 
+               NR_syscalls * sizeof(SYSCALLTYPE);
+       /* check we aren't already loaded */
+       p = SYSCALL2POINTER afs_sys_call_table[_S(__NR_afs_syscall)];
+       if ((unsigned long)p == opd->funcaddr) {
+           printf("AFS syscall entry point already in use!\n");
+           return -EBUSY;
+       }
+       /* setup AFS entry point */
+       p = create_stub(&afs_sys_call_stub, opd);
+       afs_ni_syscall = afs_sys_call_table[_S(__NR_afs_syscall)];
+       afs_sys_call_table[_S(__NR_afs_syscall)] = POINTER2SYSCALL p;
+
+       /* setup setgroups */
+       opd = (struct ppc64_opd*) afs_xsetgroups;
+       p = create_stub(&afs_xsetgroups_stub, opd);
+       old_sys_setgroupsp = SYSCALL2POINTER 
afs_sys_call_table[_S(__NR_setgroups)];
+       afs_sys_call_table[_S(__NR_setgroups)] = POINTER2SYSCALL p;
+       opd = (struct ppc64_opd*) sys_setgroups_stub;
+       opd->funcaddr = old_sys_setgroupsp;
+       opd->r2 = r2;
+
+       /* setup setgroups32 */
+       opd = (struct ppc64_opd*) afs32_xsetgroups;
+       p = create_stub(&afs_xsetgroups32_stub, opd);
+       old_sys32_setgroupsp = SYSCALL2POINTER 
afs_sys_call_table32[_S(__NR_setgroups)];
+       afs_sys_call_table32[_S(__NR_setgroups)] = POINTER2SYSCALL p;
+       opd = (struct ppc64_opd*) sys32_setgroups_stub;
+       opd->funcaddr = old_sys32_setgroupsp;
+       opd->r2 = r2;
+
+        flush_cache((void *)afs_sys_call_table, 
2*NR_syscalls*sizeof(void*));
+
+       sys_setgroupsp = sys_setgroups_stub;
+       sys32_setgroupsp = sys32_setgroups_stub;
+    }
+/***** COMMON (except IA64 or PPC64) *****/
 #else /* !AFS_IA64_LINUX20_ENV */
 
     afs_sys_call_table = osi_find_syscall_table(0);
@@ -324,12 +510,6 @@
 #endif /* AFS_AMD64_LINUX20_ENV */
 
 
-/***** PPC64 *****/
-#ifdef AFS_PPC64_LINUX20_ENV
-    /* XXX no 32-bit syscalls on PPC64? */
-#endif
-
-
 /***** SPARC64 *****/
 #ifdef AFS_SPARC64_LINUX20_ENV
     afs_sys_call_table32 = osi_find_syscall_table(1);
@@ -371,6 +551,12 @@
 #if defined(AFS_IA64_LINUX20_ENV)
        afs_sys_call_table[_S(__NR_setgroups)] =
            POINTER2SYSCALL((struct fptr *)sys_setgroupsp)->ip;
+#elif defined(AFS_PPC64_LINUX26_ENV)
+       afs_sys_call_table[_S(__NR_setgroups)] =
+           POINTER2SYSCALL old_sys_setgroupsp;
+       /* put back setgroups32 for PPC64 */
+       afs_sys_call_table32[__NR_setgroups] =
+           POINTER2SYSCALL old_sys32_setgroupsp;
 #else /* AFS_IA64_LINUX20_ENV */
        afs_sys_call_table[_S(__NR_setgroups)] =
            POINTER2SYSCALL sys_setgroupsp;
@@ -409,12 +595,6 @@
 #endif
 
 
-/***** PPC64 *****/
-#ifdef AFS_PPC64_LINUX20_ENV
-    /* XXX no 32-bit syscalls on PPC64? */
-#endif
-
-
 /***** SPARC64 *****/
 #ifdef AFS_SPARC64_LINUX20_ENV
     if (afs_sys_call_table32) {
diff -ruN openafs-cvs/src/cf/linux-test3.m4 
openafs-cvs.ppc64/src/cf/linux-test3.m4
--- openafs-cvs/src/cf/linux-test3.m4   2005-01-14 18:34:32.000000000 
+0100
+++ openafs-cvs.ppc64/src/cf/linux-test3.m4     2005-03-31 
16:58:20.132900032 +0200
@@ -116,7 +116,7 @@
 AC_DEFUN([LINUX_KERNEL_PAGE_FOLLOW_LINK],[
 AC_MSG_CHECKING(for page_follow_link_light vs page_follow_link)
 save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include 
-Werror-implicit-function-declaration -D__KERNEL__ $CPPFLAGS"
+CPPFLAGS="-I${LINUX_KERNEL_PATH}/include 
-I${LINUX_KERNEL_PATH}/include/asm/mach-default 
-Werror-implicit-function-declaration -D__KERNEL__ $CPPFLAGS"
 AC_CACHE_VAL(ac_cv_linux_kernel_page_follow_link,
 [
 AC_TRY_COMPILE(
diff -ruN openafs-cvs/src/cf/osconf.m4 openafs-cvs.ppc64/src/cf/osconf.m4
--- openafs-cvs/src/cf/osconf.m4        2005-02-16 23:47:38.000000000 
+0100
+++ openafs-cvs.ppc64/src/cf/osconf.m4  2005-03-31 16:58:20.134899728 
+0200
@@ -262,8 +262,9 @@
                MT_LIBS="-lpthread"
                PAM_CFLAGS="-g -O2 -Dlinux -DLINUX_PAM -fPIC"
                SHLIB_LDFLAGS="-shared -Xlinker -x"
+               SHLIB_CFLAGS="-fPIC"
                TXLIBS="-lncurses"
-               XCFLAGS="-g -O2 -D_LARGEFILE64_SOURCE"
+               XCFLAGS="-g -O2 -D_LARGEFILE64_SOURCE -fPIC"
                YACC="bison -y"
                SHLIB_LINKER="${MT_CC} -shared"
                ;;
diff -ruN openafs-cvs/src/libafs/Makefile.common.in 
openafs-cvs.ppc64/src/libafs/Makefile.common.in
--- openafs-cvs/src/libafs/Makefile.common.in   2005-01-29 
06:42:02.000000000 +0100
+++ openafs-cvs.ppc64/src/libafs/Makefile.common.in     2005-03-31 
16:58:20.136899424 +0200
@@ -393,6 +393,8 @@
        $(CRULE_NOOPT)
 osi_sysctl.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_sysctl.c
        $(CRULE_NOOPT)
+osi_flush.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_flush.s
+       $(CRULE_OPT)
 osi_alloc.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_alloc.c
        $(CRULE_NOOPT)
 osi_cred.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_cred.c
diff -ruN openafs-cvs/src/libafs/MakefileProto.LINUX.in 
openafs-cvs.ppc64/src/libafs/MakefileProto.LINUX.in
--- openafs-cvs/src/libafs/MakefileProto.LINUX.in       2005-03-23 
00:52:59.000000000 +0100
+++ openafs-cvs.ppc64/src/libafs/MakefileProto.LINUX.in 2005-03-31 
16:59:57.913946112 +0200
@@ -24,6 +24,9 @@
        osi_sysctl.o \
        osi_vfsops.o \
        osi_vm.o \
+<ppc64_linux26>
+       osi_flush.o \
+<all>
        osi_vnodeops.o 
 
 AFS_OS_NFSOBJS =
@@ -82,7 +85,7 @@
       -mcpu=ultrasparc -m64 -mno-fpu -mcmodel=medlow -ffixed-g4 
-fcall-used-g5 -fcall-used-g7 -Wno-sign-compare
 DEFINES = $(COMMON_DEFINES) -DCPU=sparc64
 
-<ppc_linux22 ppc_linux24 ppc64_linux24>
+<ppc_linux22 ppc_linux24 ppc64_linux24 ppc64_linux26>
 CCFLAGS = $(COMMON_KERN_CFLAGS) -fsigned-char -msoft-float -fno-builtin 
-ffixed-r2
 DEFINES = $(COMMON_DEFINES) -D__powerpc__
 
diff -ruN openafs-cvs/src/libafs/make_kbuild_makefile.pl 
openafs-cvs.ppc64/src/libafs/make_kbuild_makefile.pl
--- openafs-cvs/src/libafs/make_kbuild_makefile.pl      2004-06-02 
04:56:01.000000000 +0200
+++ openafs-cvs.ppc64/src/libafs/make_kbuild_makefile.pl        2005-03-31 
16:58:20.138899120 +0200
@@ -51,6 +51,9 @@
     elsif ($text =~ /^(\S+\.o):\s*(\S+\.c)/) {    ## Dependency
       $deps{$1} = $2;
     }
+    elsif ($text =~ /^(\S+\.o):\s*(\S+\.s)/) {    ## Dependency
+      $deps{$1} = $2;
+    }
     $text = '';
   }
   $F->close();
@@ -74,8 +77,12 @@
 
 
 foreach (@objects) {
-  ($src = $_) =~ s/\.o$/.c/;
   die "No source known for $_\n" unless exists $deps{$_};
+  if($deps{$_} =~ /\.s$/) {
+     ($src = $_) =~ s/\.o$/.s/;
+  } else {
+     ($src = $_) =~ s/\.o$/.c/;
+  }
   if (-e "$KDIR/$src" || -l "$KDIR/$src") {
     unlink("$KDIR/$src") or die "$KDIR/$src: $!\n";
   }







Sven
-------------------------------------------------------------------------------------------------------------------------
Dept. A153,  STG/ISC EMEA AIS Strategy and Architecture
Development Leader Open Enterprise System Virtualization 
IBM intranet ---> http://w3.ais.mainz.de.ibm.com/oesv/
internet ---> http://www-5.ibm.com/services/de/storage/stonehenge.html
Phone (+49)-6131-84-3151
Fax      (+49)-6131-84-6708
Mobil   (+49)-171-970-6664
E-Mail : oehmes@de.ibm.com


--=_alternative 005B24BFC1256FD6_=
Content-Type: text/html; charset="US-ASCII"


<br><font size=2><tt>Hi,</tt></font>
<br>
<br><font size=2><tt>my Team has ported Openafs to ppc64 on Kernel 2.6.
we have done some testing right now, because of several requests i will
submit the patch at that stage, so far no known Problems ...</tt></font>
<br>
<br><font size=2><tt>Patch Description :</tt></font>
<br>
<br><font size=2><tt>- This patch add OpenAFS support to Linux 2.6 on PPC64.<br>
- No kernel patch is required.<br>
- Automatic probing for sys_call_table and sys_call_table32.<br>
</tt></font>
<br><font size=2><tt>tested under SUSE LINUX Enterprise Server 9 Kernel
2.6.5-7.111-pseries64 SMP <br>
</tt></font>
<br>
<br>
<div>
<br><font size=2><tt>diff -ruN openafs-cvs/acinclude.m4 openafs-cvs.ppc64/acinclude.m4<br>
--- openafs-cvs/acinclude.m4 &nbsp; &nbsp; &nbsp; &nbsp;2005-03-31
16:59:46.979877016 +0200<br>
+++ openafs-cvs.ppc64/acinclude.m4 &nbsp; &nbsp; &nbsp; &nbsp;2005-03-31
16:58:20.119902008 +0200<br>
@@ -460,7 +460,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; AFS_SYSNAME=&quot;ia64_linuxXX&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; ;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; powerpc-*-linux*)<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;AFS_SYSNAME=&quot;ppc_linuxXX&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;AFS_SYSNAME=&quot;`/bin/arch`_linuxXX&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; ;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; powerpc64-*-linux*)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; AFS_SYSNAME=&quot;ppc64_linuxXX&quot;<br>
diff -ruN openafs-cvs/src/afs/LINUX/osi_flush.s openafs-cvs.ppc64/src/afs/LINUX/osi_flush.s<br>
--- openafs-cvs/src/afs/LINUX/osi_flush.s &nbsp; &nbsp; &nbsp; &nbsp;1970-01-01
01:00:00.000000000 +0100<br>
+++ openafs-cvs.ppc64/src/afs/LINUX/osi_flush.s &nbsp; &nbsp; &nbsp; &nbsp;2005-03-31
16:58:20.121901704 +0200<br>
@@ -0,0 +1,41 @@<br>
+/* Taken from linux-2.6/arch/ppc64/boot/string.S <br>
+ *<br>
+ * Copyright (C) Paul Mackerras 1997.<br>
+ *<br>
+ * Copyright 2000, International Business Machines Corporation and others.<br>
+ * All Rights Reserved.<br>
+ * <br>
+ * This software has been released under the terms of the IBM Public<br>
+ * License. &nbsp;For details, see the LICENSE file in the top-level source</tt></font>
<br><font size=2><tt>+ * directory or online at http://www.openafs.org/dl/license10.html<br>
+ *<br>
+ * Flush the dcache and invalidate the icache for a range of addresses.<br>
+ *<br>
+ * flush_cache(addr, len)<br>
+ */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.section &nbsp; &nbsp; &nbsp; &nbsp;&quot;.text&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.align &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;2<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.globl &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;flush_cache<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.section &nbsp; &nbsp; &nbsp; &nbsp;&quot;.opd&quot;,&quot;aw&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.align &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;3<br>
+flush_cache:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.quad &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; .flush_cache,.TOC.@tocbase,0<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.previous<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.size &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; flush_cache,24<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.globl &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.flush_cache<br>
+.flush_cache:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;addi &nbsp; &nbsp;4,4,0x1f &nbsp; &nbsp; &nbsp;
&nbsp;/* len = (len + 0x1f) / 0x20 */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;rlwinm. 4,4,27,5,31<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;mtctr &nbsp; 4<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;beqlr<br>
+1: &nbsp; &nbsp; &nbsp;dcbf &nbsp; &nbsp;0,3<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;icbi &nbsp; &nbsp;0,3<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;addi &nbsp; &nbsp;3,3,0x20<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;bdnz &nbsp; &nbsp;1b<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;sync<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;isync<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;blr<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.long &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; 0<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.byte &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; 0,12,0,0,0,0,0,0<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.type &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; .flush_cache,@function<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;.size &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; .flush_cache,.-.flush_cache<br>
diff -ruN openafs-cvs/src/afs/LINUX/osi_probe.c openafs-cvs.ppc64/src/afs/LINUX/osi_probe.c<br>
--- openafs-cvs/src/afs/LINUX/osi_probe.c &nbsp; &nbsp; &nbsp; &nbsp;2005-03-11
05:35:42.000000000 +0100</tt></font>
<br><font size=2><tt>+++ openafs-cvs.ppc64/src/afs/LINUX/osi_probe.c &nbsp;
&nbsp; &nbsp; &nbsp;2005-03-31 16:58:20.125901096 +0200<br>
@@ -65,6 +65,10 @@<br>
 #include &lt;linux/unistd.h&gt;<br>
 #include &lt;linux/mm.h&gt;<br>
 <br>
+#if defined(AFS_PPC64_LINUX26_ENV)<br>
+#include &lt;asm/abs_addr.h&gt;<br>
+#endif<br>
+<br>
 #ifdef AFS_AMD64_LINUX20_ENV<br>
 #include &lt;asm/ia32_unistd.h&gt;<br>
 #endif<br>
@@ -78,6 +82,8 @@<br>
 /* lower bound of valid kernel text pointers */<br>
 #ifdef AFS_IA64_LINUX20_ENV<br>
 #define ktxt_lower_bound (((unsigned long)&amp;kernel_thread ) &nbsp;&amp;
0xfff00000L)<br>
+#elif defined(AFS_PPC64_LINUX20_ENV)<br>
+#define ktxt_lower_bound (KERNELBASE)<br>
 #else<br>
 #define ktxt_lower_bound (((unsigned long)&amp;kernel_thread ) &nbsp;&amp;
~0xfffffL)<br>
 #endif<br>
@@ -188,6 +194,7 @@<br>
 extern SYSCALLTYPE sys_call_table32[] __attribute__((weak));<br>
 extern SYSCALLTYPE sys_call_table_emu[] __attribute__((weak));<br>
 <br>
+extern asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf,
size_t count) __attribute__((weak));<br>
 extern asmlinkage long sys_close(unsigned int) __attribute__((weak));<br>
 extern asmlinkage long sys_chdir(const char *) __attribute__((weak));</tt></font>
<br><font size=2><tt>&nbsp;extern asmlinkage ssize_t sys_write(unsigned
int, const char *, size_t) __attribute__((weak));<br>
@@ -480,6 +487,10 @@<br>
 &nbsp; &nbsp; (unsigned long)(&amp;tasklist_lock) - 0x30000,<br>
 &nbsp; &nbsp; 0,<br>
 &nbsp; &nbsp; 0x6000,<br>
+#elif defined(AFS_PPC64_LINUX26_ENV)<br>
+ &nbsp; &nbsp;(unsigned long)(&amp;do_signal),<br>
+ &nbsp; &nbsp;0xfff,<br>
+ &nbsp; &nbsp;0x400,<br>
 #elif defined(AFS_PPC_LINUX20_ENV) || defined(AFS_PPC_LINUX20_ENV)<br>
 &nbsp; &nbsp; (unsigned long)&amp;init_mm,<br>
 &nbsp; &nbsp; 0xffff,<br>
@@ -617,6 +628,10 @@<br>
 <br>
 /********** Probing Configuration: ppc64, sparc64 sys_call_table32 **********/<br>
 #elif defined(AFS_PPC64_LINUX20_ENV) || defined(AFS_SPARC64_LINUX20_ENV)<br>
+struct fptr {<br>
+ &nbsp; &nbsp;void *ip;<br>
+ &nbsp; &nbsp;unsigned long gp;<br>
+};<br>
 <br>
 /* <br>
 &nbsp;* syscall pairs/triplets to probe<br>
@@ -692,6 +707,10 @@<br>
 &nbsp; &nbsp; (unsigned long)(&amp;sys_close),<br>
 &nbsp; &nbsp; 0xfffff,<br>
 &nbsp; &nbsp; 0x10000,<br>
+#elif defined(AFS_PPC64_LINUX26_ENV)<br>
+ &nbsp; &nbsp;(unsigned long)(&amp;do_signal),<br>
+ &nbsp; &nbsp;0xfff,<br>
+ &nbsp; &nbsp;0x400,<br>
 #else<br>
 &nbsp; &nbsp; (unsigned long)&amp;init_mm,<br>
 &nbsp; &nbsp; 0,<br>
@@ -859,7 +878,7 @@<br>
 &nbsp; &nbsp; return -1;<br>
 }<br>
 <br>
-static void *try(probectl *P, tryctl *T, PROBETYPE *ptr,<br>
+static void *try(probectl *P, tryctl *T, PROBETYPE *aptr,</tt></font>
<br><font size=2><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; unsigned long datalen)<br>
 {<br>
 #ifdef OSI_PROBE_KALLSYMS<br>
@@ -870,8 +889,9 @@<br>
 #endif<br>
 &nbsp; &nbsp; unsigned long offset, ip1, ip2, ip3;<br>
 &nbsp; &nbsp; int ret;<br>
+ &nbsp; &nbsp;PROBETYPE *ptr;<br>
 <br>
-#ifdef AFS_IA64_LINUX20_ENV<br>
+#if defined(AFS_IA64_LINUX20_ENV) || defined(AFS_PPC64_LINUX20_ENV)<br>
 &nbsp; &nbsp; ip1 = T-&gt;fn1 ? (unsigned long)((struct fptr *)T-&gt;fn1)-&gt;ip
: 0;<br>
 &nbsp; &nbsp; ip2 = T-&gt;fn2 ? (unsigned long)((struct fptr *)T-&gt;fn2)-&gt;ip
: 0;<br>
 &nbsp; &nbsp; ip3 = T-&gt;fn3 ? (unsigned long)((struct fptr *)T-&gt;fn3)-&gt;ip
: 0;<br>
@@ -890,11 +910,19 @@<br>
 &nbsp; &nbsp; if (!ip1 || !ip2 || (T-&gt;NR3 &gt;= 0 &amp;&amp; !ip3))<br>
 &nbsp; &nbsp; &nbsp; &nbsp; return 0;<br>
 <br>
- &nbsp; &nbsp;for (offset = 0; offset &lt; datalen; offset++, ptr++) {<br>
+ &nbsp; &nbsp;for (offset = 0; offset &lt; datalen; offset++, aptr++)
{<br>
+#if defined(AFS_PPC64_LINUX20_ENV)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;ptr = (PROBETYPE*)(*aptr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;if ((unsigned long)ptr &lt;= KERNELBASE)
{<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;}<br>
+#else<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;ptr = aptr;<br>
+#endif<br>
 &nbsp; &nbsp; &nbsp; &nbsp; ret = check_table(P, ptr);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; if (ret &gt;= 0) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* return value is number
of entries to skip */<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ptr &nbsp; &nbsp;+=
ret;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;aptr &nbsp; &nbsp;+=
ret;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; offset += ret;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; }<br>
@@ -957,7 +985,7 @@</tt></font>
<br><font size=2><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; }<br>
 <br>
-#ifdef AFS_IA64_LINUX20_ENV<br>
+#if defined(AFS_IA64_LINUX20_ENV) || defined(AFS_PPC64_LINUX20_ENV)<br>
 &nbsp; &nbsp; ip1 = P-&gt;verify_fn ? (unsigned long)((struct fptr *)(P-&gt;verify_fn))-&gt;ip
: 0;<br>
 #else<br>
 &nbsp; &nbsp; ip1 = (unsigned long)(P-&gt;verify_fn);<br>
diff -ruN openafs-cvs/src/afs/LINUX/osi_syscall.c openafs-cvs.ppc64/src/afs/LINUX/osi_syscall.c<br>
--- openafs-cvs/src/afs/LINUX/osi_syscall.c &nbsp; &nbsp; &nbsp; &nbsp;2005-03-11
05:35:42.000000000 +0100<br>
+++ openafs-cvs.ppc64/src/afs/LINUX/osi_syscall.c &nbsp; &nbsp; &nbsp;
&nbsp;2005-03-31 16:58:20.131900184 +0200<br>
@@ -36,6 +36,9 @@<br>
 #include &lt;linux/sched.h&gt;<br>
 #endif<br>
 <br>
+#ifndef NR_syscalls<br>
+#define NR_syscalls 222<br>
+#endif<br>
 <br>
 /* On SPARC64 and S390X, sys_call_table contains 32-bit entries<br>
 &nbsp;* even though pointers are 64 bit quantities.<br>
@@ -96,12 +99,30 @@<br>
 <br>
 <br>
 /***** PPC64 *****/<br>
-#ifdef AFS_PPC64_LINUX20_ENV<br>
-extern SYSCALLTYPE *afs_sys_call_table32;<br>
+#ifdef AFS_PPC64_LINUX26_ENV<br>
+static SYSCALLTYPE *afs_sys_call_table32;<br>
 static SYSCALLTYPE afs_ni_syscall32 = 0;<br>
+static SYSCALLTYPE old_sys_setgroupsp = 0;<br>
+static SYSCALLTYPE old_sys32_setgroupsp = 0;</tt></font>
<br><font size=2><tt>&nbsp;<br>
 extern int afs32_xsetgroups();<br>
 asmlinkage long (*sys32_setgroupsp)(int gidsetsize, gid_t *grouplist);<br>
+<br>
+asmlinkage long sys_close(unsigned int fd);<br>
+static void sys_setgroups_stub() <br>
+ &nbsp; &nbsp; &nbsp; &nbsp;__attribute__ ((pure,const,no_instrument_function));<br>
+static void sys_setgroups_stub() <br>
+{ <br>
+ &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;*** error! sys_setgroups_stub
called\n&quot;);<br>
+}<br>
+<br>
+static void sys32_setgroups_stub() <br>
+ &nbsp; &nbsp; &nbsp; &nbsp;__attribute__ ((pure,const,no_instrument_function));<br>
+static void sys32_setgroups_stub() <br>
+{ <br>
+ &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;*** error! sys32_setgroups_stub
called\n&quot;);<br>
+}<br>
+<br>
 #endif /* AFS_AMD64_LINUX20_ENV */<br>
 <br>
 <br>
@@ -213,6 +234,127 @@<br>
 <br>
 #endif /* AFS_IA64_LINUX20_ENV */<br>
 <br>
+/***** PPC64 ***** <br>
+ * Spring 2005<br>
+ * sys_call_table hook for PPC64 <br>
+ * by Soewono Effendi &lt;Soewono.Effendi@sysgo.de&gt;<br>
+ * for IBM Deutschland<br>
+ * Thanks go to SYSGO's team for their support:<br>
+ * Horst Birthelmer &lt;Horst.Birthelmer@sysgo.de&gt;<br>
+ * Marius Groeger &lt;Marius.Groeger@sysgo.de&gt;<br>
+ */<br>
+#if defined(AFS_PPC64_LINUX26_ENV)<br>
+extern void flush_cache(void *, unsigned long);<br>
+#define PPC_LO(v) ((v) &amp; 0xffff)</tt></font>
<br><font size=2><tt>+#define PPC_HI(v) (((v) &gt;&gt; 16) &amp; 0xffff)<br>
+#define PPC_HA(v) PPC_HI ((v) + 0x8000)<br>
+#define PPC_HLO(v) ((short)(((v) &gt;&gt; 32) &amp; 0xffff))<br>
+#define PPC_HHI(v) ((short)(((v) &gt;&gt; 48) &amp; 0xffff))<br>
+<br>
+struct ppc64_opd<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long funcaddr;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long r2;<br>
+};<br>
+<br>
+struct ppc64_stub<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned char jump[136];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long lr;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;struct ppc64_opd opd;<br>
+} __attribute__ ((packed));<br>
+<br>
+/* a stub to fix up r2 (TOC ptr) and to jump to our sys_call hook<br>
+ &nbsp; function. &nbsp;We patch the new r2 value and function pointer
into <br>
+ &nbsp; the stub. */<br>
+#define PPC64_STUB(stub) \<br>
+static struct ppc64_stub stub = \<br>
+{ .jump = { \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xf8, 0x41, 0x00, 0x28, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r2,40(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xc1, 0xff, 0xf0, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r30,-16(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xa1, 0xff, 0xe8, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r29,-24(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x7c, 0x5d, 0x13, 0x78, /* &nbsp; &nbsp; mr
&nbsp; &nbsp; &nbsp;r29,r2 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3c, 0x40, 0x12, 0x34, /*16: &nbsp;lis &nbsp;
&nbsp; r2,4660 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x60, 0x42, 0x56, 0x78, /*20: &nbsp;ori &nbsp;
&nbsp; r2,r2,22136 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x78, 0x42, 0x07, 0xc6, /* &nbsp; &nbsp; rldicr
&nbsp;r2,r2,32,31 */ \</tt></font>
<br><font size=2><tt>+ &nbsp; &nbsp; &nbsp; &nbsp;0x64, 0x42, 0x90, 0xab,
/*28: &nbsp;oris &nbsp; &nbsp;r2,r2,37035 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x60, 0x42, 0xcd, 0xef, /*32: &nbsp;ori &nbsp;
&nbsp; r2,r2,52719 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3f, 0xc2, 0x00, 0x00, /*36: &nbsp;addis
&nbsp; r30,r2,0 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3b, 0xde, 0x00, 0x00, /*40: &nbsp;addi &nbsp;
&nbsp;r30,r30,0 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xbe, 0x00, 0x88, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r29,136(r30) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x7f, 0xa8, 0x02, 0xa6, /* &nbsp; &nbsp; mflr
&nbsp; &nbsp;r29 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xbe, 0x00, 0x90, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r29,144(r30) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xde, 0x00, 0x98, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r30,152(r30) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x7f, 0xc8, 0x03, 0xa6, /* &nbsp; &nbsp; mtlr
&nbsp; &nbsp;r30 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xa1, 0xff, 0xe8, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r29,-24(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xc1, 0xff, 0xf0, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r30,-16(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x4e, 0x80, 0x00, 0x21, /* &nbsp; &nbsp; blrl
*/ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3c, 0x40, 0x12, 0x34, /*76: &nbsp;lis &nbsp;
&nbsp; r2,4660 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x60, 0x42, 0x56, 0x78, /*80: &nbsp;ori &nbsp;
&nbsp; r2,r2,22136 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x78, 0x42, 0x07, 0xc6, /* &nbsp; &nbsp; rldicr
&nbsp;r2,r2,32,31 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x64, 0x42, 0x90, 0xab, /*88: &nbsp;oris &nbsp;
&nbsp;r2,r2,37035 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x60, 0x42, 0xcd, 0xef, /*92: &nbsp;ori &nbsp;
&nbsp; r2,r2,52719 */ \</tt></font>
<br><font size=2><tt>+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xc1, 0xff, 0xf0,
/* &nbsp; &nbsp; std &nbsp; &nbsp; r30,-16(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xfb, 0xa1, 0xff, 0xe8, /* &nbsp; &nbsp; std
&nbsp; &nbsp; r29,-24(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3f, 0xc2, 0xab, 0xcd, /*104: addis &nbsp;
r30,r2,-21555 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x3b, 0xde, 0x78, 0x90, /*108: addi &nbsp;
&nbsp;r30,r30,30864 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xbe, 0x00, 0x90, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r29,144(r30) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x7f, 0xa8, 0x03, 0xa6, /* &nbsp; &nbsp; mtlr
&nbsp; &nbsp;r29 */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xe8, 0x5e, 0x00, 0x88, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r2,136(r30) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xa1, 0xff, 0xe8, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r29,-24(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0xeb, 0xc1, 0xff, 0xf0, /* &nbsp; &nbsp; ld
&nbsp; &nbsp; &nbsp;r30,-16(r1) */ \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;0x4e, 0x80, 0x00, 0x20 &nbsp;/* &nbsp; &nbsp;
blr */ \<br>
+}} <br>
+<br>
+static void * create_stub(struct ppc64_stub *stub,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;struct ppc64_opd *opd)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned short *p1, *p2, *p3, *p4;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long addr;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;stub-&gt;opd.funcaddr = opd-&gt;funcaddr;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;stub-&gt;opd.r2 = opd-&gt;r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;addr = (unsigned long) opd-&gt;r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p1 = (unsigned short*) &amp;stub-&gt;jump[18];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p2 = (unsigned short*) &amp;stub-&gt;jump[22];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p3 = (unsigned short*) &amp;stub-&gt;jump[30];</tt></font>
<br><font size=2><tt>+ &nbsp; &nbsp; &nbsp; &nbsp;p4 = (unsigned
short*) &amp;stub-&gt;jump[34];<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p1 = PPC_HHI(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p2 = PPC_HLO(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p3 = PPC_HI(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p4 = PPC_LO(addr);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;addr = (unsigned long) stub - opd-&gt;r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p1 = (unsigned short*) &amp;stub-&gt;jump[38];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p2 = (unsigned short*) &amp;stub-&gt;jump[42];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p1 = PPC_HA(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p2 = PPC_LO(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p1 = (unsigned short*) &amp;stub-&gt;jump[106];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p2 = (unsigned short*) &amp;stub-&gt;jump[110];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p1 = PPC_HA(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p2 = PPC_LO(addr);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;addr = (unsigned long) opd-&gt;r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p1 = (unsigned short*) &amp;stub-&gt;jump[78];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p2 = (unsigned short*) &amp;stub-&gt;jump[82];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p3 = (unsigned short*) &amp;stub-&gt;jump[90];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p4 = (unsigned short*) &amp;stub-&gt;jump[94];<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p1 = PPC_HHI(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p2 = PPC_HLO(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p3 = PPC_HI(addr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*p4 = PPC_LO(addr);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;flush_cache((void *)stub, sizeof(*stub));<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;return ((void*)(stub));<br>
+}<br>
+<br>
+PPC64_STUB(afs_sys_call_stub);<br>
+PPC64_STUB(afs_xsetgroups_stub);<br>
+PPC64_STUB(afs_xsetgroups32_stub);<br>
+#endif /* AFS_PPC64_LINUX26_ENV */<br>
 <br>
 <br>
 /**********************************************************************/</tt></font>
<br><font size=2><tt>@@ -264,7 +406,51 @@<br>
 &nbsp; &nbsp; /* XXX no 32-bit syscalls on IA64? */<br>
 <br>
 <br>
-/***** COMMON (except IA64) *****/<br>
+#elif defined(AFS_PPC64_LINUX26_ENV)<br>
+<br>
+ &nbsp; &nbsp;afs_sys_call_table = osi_find_syscall_table(0);<br>
+ &nbsp; &nbsp;if (afs_sys_call_table) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SYSCALLTYPE p;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct ppc64_opd* opd
= (struct ppc64_opd*) sys_close;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;unsigned long r2 = opd-&gt;r2;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opd = (struct ppc64_opd*)
afs_syscall;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table32
= (unsigned long)afs_sys_call_table - <br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NR_syscalls
* sizeof(SYSCALLTYPE);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;/* check we aren't already loaded
*/<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p = SYSCALL2POINTER afs_sys_call_table[_S(__NR_afs_syscall)];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;if ((unsigned long)p == opd-&gt;funcaddr)
{<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;AFS syscall
entry point already in use!\n&quot;);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EBUSY;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;}<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;/* setup AFS entry point */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p = create_stub(&amp;afs_sys_call_stub,
opd);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_ni_syscall = afs_sys_call_table[_S(__NR_afs_syscall)];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table[_S(__NR_afs_syscall)]
= POINTER2SYSCALL p;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;/* setup setgroups */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opd = (struct ppc64_opd*)
afs_xsetgroups;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p = create_stub(&amp;afs_xsetgroups_stub,
opd);</tt></font>
<br><font size=2><tt>+ &nbsp; &nbsp; &nbsp; &nbsp;old_sys_setgroupsp
= SYSCALL2POINTER afs_sys_call_table[_S(__NR_setgroups)];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table[_S(__NR_setgroups)]
= POINTER2SYSCALL p;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opd = (struct ppc64_opd*)
sys_setgroups_stub;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;opd-&gt;funcaddr = old_sys_setgroupsp;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;opd-&gt;r2 = r2;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;/* setup setgroups32 */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opd = (struct ppc64_opd*)
afs32_xsetgroups;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;p = create_stub(&amp;afs_xsetgroups32_stub,
opd);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;old_sys32_setgroupsp = SYSCALL2POINTER
afs_sys_call_table32[_S(__NR_setgroups)];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table32[_S(__NR_setgroups)]
= POINTER2SYSCALL p;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opd = (struct ppc64_opd*)
sys32_setgroups_stub;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;opd-&gt;funcaddr = old_sys32_setgroupsp;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;opd-&gt;r2 = r2;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;flush_cache((void *)afs_sys_call_table, 2*NR_syscalls*sizeof(void*));<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;sys_setgroupsp = sys_setgroups_stub;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;sys32_setgroupsp = sys32_setgroups_stub;<br>
+ &nbsp; &nbsp;}<br>
+/***** COMMON (except IA64 or PPC64) *****/<br>
 #else /* !AFS_IA64_LINUX20_ENV */<br>
 <br>
 &nbsp; &nbsp; afs_sys_call_table = osi_find_syscall_table(0);<br>
@@ -324,12 +510,6 @@<br>
 #endif /* AFS_AMD64_LINUX20_ENV */<br>
 <br>
 <br>
-/***** PPC64 *****/<br>
-#ifdef AFS_PPC64_LINUX20_ENV</tt></font>
<br><font size=2><tt>- &nbsp; &nbsp;/* XXX no 32-bit syscalls on PPC64?
*/<br>
-#endif<br>
-<br>
-<br>
 /***** SPARC64 *****/<br>
 #ifdef AFS_SPARC64_LINUX20_ENV<br>
 &nbsp; &nbsp; afs_sys_call_table32 = osi_find_syscall_table(1);<br>
@@ -371,6 +551,12 @@<br>
 #if defined(AFS_IA64_LINUX20_ENV)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; afs_sys_call_table[_S(__NR_setgroups)]
=<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; POINTER2SYSCALL((struct
fptr *)sys_setgroupsp)-&gt;ip;<br>
+#elif defined(AFS_PPC64_LINUX26_ENV)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table[_S(__NR_setgroups)]
=<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;POINTER2SYSCALL old_sys_setgroupsp;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;/* put back setgroups32 for PPC64
*/<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;afs_sys_call_table32[__NR_setgroups]
=<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;POINTER2SYSCALL old_sys32_setgroupsp;<br>
 #else /* AFS_IA64_LINUX20_ENV */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; afs_sys_call_table[_S(__NR_setgroups)]
=<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; POINTER2SYSCALL sys_setgroupsp;<br>
@@ -409,12 +595,6 @@<br>
 #endif<br>
 <br>
 <br>
-/***** PPC64 *****/<br>
-#ifdef AFS_PPC64_LINUX20_ENV<br>
- &nbsp; &nbsp;/* XXX no 32-bit syscalls on PPC64? */<br>
-#endif<br>
-<br>
-<br>
 /***** SPARC64 *****/<br>
 #ifdef AFS_SPARC64_LINUX20_ENV<br>
 &nbsp; &nbsp; if (afs_sys_call_table32) {<br>
diff -ruN openafs-cvs/src/cf/linux-test3.m4 openafs-cvs.ppc64/src/cf/linux-test3.m4<br>
--- openafs-cvs/src/cf/linux-test3.m4 &nbsp; &nbsp; &nbsp; &nbsp;2005-01-14
18:34:32.000000000 +0100</tt></font>
<br><font size=2><tt>+++ openafs-cvs.ppc64/src/cf/linux-test3.m4 &nbsp;
&nbsp; &nbsp; &nbsp;2005-03-31 16:58:20.132900032 +0200<br>
@@ -116,7 +116,7 @@<br>
 AC_DEFUN([LINUX_KERNEL_PAGE_FOLLOW_LINK],[<br>
 AC_MSG_CHECKING(for page_follow_link_light vs page_follow_link)<br>
 save_CPPFLAGS=&quot;$CPPFLAGS&quot;<br>
-CPPFLAGS=&quot;-I${LINUX_KERNEL_PATH}/include -Werror-implicit-function-declaration
-D__KERNEL__ $CPPFLAGS&quot;<br>
+CPPFLAGS=&quot;-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-default
-Werror-implicit-function-declaration -D__KERNEL__ $CPPFLAGS&quot;<br>
 AC_CACHE_VAL(ac_cv_linux_kernel_page_follow_link,<br>
 [<br>
 AC_TRY_COMPILE(<br>
diff -ruN openafs-cvs/src/cf/osconf.m4 openafs-cvs.ppc64/src/cf/osconf.m4<br>
--- openafs-cvs/src/cf/osconf.m4 &nbsp; &nbsp; &nbsp; &nbsp;2005-02-16
23:47:38.000000000 +0100<br>
+++ openafs-cvs.ppc64/src/cf/osconf.m4 &nbsp; &nbsp; &nbsp; &nbsp;2005-03-31
16:58:20.134899728 +0200<br>
@@ -262,8 +262,9 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MT_LIBS=&quot;-lpthread&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PAM_CFLAGS=&quot;-g
-O2 -Dlinux -DLINUX_PAM -fPIC&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SHLIB_LDFLAGS=&quot;-shared
-Xlinker -x&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SHLIB_CFLAGS=&quot;-fPIC&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TXLIBS=&quot;-lncurses&quot;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XCFLAGS=&quot;-g
-O2 -D_LARGEFILE64_SOURCE&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XCFLAGS=&quot;-g
-O2 -D_LARGEFILE64_SOURCE -fPIC&quot;</tt></font>
<br><font size=2><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;YACC=&quot;bison -y&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SHLIB_LINKER=&quot;${MT_CC}
-shared&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br>
diff -ruN openafs-cvs/src/libafs/Makefile.common.in openafs-cvs.ppc64/src/libafs/Makefile.common.in<br>
--- openafs-cvs/src/libafs/Makefile.common.in &nbsp; &nbsp; &nbsp; &nbsp;2005-01-29
06:42:02.000000000 +0100<br>
+++ openafs-cvs.ppc64/src/libafs/Makefile.common.in &nbsp; &nbsp; &nbsp;
&nbsp;2005-03-31 16:58:20.136899424 +0200<br>
@@ -393,6 +393,8 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; $(CRULE_NOOPT)<br>
 osi_sysctl.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_sysctl.c<br>
 &nbsp; &nbsp; &nbsp; &nbsp; $(CRULE_NOOPT)<br>
+osi_flush.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_flush.s<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;$(CRULE_OPT)<br>
 osi_alloc.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_alloc.c<br>
 &nbsp; &nbsp; &nbsp; &nbsp; $(CRULE_NOOPT)<br>
 osi_cred.o: $(TOP_SRCDIR)/afs/$(MKAFS_OSTYPE)/osi_cred.c<br>
diff -ruN openafs-cvs/src/libafs/MakefileProto.LINUX.in openafs-cvs.ppc64/src/libafs/MakefileProto.LINUX.in<br>
--- openafs-cvs/src/libafs/MakefileProto.LINUX.in &nbsp; &nbsp; &nbsp;
&nbsp;2005-03-23 00:52:59.000000000 +0100<br>
+++ openafs-cvs.ppc64/src/libafs/MakefileProto.LINUX.in &nbsp; &nbsp; &nbsp;
&nbsp;2005-03-31 16:59:57.913946112 +0200<br>
@@ -24,6 +24,9 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; osi_sysctl.o \<br>
 &nbsp; &nbsp; &nbsp; &nbsp; osi_vfsops.o \<br>
 &nbsp; &nbsp; &nbsp; &nbsp; osi_vm.o \<br>
+&lt;ppc64_linux26&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;osi_flush.o \</tt></font>
<br><font size=2><tt>+&lt;all&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; osi_vnodeops.o <br>
 <br>
 AFS_OS_NFSOBJS =<br>
@@ -82,7 +85,7 @@<br>
 &nbsp; &nbsp; &nbsp; -mcpu=ultrasparc -m64 -mno-fpu -mcmodel=medlow -ffixed-g4
-fcall-used-g5 -fcall-used-g7 -Wno-sign-compare<br>
 DEFINES = $(COMMON_DEFINES) -DCPU=sparc64<br>
 <br>
-&lt;ppc_linux22 ppc_linux24 ppc64_linux24&gt;<br>
+&lt;ppc_linux22 ppc_linux24 ppc64_linux24 ppc64_linux26&gt;<br>
 CCFLAGS = $(COMMON_KERN_CFLAGS) -fsigned-char -msoft-float -fno-builtin
-ffixed-r2<br>
 DEFINES = $(COMMON_DEFINES) -D__powerpc__<br>
 <br>
diff -ruN openafs-cvs/src/libafs/make_kbuild_makefile.pl openafs-cvs.ppc64/src/libafs/make_kbuild_makefile.pl<br>
--- openafs-cvs/src/libafs/make_kbuild_makefile.pl &nbsp; &nbsp; &nbsp;
&nbsp;2004-06-02 04:56:01.000000000 +0200<br>
+++ openafs-cvs.ppc64/src/libafs/make_kbuild_makefile.pl &nbsp; &nbsp;
&nbsp; &nbsp;2005-03-31 16:58:20.138899120 +0200<br>
@@ -51,6 +51,9 @@<br>
 &nbsp; &nbsp; elsif ($text =~ /^(\S+\.o):\s*(\S+\.c)/) { &nbsp; &nbsp;##
Dependency<br>
 &nbsp; &nbsp; &nbsp; $deps{$1} = $2;<br>
 &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp;elsif ($text =~ /^(\S+\.o):\s*(\S+\.s)/) { &nbsp; &nbsp;##
Dependency<br>
+ &nbsp; &nbsp; &nbsp;$deps{$1} = $2;<br>
+ &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; $text = '';<br>
 &nbsp; }<br>
 &nbsp; $F-&gt;close();<br>
@@ -74,8 +77,12 @@<br>
 <br>
 <br>
 foreach (@objects) {</tt></font>
<br><font size=2><tt>- &nbsp;($src = $_) =~ s/\.o$/.c/;<br>
 &nbsp; die &quot;No source known for $_\n&quot; unless exists $deps{$_};<br>
+ &nbsp;if($deps{$_} =~ /\.s$/) {<br>
+ &nbsp; &nbsp; ($src = $_) =~ s/\.o$/.s/;<br>
+ &nbsp;} else {<br>
+ &nbsp; &nbsp; ($src = $_) =~ s/\.o$/.c/;<br>
+ &nbsp;}<br>
 &nbsp; if (-e &quot;$KDIR/$src&quot; || -l &quot;$KDIR/$src&quot;) {<br>
 &nbsp; &nbsp; unlink(&quot;$KDIR/$src&quot;) or die &quot;$KDIR/$src:
$!\n&quot;;<br>
 &nbsp; }</tt></font>
<br>
<br>
<br>
<br>
<br><font size=2><tt><br>
</tt></font>
<br>
<br><font size=2 face="sans-serif">Sven<br>
-------------------------------------------------------------------------------------------------------------------------<br>
Dept. A153, &nbsp;STG/ISC EMEA AIS Strategy and Architecture<br>
Development Leader Open Enterprise System Virtualization <br>
IBM intranet ---&gt; http://w3.ais.mainz.de.ibm.com/oesv/<br>
internet ---&gt; http://www-5.ibm.com/services/de/storage/stonehenge.html<br>
Phone (+49)-6131-84-3151<br>
Fax &nbsp; &nbsp; &nbsp;(+49)-6131-84-6708<br>
Mobil &nbsp; (+49)-171-970-6664<br>
E-Mail : oehmes@de.ibm.com</font>
<br><font size=2><tt><br>
</tt></font></div>
--=_alternative 005B24BFC1256FD6_=--
--=_mixed 005B24BFC1256FD6_=
Content-Type: application/octet-stream; name="openafs-cvs-ppc64.patch"
Content-Disposition: attachment; filename="openafs-cvs-ppc64.patch"
Content-Transfer-Encoding: base64

ZGlmZiAtcnVOIG9wZW5hZnMtY3ZzL2FjaW5jbHVkZS5tNCBvcGVuYWZzLWN2cy5wcGM2NC9hY2lu
Y2x1ZGUubTQNCi0tLSBvcGVuYWZzLWN2cy9hY2luY2x1ZGUubTQJMjAwNS0wMy0zMSAxNjo1OTo0
Ni45Nzk4NzcwMTYgKzAyMDANCisrKyBvcGVuYWZzLWN2cy5wcGM2NC9hY2luY2x1ZGUubTQJMjAw
NS0wMy0zMSAxNjo1ODoyMC4xMTk5MDIwMDggKzAyMDANCkBAIC00NjAsNyArNDYwLDcgQEANCiAJ
CQlBRlNfU1lTTkFNRT0iaWE2NF9saW51eFhYIg0KIAkJCTs7DQogCQlwb3dlcnBjLSotbGludXgq
KQ0KLQkJCUFGU19TWVNOQU1FPSJwcGNfbGludXhYWCINCisJCQlBRlNfU1lTTkFNRT0iYC9iaW4v
YXJjaGBfbGludXhYWCINCiAJCQk7Ow0KIAkJcG93ZXJwYzY0LSotbGludXgqKQ0KIAkJCUFGU19T
WVNOQU1FPSJwcGM2NF9saW51eFhYIg0KZGlmZiAtcnVOIG9wZW5hZnMtY3ZzL3NyYy9hZnMvTElO
VVgvb3NpX2ZsdXNoLnMgb3BlbmFmcy1jdnMucHBjNjQvc3JjL2Fmcy9MSU5VWC9vc2lfZmx1c2gu
cw0KLS0tIG9wZW5hZnMtY3ZzL3NyYy9hZnMvTElOVVgvb3NpX2ZsdXNoLnMJMTk3MC0wMS0wMSAw
MTowMDowMC4wMDAwMDAwMDAgKzAxMDANCisrKyBvcGVuYWZzLWN2cy5wcGM2NC9zcmMvYWZzL0xJ
TlVYL29zaV9mbHVzaC5zCTIwMDUtMDMtMzEgMTY6NTg6MjAuMTIxOTAxNzA0ICswMjAwDQpAQCAt
MCwwICsxLDQxIEBADQorLyogVGFrZW4gZnJvbSBsaW51eC0yLjYvYXJjaC9wcGM2NC9ib290L3N0
cmluZy5TIA0KKyAqDQorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3Lg0KKyAq
DQorICogQ29weXJpZ2h0IDIwMDAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29y
cG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKyAqIA0KKyAq
IFRoaXMgc29mdHdhcmUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBJ
Qk0gUHVibGljDQorICogTGljZW5zZS4gIEZvciBkZXRhaWxzLCBzZWUgdGhlIExJQ0VOU0UgZmls
ZSBpbiB0aGUgdG9wLWxldmVsIHNvdXJjZQ0KKyAqIGRpcmVjdG9yeSBvciBvbmxpbmUgYXQgaHR0
cDovL3d3dy5vcGVuYWZzLm9yZy9kbC9saWNlbnNlMTAuaHRtbA0KKyAqDQorICogRmx1c2ggdGhl
IGRjYWNoZSBhbmQgaW52YWxpZGF0ZSB0aGUgaWNhY2hlIGZvciBhIHJhbmdlIG9mIGFkZHJlc3Nl
cy4NCisgKg0KKyAqIGZsdXNoX2NhY2hlKGFkZHIsIGxlbikNCisgKi8NCisJLnNlY3Rpb24gICAg
ICAgICIudGV4dCINCisJLmFsaWduICAgICAgICAgIDINCisJLmdsb2JsICAgICAgICAgIGZsdXNo
X2NhY2hlDQorCS5zZWN0aW9uICAgICAgICAiLm9wZCIsImF3Ig0KKwkuYWxpZ24gICAgICAgICAg
Mw0KK2ZsdXNoX2NhY2hlOg0KKwkucXVhZCAgICAgICAgICAgLmZsdXNoX2NhY2hlLC5UT0MuQHRv
Y2Jhc2UsMA0KKwkucHJldmlvdXMNCisJLnNpemUgICAgICAgICAgIGZsdXNoX2NhY2hlLDI0DQor
CS5nbG9ibCAgICAgICAgICAuZmx1c2hfY2FjaGUNCisuZmx1c2hfY2FjaGU6DQorICAgICAgICBh
ZGRpICAgIDQsNCwweDFmICAgICAgICAvKiBsZW4gPSAobGVuICsgMHgxZikgLyAweDIwICovDQor
ICAgICAgICBybHdpbm0uIDQsNCwyNyw1LDMxDQorICAgICAgICBtdGN0ciAgIDQNCisgICAgICAg
IGJlcWxyDQorMTogICAgICBkY2JmICAgIDAsMw0KKyAgICAgICAgaWNiaSAgICAwLDMNCisgICAg
ICAgIGFkZGkgICAgMywzLDB4MjANCisgICAgICAgIGJkbnogICAgMWINCisgICAgICAgIHN5bmMN
CisgICAgICAgIGlzeW5jDQorICAgICAgICBibHINCisJLmxvbmcgICAgICAgICAgIDANCisJLmJ5
dGUgICAgICAgICAgIDAsMTIsMCwwLDAsMCwwLDANCisJLnR5cGUgICAgICAgICAgIC5mbHVzaF9j
YWNoZSxAZnVuY3Rpb24NCisJLnNpemUgICAgICAgICAgIC5mbHVzaF9jYWNoZSwuLS5mbHVzaF9j
YWNoZQ0KZGlmZiAtcnVOIG9wZW5hZnMtY3ZzL3NyYy9hZnMvTElOVVgvb3NpX3Byb2JlLmMgb3Bl
bmFmcy1jdnMucHBjNjQvc3JjL2Fmcy9MSU5VWC9vc2lfcHJvYmUuYw0KLS0tIG9wZW5hZnMtY3Zz
L3NyYy9hZnMvTElOVVgvb3NpX3Byb2JlLmMJMjAwNS0wMy0xMSAwNTozNTo0Mi4wMDAwMDAwMDAg
KzAxMDANCisrKyBvcGVuYWZzLWN2cy5wcGM2NC9zcmMvYWZzL0xJTlVYL29zaV9wcm9iZS5jCTIw
MDUtMDMtMzEgMTY6NTg6MjAuMTI1OTAxMDk2ICswMjAwDQpAQCAtNjUsNiArNjUsMTAgQEANCiAj
aW5jbHVkZSA8bGludXgvdW5pc3RkLmg+DQogI2luY2x1ZGUgPGxpbnV4L21tLmg+DQogDQorI2lm
IGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjZfRU5WKQ0KKyNpbmNsdWRlIDxhc20vYWJzX2FkZHIu
aD4NCisjZW5kaWYNCisNCiAjaWZkZWYgQUZTX0FNRDY0X0xJTlVYMjBfRU5WDQogI2luY2x1ZGUg
PGFzbS9pYTMyX3VuaXN0ZC5oPg0KICNlbmRpZg0KQEAgLTc4LDYgKzgyLDggQEANCiAvKiBsb3dl
ciBib3VuZCBvZiB2YWxpZCBrZXJuZWwgdGV4dCBwb2ludGVycyAqLw0KICNpZmRlZiBBRlNfSUE2
NF9MSU5VWDIwX0VOVg0KICNkZWZpbmUga3R4dF9sb3dlcl9ib3VuZCAoKCh1bnNpZ25lZCBsb25n
KSZrZXJuZWxfdGhyZWFkICkgICYgMHhmZmYwMDAwMEwpDQorI2VsaWYgZGVmaW5lZChBRlNfUFBD
NjRfTElOVVgyMF9FTlYpDQorI2RlZmluZSBrdHh0X2xvd2VyX2JvdW5kIChLRVJORUxCQVNFKQ0K
ICNlbHNlDQogI2RlZmluZSBrdHh0X2xvd2VyX2JvdW5kICgoKHVuc2lnbmVkIGxvbmcpJmtlcm5l
bF90aHJlYWQgKSAgJiB+MHhmZmZmZkwpDQogI2VuZGlmDQpAQCAtMTg4LDYgKzE5NCw3IEBADQog
ZXh0ZXJuIFNZU0NBTExUWVBFIHN5c19jYWxsX3RhYmxlMzJbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFr
KSk7DQogZXh0ZXJuIFNZU0NBTExUWVBFIHN5c19jYWxsX3RhYmxlX2VtdVtdIF9fYXR0cmlidXRl
X18oKHdlYWspKTsNCiANCitleHRlcm4gYXNtbGlua2FnZSBzc2l6ZV90IHN5c19yZWFkKHVuc2ln
bmVkIGludCBmZCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCkgX19hdHRyaWJ1dGVf
Xygod2VhaykpOw0KIGV4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzX2Nsb3NlKHVuc2lnbmVkIGlu
dCkgX19hdHRyaWJ1dGVfXygod2VhaykpOw0KIGV4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzX2No
ZGlyKGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXygod2VhaykpOw0KIGV4dGVybiBhc21saW5r
YWdlIHNzaXplX3Qgc3lzX3dyaXRlKHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqLCBzaXplX3Qp
IF9fYXR0cmlidXRlX18oKHdlYWspKTsNCkBAIC00ODAsNiArNDg3LDEwIEBADQogICAgICh1bnNp
Z25lZCBsb25nKSgmdGFza2xpc3RfbG9jaykgLSAweDMwMDAwLA0KICAgICAwLA0KICAgICAweDYw
MDAsDQorI2VsaWYgZGVmaW5lZChBRlNfUFBDNjRfTElOVVgyNl9FTlYpDQorICAgICh1bnNpZ25l
ZCBsb25nKSgmZG9fc2lnbmFsKSwNCisgICAgMHhmZmYsDQorICAgIDB4NDAwLA0KICNlbGlmIGRl
ZmluZWQoQUZTX1BQQ19MSU5VWDIwX0VOVikgfHwgZGVmaW5lZChBRlNfUFBDX0xJTlVYMjBfRU5W
KQ0KICAgICAodW5zaWduZWQgbG9uZykmaW5pdF9tbSwNCiAgICAgMHhmZmZmLA0KQEAgLTYxNyw2
ICs2MjgsMTAgQEANCiANCiAvKioqKioqKioqKiBQcm9iaW5nIENvbmZpZ3VyYXRpb246IHBwYzY0
LCBzcGFyYzY0IHN5c19jYWxsX3RhYmxlMzIgKioqKioqKioqKi8NCiAjZWxpZiBkZWZpbmVkKEFG
U19QUEM2NF9MSU5VWDIwX0VOVikgfHwgZGVmaW5lZChBRlNfU1BBUkM2NF9MSU5VWDIwX0VOVikN
CitzdHJ1Y3QgZnB0ciB7DQorICAgIHZvaWQgKmlwOw0KKyAgICB1bnNpZ25lZCBsb25nIGdwOw0K
K307DQogDQogLyogDQogICogc3lzY2FsbCBwYWlycy90cmlwbGV0cyB0byBwcm9iZQ0KQEAgLTY5
Miw2ICs3MDcsMTAgQEANCiAgICAgKHVuc2lnbmVkIGxvbmcpKCZzeXNfY2xvc2UpLA0KICAgICAw
eGZmZmZmLA0KICAgICAweDEwMDAwLA0KKyNlbGlmIGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjZf
RU5WKQ0KKyAgICAodW5zaWduZWQgbG9uZykoJmRvX3NpZ25hbCksDQorICAgIDB4ZmZmLA0KKyAg
ICAweDQwMCwNCiAjZWxzZQ0KICAgICAodW5zaWduZWQgbG9uZykmaW5pdF9tbSwNCiAgICAgMCwN
CkBAIC04NTksNyArODc4LDcgQEANCiAgICAgcmV0dXJuIC0xOw0KIH0NCiANCi1zdGF0aWMgdm9p
ZCAqdHJ5KHByb2JlY3RsICpQLCB0cnljdGwgKlQsIFBST0JFVFlQRSAqcHRyLA0KK3N0YXRpYyB2
b2lkICp0cnkocHJvYmVjdGwgKlAsIHRyeWN0bCAqVCwgUFJPQkVUWVBFICphcHRyLA0KIAkJIHVu
c2lnbmVkIGxvbmcgZGF0YWxlbikNCiB7DQogI2lmZGVmIE9TSV9QUk9CRV9LQUxMU1lNUw0KQEAg
LTg3MCw4ICs4ODksOSBAQA0KICNlbmRpZg0KICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgaXAx
LCBpcDIsIGlwMzsNCiAgICAgaW50IHJldDsNCisgICAgUFJPQkVUWVBFICpwdHI7DQogDQotI2lm
ZGVmIEFGU19JQTY0X0xJTlVYMjBfRU5WDQorI2lmIGRlZmluZWQoQUZTX0lBNjRfTElOVVgyMF9F
TlYpIHx8IGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjBfRU5WKQ0KICAgICBpcDEgPSBULT5mbjEg
PyAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBmcHRyICopVC0+Zm4xKS0+aXAgOiAwOw0KICAgICBp
cDIgPSBULT5mbjIgPyAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBmcHRyICopVC0+Zm4yKS0+aXAg
OiAwOw0KICAgICBpcDMgPSBULT5mbjMgPyAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBmcHRyICop
VC0+Zm4zKS0+aXAgOiAwOw0KQEAgLTg5MCwxMSArOTEwLDE5IEBADQogICAgIGlmICghaXAxIHx8
ICFpcDIgfHwgKFQtPk5SMyA+PSAwICYmICFpcDMpKQ0KIAlyZXR1cm4gMDsNCiANCi0gICAgZm9y
IChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhbGVuOyBvZmZzZXQrKywgcHRyKyspIHsNCisgICAg
Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhbGVuOyBvZmZzZXQrKywgYXB0cisrKSB7DQor
I2lmIGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjBfRU5WKQ0KKwlwdHIgPSAoUFJPQkVUWVBFKiko
KmFwdHIpOw0KKwlpZiAoKHVuc2lnbmVkIGxvbmcpcHRyIDw9IEtFUk5FTEJBU0UpIHsNCisJCWNv
bnRpbnVlOw0KKwl9DQorI2Vsc2UNCisJcHRyID0gYXB0cjsNCisjZW5kaWYNCiAJcmV0ID0gY2hl
Y2tfdGFibGUoUCwgcHRyKTsNCiAJaWYgKHJldCA+PSAwKSB7DQogCSAgICAvKiByZXR1cm4gdmFs
dWUgaXMgbnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcCAqLw0KLQkgICAgcHRyICAgICs9IHJldDsN
CisJICAgIGFwdHIgICAgKz0gcmV0Ow0KIAkgICAgb2Zmc2V0ICs9IHJldDsNCiAJICAgIGNvbnRp
bnVlOw0KIAl9DQpAQCAtOTU3LDcgKzk4NSw3IEBADQogCX0NCiAgICAgfQ0KIA0KLSNpZmRlZiBB
RlNfSUE2NF9MSU5VWDIwX0VOVg0KKyNpZiBkZWZpbmVkKEFGU19JQTY0X0xJTlVYMjBfRU5WKSB8
fCBkZWZpbmVkKEFGU19QUEM2NF9MSU5VWDIwX0VOVikNCiAgICAgaXAxID0gUC0+dmVyaWZ5X2Zu
ID8gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgZnB0ciAqKShQLT52ZXJpZnlfZm4pKS0+aXAgOiAw
Ow0KICNlbHNlDQogICAgIGlwMSA9ICh1bnNpZ25lZCBsb25nKShQLT52ZXJpZnlfZm4pOw0KZGlm
ZiAtcnVOIG9wZW5hZnMtY3ZzL3NyYy9hZnMvTElOVVgvb3NpX3N5c2NhbGwuYyBvcGVuYWZzLWN2
cy5wcGM2NC9zcmMvYWZzL0xJTlVYL29zaV9zeXNjYWxsLmMNCi0tLSBvcGVuYWZzLWN2cy9zcmMv
YWZzL0xJTlVYL29zaV9zeXNjYWxsLmMJMjAwNS0wMy0xMSAwNTozNTo0Mi4wMDAwMDAwMDAgKzAx
MDANCisrKyBvcGVuYWZzLWN2cy5wcGM2NC9zcmMvYWZzL0xJTlVYL29zaV9zeXNjYWxsLmMJMjAw
NS0wMy0zMSAxNjo1ODoyMC4xMzE5MDAxODQgKzAyMDANCkBAIC0zNiw2ICszNiw5IEBADQogI2lu
Y2x1ZGUgPGxpbnV4L3NjaGVkLmg+DQogI2VuZGlmDQogDQorI2lmbmRlZiBOUl9zeXNjYWxscw0K
KyNkZWZpbmUgTlJfc3lzY2FsbHMgMjIyDQorI2VuZGlmDQogDQogLyogT24gU1BBUkM2NCBhbmQg
UzM5MFgsIHN5c19jYWxsX3RhYmxlIGNvbnRhaW5zIDMyLWJpdCBlbnRyaWVzDQogICogZXZlbiB0
aG91Z2ggcG9pbnRlcnMgYXJlIDY0IGJpdCBxdWFudGl0aWVzLg0KQEAgLTk2LDEyICs5OSwzMCBA
QA0KIA0KIA0KIC8qKioqKiBQUEM2NCAqKioqKi8NCi0jaWZkZWYgQUZTX1BQQzY0X0xJTlVYMjBf
RU5WDQotZXh0ZXJuIFNZU0NBTExUWVBFICphZnNfc3lzX2NhbGxfdGFibGUzMjsNCisjaWZkZWYg
QUZTX1BQQzY0X0xJTlVYMjZfRU5WDQorc3RhdGljIFNZU0NBTExUWVBFICphZnNfc3lzX2NhbGxf
dGFibGUzMjsNCiBzdGF0aWMgU1lTQ0FMTFRZUEUgYWZzX25pX3N5c2NhbGwzMiA9IDA7DQorc3Rh
dGljIFNZU0NBTExUWVBFIG9sZF9zeXNfc2V0Z3JvdXBzcCA9IDA7DQorc3RhdGljIFNZU0NBTExU
WVBFIG9sZF9zeXMzMl9zZXRncm91cHNwID0gMDsNCiANCiBleHRlcm4gaW50IGFmczMyX3hzZXRn
cm91cHMoKTsNCiBhc21saW5rYWdlIGxvbmcgKCpzeXMzMl9zZXRncm91cHNwKShpbnQgZ2lkc2V0
c2l6ZSwgZ2lkX3QgKmdyb3VwbGlzdCk7DQorDQorYXNtbGlua2FnZSBsb25nIHN5c19jbG9zZSh1
bnNpZ25lZCBpbnQgZmQpOw0KK3N0YXRpYyB2b2lkIHN5c19zZXRncm91cHNfc3R1YigpIA0KKwlf
X2F0dHJpYnV0ZV9fICgocHVyZSxjb25zdCxub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7DQorc3Rh
dGljIHZvaWQgc3lzX3NldGdyb3Vwc19zdHViKCkgDQoreyANCisJcHJpbnRmKCIqKiogZXJyb3Ih
IHN5c19zZXRncm91cHNfc3R1YiBjYWxsZWRcbiIpOw0KK30NCisNCitzdGF0aWMgdm9pZCBzeXMz
Ml9zZXRncm91cHNfc3R1YigpIA0KKwlfX2F0dHJpYnV0ZV9fICgocHVyZSxjb25zdCxub19pbnN0
cnVtZW50X2Z1bmN0aW9uKSk7DQorc3RhdGljIHZvaWQgc3lzMzJfc2V0Z3JvdXBzX3N0dWIoKSAN
Cit7IA0KKwlwcmludGYoIioqKiBlcnJvciEgc3lzMzJfc2V0Z3JvdXBzX3N0dWIgY2FsbGVkXG4i
KTsNCit9DQorDQogI2VuZGlmIC8qIEFGU19BTUQ2NF9MSU5VWDIwX0VOViAqLw0KIA0KIA0KQEAg
LTIxMyw2ICsyMzQsMTI3IEBADQogDQogI2VuZGlmIC8qIEFGU19JQTY0X0xJTlVYMjBfRU5WICov
DQogDQorLyoqKioqIFBQQzY0ICoqKioqIA0KKyAqIFNwcmluZyAyMDA1DQorICogc3lzX2NhbGxf
dGFibGUgaG9vayBmb3IgUFBDNjQgDQorICogYnkgU29ld29ubyBFZmZlbmRpIDxTb2V3b25vLkVm
ZmVuZGlAc3lzZ28uZGU+DQorICogZm9yIElCTSBEZXV0c2NobGFuZA0KKyAqIFRoYW5rcyBnbyB0
byBTWVNHTydzIHRlYW0gZm9yIHRoZWlyIHN1cHBvcnQ6DQorICogSG9yc3QgQmlydGhlbG1lciA8
SG9yc3QuQmlydGhlbG1lckBzeXNnby5kZT4NCisgKiBNYXJpdXMgR3JvZWdlciA8TWFyaXVzLkdy
b2VnZXJAc3lzZ28uZGU+DQorICovDQorI2lmIGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjZfRU5W
KQ0KK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlKHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7DQorI2Rl
ZmluZSBQUENfTE8odikgKCh2KSAmIDB4ZmZmZikNCisjZGVmaW5lIFBQQ19ISSh2KSAoKCh2KSA+
PiAxNikgJiAweGZmZmYpDQorI2RlZmluZSBQUENfSEEodikgUFBDX0hJICgodikgKyAweDgwMDAp
DQorI2RlZmluZSBQUENfSExPKHYpICgoc2hvcnQpKCgodikgPj4gMzIpICYgMHhmZmZmKSkNCisj
ZGVmaW5lIFBQQ19ISEkodikgKChzaG9ydCkoKCh2KSA+PiA0OCkgJiAweGZmZmYpKQ0KKw0KK3N0
cnVjdCBwcGM2NF9vcGQNCit7DQorCXVuc2lnbmVkIGxvbmcgZnVuY2FkZHI7DQorCXVuc2lnbmVk
IGxvbmcgcjI7DQorfTsNCisNCitzdHJ1Y3QgcHBjNjRfc3R1Yg0KK3sNCisJdW5zaWduZWQgY2hh
ciBqdW1wWzEzNl07DQorCXVuc2lnbmVkIGxvbmcgcjI7DQorCXVuc2lnbmVkIGxvbmcgbHI7DQor
CXN0cnVjdCBwcGM2NF9vcGQgb3BkOw0KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOw0KKw0K
Ky8qIGEgc3R1YiB0byBmaXggdXAgcjIgKFRPQyBwdHIpIGFuZCB0byBqdW1wIHRvIG91ciBzeXNf
Y2FsbCBob29rDQorICAgZnVuY3Rpb24uICBXZSBwYXRjaCB0aGUgbmV3IHIyIHZhbHVlIGFuZCBm
dW5jdGlvbiBwb2ludGVyIGludG8gDQorICAgdGhlIHN0dWIuICovDQorI2RlZmluZSBQUEM2NF9T
VFVCKHN0dWIpIFwNCitzdGF0aWMgc3RydWN0IHBwYzY0X3N0dWIgc3R1YiA9IFwNCit7IC5qdW1w
ID0geyBcDQorICAgICAgICAweGY4LCAweDQxLCAweDAwLCAweDI4LCAvKiAgICAgc3RkICAgICBy
Miw0MChyMSkgKi8gXA0KKyAgICAgICAgMHhmYiwgMHhjMSwgMHhmZiwgMHhmMCwgLyogICAgIHN0
ZCAgICAgcjMwLC0xNihyMSkgKi8gXA0KKyAgICAgICAgMHhmYiwgMHhhMSwgMHhmZiwgMHhlOCwg
LyogICAgIHN0ZCAgICAgcjI5LC0yNChyMSkgKi8gXA0KKyAgICAgICAgMHg3YywgMHg1ZCwgMHgx
MywgMHg3OCwgLyogICAgIG1yICAgICAgcjI5LHIyICovIFwNCisgICAgICAgIDB4M2MsIDB4NDAs
IDB4MTIsIDB4MzQsIC8qMTY6ICBsaXMgICAgIHIyLDQ2NjAgKi8gXA0KKyAgICAgICAgMHg2MCwg
MHg0MiwgMHg1NiwgMHg3OCwgLyoyMDogIG9yaSAgICAgcjIscjIsMjIxMzYgKi8gXA0KKyAgICAg
ICAgMHg3OCwgMHg0MiwgMHgwNywgMHhjNiwgLyogICAgIHJsZGljciAgcjIscjIsMzIsMzEgKi8g
XA0KKyAgICAgICAgMHg2NCwgMHg0MiwgMHg5MCwgMHhhYiwgLyoyODogIG9yaXMgICAgcjIscjIs
MzcwMzUgKi8gXA0KKyAgICAgICAgMHg2MCwgMHg0MiwgMHhjZCwgMHhlZiwgLyozMjogIG9yaSAg
ICAgcjIscjIsNTI3MTkgKi8gXA0KKyAgICAgICAgMHgzZiwgMHhjMiwgMHgwMCwgMHgwMCwgLyoz
NjogIGFkZGlzICAgcjMwLHIyLDAgKi8gXA0KKyAgICAgICAgMHgzYiwgMHhkZSwgMHgwMCwgMHgw
MCwgLyo0MDogIGFkZGkgICAgcjMwLHIzMCwwICovIFwNCisgICAgICAgIDB4ZmIsIDB4YmUsIDB4
MDAsIDB4ODgsIC8qICAgICBzdGQgICAgIHIyOSwxMzYocjMwKSAqLyBcDQorICAgICAgICAweDdm
LCAweGE4LCAweDAyLCAweGE2LCAvKiAgICAgbWZsciAgICByMjkgKi8gXA0KKyAgICAgICAgMHhm
YiwgMHhiZSwgMHgwMCwgMHg5MCwgLyogICAgIHN0ZCAgICAgcjI5LDE0NChyMzApICovIFwNCisg
ICAgICAgIDB4ZWIsIDB4ZGUsIDB4MDAsIDB4OTgsIC8qICAgICBsZCAgICAgIHIzMCwxNTIocjMw
KSAqLyBcDQorICAgICAgICAweDdmLCAweGM4LCAweDAzLCAweGE2LCAvKiAgICAgbXRsciAgICBy
MzAgKi8gXA0KKyAgICAgICAgMHhlYiwgMHhhMSwgMHhmZiwgMHhlOCwgLyogICAgIGxkICAgICAg
cjI5LC0yNChyMSkgKi8gXA0KKyAgICAgICAgMHhlYiwgMHhjMSwgMHhmZiwgMHhmMCwgLyogICAg
IGxkICAgICAgcjMwLC0xNihyMSkgKi8gXA0KKyAgICAgICAgMHg0ZSwgMHg4MCwgMHgwMCwgMHgy
MSwgLyogICAgIGJscmwgKi8gXA0KKyAgICAgICAgMHgzYywgMHg0MCwgMHgxMiwgMHgzNCwgLyo3
NjogIGxpcyAgICAgcjIsNDY2MCAqLyBcDQorICAgICAgICAweDYwLCAweDQyLCAweDU2LCAweDc4
LCAvKjgwOiAgb3JpICAgICByMixyMiwyMjEzNiAqLyBcDQorICAgICAgICAweDc4LCAweDQyLCAw
eDA3LCAweGM2LCAvKiAgICAgcmxkaWNyICByMixyMiwzMiwzMSAqLyBcDQorICAgICAgICAweDY0
LCAweDQyLCAweDkwLCAweGFiLCAvKjg4OiAgb3JpcyAgICByMixyMiwzNzAzNSAqLyBcDQorICAg
ICAgICAweDYwLCAweDQyLCAweGNkLCAweGVmLCAvKjkyOiAgb3JpICAgICByMixyMiw1MjcxOSAq
LyBcDQorICAgICAgICAweGZiLCAweGMxLCAweGZmLCAweGYwLCAvKiAgICAgc3RkICAgICByMzAs
LTE2KHIxKSAqLyBcDQorICAgICAgICAweGZiLCAweGExLCAweGZmLCAweGU4LCAvKiAgICAgc3Rk
ICAgICByMjksLTI0KHIxKSAqLyBcDQorICAgICAgICAweDNmLCAweGMyLCAweGFiLCAweGNkLCAv
KjEwNDogYWRkaXMgICByMzAscjIsLTIxNTU1ICovIFwNCisgICAgICAgIDB4M2IsIDB4ZGUsIDB4
NzgsIDB4OTAsIC8qMTA4OiBhZGRpICAgIHIzMCxyMzAsMzA4NjQgKi8gXA0KKyAgICAgICAgMHhl
YiwgMHhiZSwgMHgwMCwgMHg5MCwgLyogICAgIGxkICAgICAgcjI5LDE0NChyMzApICovIFwNCisg
ICAgICAgIDB4N2YsIDB4YTgsIDB4MDMsIDB4YTYsIC8qICAgICBtdGxyICAgIHIyOSAqLyBcDQor
ICAgICAgICAweGU4LCAweDVlLCAweDAwLCAweDg4LCAvKiAgICAgbGQgICAgICByMiwxMzYocjMw
KSAqLyBcDQorICAgICAgICAweGViLCAweGExLCAweGZmLCAweGU4LCAvKiAgICAgbGQgICAgICBy
MjksLTI0KHIxKSAqLyBcDQorICAgICAgICAweGViLCAweGMxLCAweGZmLCAweGYwLCAvKiAgICAg
bGQgICAgICByMzAsLTE2KHIxKSAqLyBcDQorICAgICAgICAweDRlLCAweDgwLCAweDAwLCAweDIw
ICAvKiAgICAgYmxyICovIFwNCit9fSANCisNCitzdGF0aWMgdm9pZCAqIGNyZWF0ZV9zdHViKHN0
cnVjdCBwcGM2NF9zdHViICpzdHViLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0
IHBwYzY0X29wZCAqb3BkKQ0KK3sNCisJdW5zaWduZWQgc2hvcnQgKnAxLCAqcDIsICpwMywgKnA0
Ow0KKwl1bnNpZ25lZCBsb25nIGFkZHI7DQorDQorCXN0dWItPm9wZC5mdW5jYWRkciA9IG9wZC0+
ZnVuY2FkZHI7DQorCXN0dWItPm9wZC5yMiA9IG9wZC0+cjI7DQorCWFkZHIgPSAodW5zaWduZWQg
bG9uZykgb3BkLT5yMjsNCisJcDEgPSAodW5zaWduZWQgc2hvcnQqKSAmc3R1Yi0+anVtcFsxOF07
DQorCXAyID0gKHVuc2lnbmVkIHNob3J0KikgJnN0dWItPmp1bXBbMjJdOw0KKwlwMyA9ICh1bnNp
Z25lZCBzaG9ydCopICZzdHViLT5qdW1wWzMwXTsNCisJcDQgPSAodW5zaWduZWQgc2hvcnQqKSAm
c3R1Yi0+anVtcFszNF07DQorDQorCSpwMSA9IFBQQ19ISEkoYWRkcik7DQorCSpwMiA9IFBQQ19I
TE8oYWRkcik7DQorCSpwMyA9IFBQQ19ISShhZGRyKTsNCisJKnA0ID0gUFBDX0xPKGFkZHIpOw0K
Kw0KKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHN0dWIgLSBvcGQtPnIyOw0KKwlwMSA9ICh1bnNp
Z25lZCBzaG9ydCopICZzdHViLT5qdW1wWzM4XTsNCisJcDIgPSAodW5zaWduZWQgc2hvcnQqKSAm
c3R1Yi0+anVtcFs0Ml07DQorCSpwMSA9IFBQQ19IQShhZGRyKTsNCisJKnAyID0gUFBDX0xPKGFk
ZHIpOw0KKwlwMSA9ICh1bnNpZ25lZCBzaG9ydCopICZzdHViLT5qdW1wWzEwNl07DQorCXAyID0g
KHVuc2lnbmVkIHNob3J0KikgJnN0dWItPmp1bXBbMTEwXTsNCisJKnAxID0gUFBDX0hBKGFkZHIp
Ow0KKwkqcDIgPSBQUENfTE8oYWRkcik7DQorDQorCWFkZHIgPSAodW5zaWduZWQgbG9uZykgb3Bk
LT5yMjsNCisJcDEgPSAodW5zaWduZWQgc2hvcnQqKSAmc3R1Yi0+anVtcFs3OF07DQorCXAyID0g
KHVuc2lnbmVkIHNob3J0KikgJnN0dWItPmp1bXBbODJdOw0KKwlwMyA9ICh1bnNpZ25lZCBzaG9y
dCopICZzdHViLT5qdW1wWzkwXTsNCisJcDQgPSAodW5zaWduZWQgc2hvcnQqKSAmc3R1Yi0+anVt
cFs5NF07DQorDQorCSpwMSA9IFBQQ19ISEkoYWRkcik7DQorCSpwMiA9IFBQQ19ITE8oYWRkcik7
DQorCSpwMyA9IFBQQ19ISShhZGRyKTsNCisJKnA0ID0gUFBDX0xPKGFkZHIpOw0KKw0KKyAgICAg
ICAgZmx1c2hfY2FjaGUoKHZvaWQgKilzdHViLCBzaXplb2YoKnN0dWIpKTsNCisgICAgICAgIHJl
dHVybiAoKHZvaWQqKShzdHViKSk7DQorfQ0KKw0KK1BQQzY0X1NUVUIoYWZzX3N5c19jYWxsX3N0
dWIpOw0KK1BQQzY0X1NUVUIoYWZzX3hzZXRncm91cHNfc3R1Yik7DQorUFBDNjRfU1RVQihhZnNf
eHNldGdyb3VwczMyX3N0dWIpOw0KKyNlbmRpZiAvKiBBRlNfUFBDNjRfTElOVVgyNl9FTlYgKi8N
CiANCiANCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKi8NCkBAIC0yNjQsNyArNDA2LDUxIEBADQogICAgIC8qIFhY
WCBubyAzMi1iaXQgc3lzY2FsbHMgb24gSUE2ND8gKi8NCiANCiANCi0vKioqKiogQ09NTU9OIChl
eGNlcHQgSUE2NCkgKioqKiovDQorI2VsaWYgZGVmaW5lZChBRlNfUFBDNjRfTElOVVgyNl9FTlYp
DQorDQorICAgIGFmc19zeXNfY2FsbF90YWJsZSA9IG9zaV9maW5kX3N5c2NhbGxfdGFibGUoMCk7
DQorICAgIGlmIChhZnNfc3lzX2NhbGxfdGFibGUpIHsNCisgICAgCVNZU0NBTExUWVBFIHA7DQor
ICAgIAlzdHJ1Y3QgcHBjNjRfb3BkKiBvcGQgPSAoc3RydWN0IHBwYzY0X29wZCopIHN5c19jbG9z
ZTsNCisJdW5zaWduZWQgbG9uZyByMiA9IG9wZC0+cjI7DQorICAgIAlvcGQgPSAoc3RydWN0IHBw
YzY0X29wZCopIGFmc19zeXNjYWxsOw0KKyAgICAJYWZzX3N5c19jYWxsX3RhYmxlMzIgPSAodW5z
aWduZWQgbG9uZylhZnNfc3lzX2NhbGxfdGFibGUgLSANCisJCU5SX3N5c2NhbGxzICogc2l6ZW9m
KFNZU0NBTExUWVBFKTsNCisJLyogY2hlY2sgd2UgYXJlbid0IGFscmVhZHkgbG9hZGVkICovDQor
CXAgPSBTWVNDQUxMMlBPSU5URVIgYWZzX3N5c19jYWxsX3RhYmxlW19TKF9fTlJfYWZzX3N5c2Nh
bGwpXTsNCisJaWYgKCh1bnNpZ25lZCBsb25nKXAgPT0gb3BkLT5mdW5jYWRkcikgew0KKwkgICAg
cHJpbnRmKCJBRlMgc3lzY2FsbCBlbnRyeSBwb2ludCBhbHJlYWR5IGluIHVzZSFcbiIpOw0KKwkg
ICAgcmV0dXJuIC1FQlVTWTsNCisJfQ0KKwkvKiBzZXR1cCBBRlMgZW50cnkgcG9pbnQgKi8NCisJ
cCA9IGNyZWF0ZV9zdHViKCZhZnNfc3lzX2NhbGxfc3R1Yiwgb3BkKTsNCisJYWZzX25pX3N5c2Nh
bGwgPSBhZnNfc3lzX2NhbGxfdGFibGVbX1MoX19OUl9hZnNfc3lzY2FsbCldOw0KKwlhZnNfc3lz
X2NhbGxfdGFibGVbX1MoX19OUl9hZnNfc3lzY2FsbCldID0gUE9JTlRFUjJTWVNDQUxMIHA7DQor
DQorCS8qIHNldHVwIHNldGdyb3VwcyAqLw0KKyAgICAJb3BkID0gKHN0cnVjdCBwcGM2NF9vcGQq
KSBhZnNfeHNldGdyb3VwczsNCisJcCA9IGNyZWF0ZV9zdHViKCZhZnNfeHNldGdyb3Vwc19zdHVi
LCBvcGQpOw0KKwlvbGRfc3lzX3NldGdyb3Vwc3AgPSBTWVNDQUxMMlBPSU5URVIgYWZzX3N5c19j
YWxsX3RhYmxlW19TKF9fTlJfc2V0Z3JvdXBzKV07DQorCWFmc19zeXNfY2FsbF90YWJsZVtfUyhf
X05SX3NldGdyb3VwcyldID0gUE9JTlRFUjJTWVNDQUxMIHA7DQorICAgIAlvcGQgPSAoc3RydWN0
IHBwYzY0X29wZCopIHN5c19zZXRncm91cHNfc3R1YjsNCisJb3BkLT5mdW5jYWRkciA9IG9sZF9z
eXNfc2V0Z3JvdXBzcDsNCisJb3BkLT5yMiA9IHIyOw0KKw0KKwkvKiBzZXR1cCBzZXRncm91cHMz
MiAqLw0KKyAgICAJb3BkID0gKHN0cnVjdCBwcGM2NF9vcGQqKSBhZnMzMl94c2V0Z3JvdXBzOw0K
KwlwID0gY3JlYXRlX3N0dWIoJmFmc194c2V0Z3JvdXBzMzJfc3R1Yiwgb3BkKTsNCisJb2xkX3N5
czMyX3NldGdyb3Vwc3AgPSBTWVNDQUxMMlBPSU5URVIgYWZzX3N5c19jYWxsX3RhYmxlMzJbX1Mo
X19OUl9zZXRncm91cHMpXTsNCisJYWZzX3N5c19jYWxsX3RhYmxlMzJbX1MoX19OUl9zZXRncm91
cHMpXSA9IFBPSU5URVIyU1lTQ0FMTCBwOw0KKyAgICAJb3BkID0gKHN0cnVjdCBwcGM2NF9vcGQq
KSBzeXMzMl9zZXRncm91cHNfc3R1YjsNCisJb3BkLT5mdW5jYWRkciA9IG9sZF9zeXMzMl9zZXRn
cm91cHNwOw0KKwlvcGQtPnIyID0gcjI7DQorDQorICAgICAgICBmbHVzaF9jYWNoZSgodm9pZCAq
KWFmc19zeXNfY2FsbF90YWJsZSwgMipOUl9zeXNjYWxscypzaXplb2Yodm9pZCopKTsNCisNCisJ
c3lzX3NldGdyb3Vwc3AgPSBzeXNfc2V0Z3JvdXBzX3N0dWI7DQorCXN5czMyX3NldGdyb3Vwc3Ag
PSBzeXMzMl9zZXRncm91cHNfc3R1YjsNCisgICAgfQ0KKy8qKioqKiBDT01NT04gKGV4Y2VwdCBJ
QTY0IG9yIFBQQzY0KSAqKioqKi8NCiAjZWxzZSAvKiAhQUZTX0lBNjRfTElOVVgyMF9FTlYgKi8N
CiANCiAgICAgYWZzX3N5c19jYWxsX3RhYmxlID0gb3NpX2ZpbmRfc3lzY2FsbF90YWJsZSgwKTsN
CkBAIC0zMjQsMTIgKzUxMCw2IEBADQogI2VuZGlmIC8qIEFGU19BTUQ2NF9MSU5VWDIwX0VOViAq
Lw0KIA0KIA0KLS8qKioqKiBQUEM2NCAqKioqKi8NCi0jaWZkZWYgQUZTX1BQQzY0X0xJTlVYMjBf
RU5WDQotICAgIC8qIFhYWCBubyAzMi1iaXQgc3lzY2FsbHMgb24gUFBDNjQ/ICovDQotI2VuZGlm
DQotDQotDQogLyoqKioqIFNQQVJDNjQgKioqKiovDQogI2lmZGVmIEFGU19TUEFSQzY0X0xJTlVY
MjBfRU5WDQogICAgIGFmc19zeXNfY2FsbF90YWJsZTMyID0gb3NpX2ZpbmRfc3lzY2FsbF90YWJs
ZSgxKTsNCkBAIC0zNzEsNiArNTUxLDEyIEBADQogI2lmIGRlZmluZWQoQUZTX0lBNjRfTElOVVgy
MF9FTlYpDQogCWFmc19zeXNfY2FsbF90YWJsZVtfUyhfX05SX3NldGdyb3VwcyldID0NCiAJICAg
IFBPSU5URVIyU1lTQ0FMTCgoc3RydWN0IGZwdHIgKilzeXNfc2V0Z3JvdXBzcCktPmlwOw0KKyNl
bGlmIGRlZmluZWQoQUZTX1BQQzY0X0xJTlVYMjZfRU5WKQ0KKwlhZnNfc3lzX2NhbGxfdGFibGVb
X1MoX19OUl9zZXRncm91cHMpXSA9DQorCSAgICBQT0lOVEVSMlNZU0NBTEwgb2xkX3N5c19zZXRn
cm91cHNwOw0KKwkvKiBwdXQgYmFjayBzZXRncm91cHMzMiBmb3IgUFBDNjQgKi8NCisJYWZzX3N5
c19jYWxsX3RhYmxlMzJbX19OUl9zZXRncm91cHNdID0NCisJICAgIFBPSU5URVIyU1lTQ0FMTCBv
bGRfc3lzMzJfc2V0Z3JvdXBzcDsNCiAjZWxzZSAvKiBBRlNfSUE2NF9MSU5VWDIwX0VOViAqLw0K
IAlhZnNfc3lzX2NhbGxfdGFibGVbX1MoX19OUl9zZXRncm91cHMpXSA9DQogCSAgICBQT0lOVEVS
MlNZU0NBTEwgc3lzX3NldGdyb3Vwc3A7DQpAQCAtNDA5LDEyICs1OTUsNiBAQA0KICNlbmRpZg0K
IA0KIA0KLS8qKioqKiBQUEM2NCAqKioqKi8NCi0jaWZkZWYgQUZTX1BQQzY0X0xJTlVYMjBfRU5W
DQotICAgIC8qIFhYWCBubyAzMi1iaXQgc3lzY2FsbHMgb24gUFBDNjQ/ICovDQotI2VuZGlmDQot
DQotDQogLyoqKioqIFNQQVJDNjQgKioqKiovDQogI2lmZGVmIEFGU19TUEFSQzY0X0xJTlVYMjBf
RU5WDQogICAgIGlmIChhZnNfc3lzX2NhbGxfdGFibGUzMikgew0KZGlmZiAtcnVOIG9wZW5hZnMt
Y3ZzL3NyYy9jZi9saW51eC10ZXN0My5tNCBvcGVuYWZzLWN2cy5wcGM2NC9zcmMvY2YvbGludXgt
dGVzdDMubTQNCi0tLSBvcGVuYWZzLWN2cy9zcmMvY2YvbGludXgtdGVzdDMubTQJMjAwNS0wMS0x
NCAxODozNDozMi4wMDAwMDAwMDAgKzAxMDANCisrKyBvcGVuYWZzLWN2cy5wcGM2NC9zcmMvY2Yv
bGludXgtdGVzdDMubTQJMjAwNS0wMy0zMSAxNjo1ODoyMC4xMzI5MDAwMzIgKzAyMDANCkBAIC0x
MTYsNyArMTE2LDcgQEANCiBBQ19ERUZVTihbTElOVVhfS0VSTkVMX1BBR0VfRk9MTE9XX0xJTktd
LFsNCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQgdnMgcGFnZV9m
b2xsb3dfbGluaykNCiBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiDQotQ1BQRkxBR1M9Ii1JJHtM
SU5VWF9LRVJORUxfUEFUSH0vaW5jbHVkZSAtV2Vycm9yLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xh
cmF0aW9uIC1EX19LRVJORUxfXyAkQ1BQRkxBR1MiDQorQ1BQRkxBR1M9Ii1JJHtMSU5VWF9LRVJO
RUxfUEFUSH0vaW5jbHVkZSAtSSR7TElOVVhfS0VSTkVMX1BBVEh9L2luY2x1ZGUvYXNtL21hY2gt
ZGVmYXVsdCAtV2Vycm9yLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1EX19LRVJORUxf
XyAkQ1BQRkxBR1MiDQogQUNfQ0FDSEVfVkFMKGFjX2N2X2xpbnV4X2tlcm5lbF9wYWdlX2ZvbGxv
d19saW5rLA0KIFsNCiBBQ19UUllfQ09NUElMRSgNCmRpZmYgLXJ1TiBvcGVuYWZzLWN2cy9zcmMv
Y2Yvb3Njb25mLm00IG9wZW5hZnMtY3ZzLnBwYzY0L3NyYy9jZi9vc2NvbmYubTQNCi0tLSBvcGVu
YWZzLWN2cy9zcmMvY2Yvb3Njb25mLm00CTIwMDUtMDItMTYgMjM6NDc6MzguMDAwMDAwMDAwICsw
MTAwDQorKysgb3BlbmFmcy1jdnMucHBjNjQvc3JjL2NmL29zY29uZi5tNAkyMDA1LTAzLTMxIDE2
OjU4OjIwLjEzNDg5OTcyOCArMDIwMA0KQEAgLTI2Miw4ICsyNjIsOSBAQA0KIAkJTVRfTElCUz0i
LWxwdGhyZWFkIg0KIAkJUEFNX0NGTEFHUz0iLWcgLU8yIC1EbGludXggLURMSU5VWF9QQU0gLWZQ
SUMiDQogCQlTSExJQl9MREZMQUdTPSItc2hhcmVkIC1YbGlua2VyIC14Ig0KKwkJU0hMSUJfQ0ZM
QUdTPSItZlBJQyINCiAJCVRYTElCUz0iLWxuY3Vyc2VzIg0KLQkJWENGTEFHUz0iLWcgLU8yIC1E
X0xBUkdFRklMRTY0X1NPVVJDRSINCisJCVhDRkxBR1M9Ii1nIC1PMiAtRF9MQVJHRUZJTEU2NF9T
T1VSQ0UgLWZQSUMiDQogCQlZQUNDPSJiaXNvbiAteSINCiAJCVNITElCX0xJTktFUj0iJHtNVF9D
Q30gLXNoYXJlZCINCiAJCTs7DQpkaWZmIC1ydU4gb3BlbmFmcy1jdnMvc3JjL2xpYmFmcy9NYWtl
ZmlsZS5jb21tb24uaW4gb3BlbmFmcy1jdnMucHBjNjQvc3JjL2xpYmFmcy9NYWtlZmlsZS5jb21t
b24uaW4NCi0tLSBvcGVuYWZzLWN2cy9zcmMvbGliYWZzL01ha2VmaWxlLmNvbW1vbi5pbgkyMDA1
LTAxLTI5IDA2OjQyOjAyLjAwMDAwMDAwMCArMDEwMA0KKysrIG9wZW5hZnMtY3ZzLnBwYzY0L3Ny
Yy9saWJhZnMvTWFrZWZpbGUuY29tbW9uLmluCTIwMDUtMDMtMzEgMTY6NTg6MjAuMTM2ODk5NDI0
ICswMjAwDQpAQCAtMzkzLDYgKzM5Myw4IEBADQogCSQoQ1JVTEVfTk9PUFQpDQogb3NpX3N5c2N0
bC5vOiAkKFRPUF9TUkNESVIpL2Fmcy8kKE1LQUZTX09TVFlQRSkvb3NpX3N5c2N0bC5jDQogCSQo
Q1JVTEVfTk9PUFQpDQorb3NpX2ZsdXNoLm86ICQoVE9QX1NSQ0RJUikvYWZzLyQoTUtBRlNfT1NU
WVBFKS9vc2lfZmx1c2gucw0KKwkkKENSVUxFX09QVCkNCiBvc2lfYWxsb2MubzogJChUT1BfU1JD
RElSKS9hZnMvJChNS0FGU19PU1RZUEUpL29zaV9hbGxvYy5jDQogCSQoQ1JVTEVfTk9PUFQpDQog
b3NpX2NyZWQubzogJChUT1BfU1JDRElSKS9hZnMvJChNS0FGU19PU1RZUEUpL29zaV9jcmVkLmMN
CmRpZmYgLXJ1TiBvcGVuYWZzLWN2cy9zcmMvbGliYWZzL01ha2VmaWxlUHJvdG8uTElOVVguaW4g
b3BlbmFmcy1jdnMucHBjNjQvc3JjL2xpYmFmcy9NYWtlZmlsZVByb3RvLkxJTlVYLmluDQotLS0g
b3BlbmFmcy1jdnMvc3JjL2xpYmFmcy9NYWtlZmlsZVByb3RvLkxJTlVYLmluCTIwMDUtMDMtMjMg
MDA6NTI6NTkuMDAwMDAwMDAwICswMTAwDQorKysgb3BlbmFmcy1jdnMucHBjNjQvc3JjL2xpYmFm
cy9NYWtlZmlsZVByb3RvLkxJTlVYLmluCTIwMDUtMDMtMzEgMTY6NTk6NTcuOTEzOTQ2MTEyICsw
MjAwDQpAQCAtMjQsNiArMjQsOSBAQA0KIAlvc2lfc3lzY3RsLm8gXA0KIAlvc2lfdmZzb3BzLm8g
XA0KIAlvc2lfdm0ubyBcDQorPHBwYzY0X2xpbnV4MjY+DQorCW9zaV9mbHVzaC5vIFwNCis8YWxs
Pg0KIAlvc2lfdm5vZGVvcHMubyANCiANCiBBRlNfT1NfTkZTT0JKUyA9DQpAQCAtODIsNyArODUs
NyBAQA0KICAgICAgIC1tY3B1PXVsdHJhc3BhcmMgLW02NCAtbW5vLWZwdSAtbWNtb2RlbD1tZWRs
b3cgLWZmaXhlZC1nNCAtZmNhbGwtdXNlZC1nNSAtZmNhbGwtdXNlZC1nNyAtV25vLXNpZ24tY29t
cGFyZQ0KIERFRklORVMgPSAkKENPTU1PTl9ERUZJTkVTKSAtRENQVT1zcGFyYzY0DQogDQotPHBw
Y19saW51eDIyIHBwY19saW51eDI0IHBwYzY0X2xpbnV4MjQ+DQorPHBwY19saW51eDIyIHBwY19s
aW51eDI0IHBwYzY0X2xpbnV4MjQgcHBjNjRfbGludXgyNj4NCiBDQ0ZMQUdTID0gJChDT01NT05f
S0VSTl9DRkxBR1MpIC1mc2lnbmVkLWNoYXIgLW1zb2Z0LWZsb2F0IC1mbm8tYnVpbHRpbiAtZmZp
eGVkLXIyDQogREVGSU5FUyA9ICQoQ09NTU9OX0RFRklORVMpIC1EX19wb3dlcnBjX18NCiANCmRp
ZmYgLXJ1TiBvcGVuYWZzLWN2cy9zcmMvbGliYWZzL21ha2Vfa2J1aWxkX21ha2VmaWxlLnBsIG9w
ZW5hZnMtY3ZzLnBwYzY0L3NyYy9saWJhZnMvbWFrZV9rYnVpbGRfbWFrZWZpbGUucGwNCi0tLSBv
cGVuYWZzLWN2cy9zcmMvbGliYWZzL21ha2Vfa2J1aWxkX21ha2VmaWxlLnBsCTIwMDQtMDYtMDIg
MDQ6NTY6MDEuMDAwMDAwMDAwICswMjAwDQorKysgb3BlbmFmcy1jdnMucHBjNjQvc3JjL2xpYmFm
cy9tYWtlX2tidWlsZF9tYWtlZmlsZS5wbAkyMDA1LTAzLTMxIDE2OjU4OjIwLjEzODg5OTEyMCAr
MDIwMA0KQEAgLTUxLDYgKzUxLDkgQEANCiAgICAgZWxzaWYgKCR0ZXh0ID1+IC9eKFxTK1wubyk6
XHMqKFxTK1wuYykvKSB7ICAgICMjIERlcGVuZGVuY3kNCiAgICAgICAkZGVwc3skMX0gPSAkMjsN
CiAgICAgfQ0KKyAgICBlbHNpZiAoJHRleHQgPX4gL14oXFMrXC5vKTpccyooXFMrXC5zKS8pIHsg
ICAgIyMgRGVwZW5kZW5jeQ0KKyAgICAgICRkZXBzeyQxfSA9ICQyOw0KKyAgICB9DQogICAgICR0
ZXh0ID0gJyc7DQogICB9DQogICAkRi0+Y2xvc2UoKTsNCkBAIC03NCw4ICs3NywxMiBAQA0KIA0K
IA0KIGZvcmVhY2ggKEBvYmplY3RzKSB7DQotICAoJHNyYyA9ICRfKSA9fiBzL1wubyQvLmMvOw0K
ICAgZGllICJObyBzb3VyY2Uga25vd24gZm9yICRfXG4iIHVubGVzcyBleGlzdHMgJGRlcHN7JF99
Ow0KKyAgaWYoJGRlcHN7JF99ID1+IC9cLnMkLykgew0KKyAgICAgKCRzcmMgPSAkXykgPX4gcy9c
Lm8kLy5zLzsNCisgIH0gZWxzZSB7DQorICAgICAoJHNyYyA9ICRfKSA9fiBzL1wubyQvLmMvOw0K
KyAgfQ0KICAgaWYgKC1lICIkS0RJUi8kc3JjIiB8fCAtbCAiJEtESVIvJHNyYyIpIHsNCiAgICAg
dW5saW5rKCIkS0RJUi8kc3JjIikgb3IgZGllICIkS0RJUi8kc3JjOiAkIVxuIjsNCiAgIH0NCg==

--=_mixed 005B24BFC1256FD6_=--