diff --git a/src/afs/IRIX/osi_vfsops.c b/src/afs/IRIX/osi_vfsops.c index 7aa2a316f5..b876f3f491 100644 --- a/src/afs/IRIX/osi_vfsops.c +++ b/src/afs/IRIX/osi_vfsops.c @@ -32,8 +32,6 @@ mutex_t afs_init_kern_lock; #define SYS_setgroups SGI_SETGROUPS -int (*nfs_rfsdisptab_v2) () = NULL; - int afs_fstype; lock_t afs_rxlock; @@ -186,11 +184,6 @@ afs_mount(struct vfs *afsp, vnode_t * mvp, struct mounta *uap, afsp->vfs_fstype = afs_fstype; afsp->vfs_dev = 0xbabebabe; /* XXX this should be unique */ -#ifndef AFS_NONFSTRANS - if (nfs_rfsdisptab_v2) - afs_xlatorinit_v2(nfs_rfsdisptab_v2); - afs_xlatorinit_v3(); -#endif return 0; } diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 123ae64cfb..95c34feb78 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -1167,32 +1167,6 @@ afs_syscall_call(long parm, long parm2, long parm3, afs_CheckServers(0, NULL); /* check up servers */ } } -#ifdef AFS_SGI53_ENV - else if (parm == AFSOP_NFSSTATICADDR) { - extern int (*nfs_rfsdisptab_v2) (); - nfs_rfsdisptab_v2 = (int (*)())parm2; - } else if (parm == AFSOP_NFSSTATICADDR2) { - extern int (*nfs_rfsdisptab_v2) (); -# ifdef _K64U64 - nfs_rfsdisptab_v2 = (int (*)())((parm2 << 32) | (parm3 & 0xffffffff)); -# else /* _K64U64 */ - nfs_rfsdisptab_v2 = (int (*)())(parm3 & 0xffffffff); -# endif /* _K64U64 */ - } -# if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) - else if (parm == AFSOP_SBLOCKSTATICADDR2) { - extern int (*afs_sblockp) (); - extern void (*afs_sbunlockp) (); -# ifdef _K64U64 - afs_sblockp = (int (*)())((parm2 << 32) | (parm3 & 0xffffffff)); - afs_sbunlockp = (void (*)())((parm4 << 32) | (parm5 & 0xffffffff)); -# else - afs_sblockp = (int (*)())(parm3 & 0xffffffff); - afs_sbunlockp = (void (*)())(parm5 & 0xffffffff); -# endif /* _K64U64 */ - } -# endif /* AFS_SGI62_ENV && !AFS_SGI65_ENV */ -#endif /* AFS_SGI53_ENV */ else if (parm == AFSOP_SHUTDOWN) { afs_cold_shutdown = 0; if (parm2 == 1) diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index f4418150ce..e2c1e74143 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -2179,16 +2179,6 @@ afsd_run(void) /* Set realtime priority for most threads to same as for biod's. */ afsd_set_afsd_rtpri(); -#ifdef AFS_SGI53_ENV -#ifdef AFS_SGI61_ENV - set_staticaddrs(); -#else /* AFS_SGI61_ENV */ - code = get_nfsstaticaddr(); - if (code) - afsd_call_syscall(AFSOP_NFSSTATICADDR, code); -#endif /* AFS_SGI61_ENV */ -#endif /* AFS_SGI_53_ENV */ - /* Start listener, then callback listener. Lastly, start rx event daemon. * Change in ordering is so that Linux port has socket fd in listener * process. @@ -2592,515 +2582,6 @@ afsd_parse(int argc, char **argv) return cmd_Dispatch(argc, argv); } -#ifdef AFS_SGI53_ENV -#ifdef AFS_SGI61_ENV -/* The dwarf structures are searched to find entry points of static functions - * and the addresses of static variables. The file name as well as the - * sybmol name is reaquired. - */ - -/* Contains list of names to find in given file. */ -typedef struct { - char *name; /* Name of variable or function. */ - afs_hyper_t addr; /* Address of function, undefined if not found. */ - Dwarf_Half type; /* DW_AT_location for vars, DW_AT_lowpc for func's */ - char found; /* set if found. */ -} staticAddrList; - -typedef struct { - char *file; /* Name of file containing vars or funcs */ - staticAddrList *addrList; /* List of vars and/or funcs. */ - int nAddrs; /* # of addrList's */ - int found; /* set if we've found this file already. */ -} staticNameList; - -/* routines used to find addresses in /unix */ -#if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) -void findMDebugStaticAddresses(staticNameList *, int, int); -#endif -void findDwarfStaticAddresses(staticNameList *, int); -void findElfAddresses(Dwarf_Debug, Dwarf_Die, staticNameList *); -void getElfAddress(Dwarf_Debug, Dwarf_Die, staticAddrList *); - -#if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) -#define AFS_N_FILELISTS 2 -#define AFS_SYMS_NEEDED 3 -#else /* AFS_SGI62_ENV */ -#define AFS_N_FILELISTS 1 -#endif /* AFS_SGI62_ENV */ - - - -void -set_staticaddrs(void) -{ - staticNameList fileList[AFS_N_FILELISTS]; - - fileList[0].addrList = - (staticAddrList *) calloc(1, sizeof(staticAddrList)); - if (!fileList[0].addrList) { - printf("set_staticaddrs: Can't calloc fileList[0].addrList\n"); - return; - } - fileList[0].file = "nfs_server.c"; - fileList[0].found = 0; - fileList[0].nAddrs = 1; - fileList[0].addrList[0].name = "rfsdisptab_v2"; - fileList[0].addrList[0].type = DW_AT_location; - fileList[0].addrList[0].found = 0; - -#if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) - fileList[1].addrList = - (staticAddrList *) calloc(2, sizeof(staticAddrList)); - if (!fileList[1].addrList) { - printf("set_staticaddrs: Can't malloc fileList[1].addrList\n"); - return; - } - fileList[1].file = "uipc_socket.c"; - fileList[1].found = 0; - fileList[1].nAddrs = 2; - fileList[1].addrList[0].name = "sblock"; - fileList[1].addrList[0].type = DW_AT_low_pc; - fileList[1].addrList[0].found = 0; - fileList[1].addrList[1].name = "sbunlock"; - fileList[1].addrList[1].type = DW_AT_low_pc; - fileList[1].addrList[1].found = 0; - - if (64 != sysconf(_SC_KERN_POINTERS)) - findMDebugStaticAddresses(fileList, AFS_N_FILELISTS, AFS_SYMS_NEEDED); - else -#endif /* AFS_SGI62_ENV */ - findDwarfStaticAddresses(fileList, AFS_N_FILELISTS); - - if (fileList[0].addrList[0].found) { - afsd_call_syscall(AFSOP_NFSSTATICADDR2, fileList[0].addrList[0].addr.high, - fileList[0].addrList[0].addr.low); - } else { - if (afsd_verbose) - printf("NFS V2 is not present in the kernel.\n"); - } - free(fileList[0].addrList); -#if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) - if (fileList[1].addrList[0].found && fileList[1].addrList[1].found) { - afsd_call_syscall(AFSOP_SBLOCKSTATICADDR2, - fileList[1].addrList[0].addr.high, - fileList[1].addrList[0].addr.low, - fileList[1].addrList[1].addr.high, - fileList[1].addrList[1].addr.low); - } else { - if (!fileList[1].addrList[0].found) - printf("Can't find %s in kernel. Exiting.\n", - fileList[1].addrList[0].name); - if (!fileList[1].addrList[0].found) - printf("Can't find %s in kernel. Exiting.\n", - fileList[1].addrList[1].name); - exit(1); - } - free(fileList[1].addrList); -#endif /* AFS_SGI62_ENV */ -} - - -/* Find addresses for static variables and functions. */ -void -findDwarfStaticAddresses(staticNameList * nameList, int nLists) -{ - int fd; - int i; - int found = 0; - int code; - char *s; - char *hname = (char *)0; - Dwarf_Unsigned dwarf_access = O_RDONLY; - Dwarf_Debug dwarf_debug; - Dwarf_Error dwarf_error; - Dwarf_Unsigned dwarf_cu_header_length; - Dwarf_Unsigned dwarf_abbrev_offset; - Dwarf_Half dwarf_address_size; - Dwarf_Unsigned next_cu_header; - Dwarf_Die dwarf_die; - Dwarf_Die dwarf_next_die; - Dwarf_Die dwarf_child_die; - - if (elf_version(EV_CURRENT) == EV_NONE) { - printf("findDwarfStaticAddresses: Bad elf version.\n"); - return; - } - - if ((fd = open("/unix", O_RDONLY, 0)) < 0) { - printf("findDwarfStaticAddresses: Failed to open /unix.\n"); - return; - } - code = - dwarf_init(fd, dwarf_access, NULL, NULL, &dwarf_debug, &dwarf_error); - if (code != DW_DLV_OK) { - /* Nope hope for the elves and dwarves, try intermediate code. */ - close(fd); - return; - } - - found = 0; - while (1) { - /* Run through the headers until we find ones for files we've - * specified in nameList. - */ - code = - dwarf_next_cu_header(dwarf_debug, &dwarf_cu_header_length, NULL, - &dwarf_abbrev_offset, &dwarf_address_size, - &next_cu_header, &dwarf_error); - if (code == DW_DLV_NO_ENTRY) { - break; - } else if (code == DW_DLV_ERROR) { - printf("findDwarfStaticAddresses: Error reading headers: %s\n", - dwarf_errmsg(dwarf_error)); - break; - } - - code = dwarf_siblingof(dwarf_debug, NULL, &dwarf_die, &dwarf_error); - if (code != DW_DLV_OK) { - printf("findDwarfStaticAddresses: Can't get first die. %s\n", - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - break; - } - - /* This is the header, test the name. */ - code = dwarf_diename(dwarf_die, &hname, &dwarf_error); - if (code == DW_DLV_OK) { - s = strrchr(hname, '/'); - for (i = 0; i < nLists; i++) { - if (s && !strcmp(s + 1, nameList[i].file)) { - findElfAddresses(dwarf_debug, dwarf_die, &nameList[i]); - found++; - break; - } - } - } else { - printf - ("findDwarfStaticAddresses: Can't get name of current header. %s\n", - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - break; - } - dwarf_dealloc(dwarf_debug, hname, DW_DLA_STRING); - hname = (char *)0; - if (found >= nLists) { /* we're done */ - break; - } - } - - /* Frees up all allocated space. */ - (void)dwarf_finish(dwarf_debug, &dwarf_error); - close(fd); -} - -void -findElfAddresses(Dwarf_Debug dwarf_debug, Dwarf_Die dwarf_die, - staticNameList * nameList) -{ - int i; - Dwarf_Error dwarf_error; - Dwarf_Die dwarf_next_die; - Dwarf_Die dwarf_child_die; - Dwarf_Attribute dwarf_return_attr; - char *vname = (char *)0; - int found = 0; - int code; - - /* Drop into this die to find names in addrList. */ - code = dwarf_child(dwarf_die, &dwarf_child_die, &dwarf_error); - if (code != DW_DLV_OK) { - printf("findElfAddresses: Can't get child die. %s\n", - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - return; - } - - /* Try to find names in each sibling. */ - dwarf_next_die = (Dwarf_Die) 0; - do { - code = dwarf_diename(dwarf_child_die, &vname, &dwarf_error); - /* It's possible that some siblings don't have names. */ - if (code == DW_DLV_OK) { - for (i = 0; i < nameList->nAddrs; i++) { - if (!nameList->addrList[i].found) { - if (!strcmp(vname, nameList->addrList[i].name)) { - getElfAddress(dwarf_debug, dwarf_child_die, - &(nameList->addrList[i])); - found++; - break; - } - } - } - } - if (dwarf_next_die) - dwarf_dealloc(dwarf_debug, dwarf_next_die, DW_DLA_DIE); - - if (found >= nameList->nAddrs) { /* we're done. */ - break; - } - - dwarf_next_die = dwarf_child_die; - code = - dwarf_siblingof(dwarf_debug, dwarf_next_die, &dwarf_child_die, - &dwarf_error); - - } while (code == DW_DLV_OK); -} - -/* Get address out of current die. */ -void -getElfAddress(Dwarf_Debug dwarf_debug, Dwarf_Die dwarf_child_die, - staticAddrList * addrList) -{ - int i; - Dwarf_Error dwarf_error; - Dwarf_Attribute dwarf_return_attr; - Dwarf_Bool dwarf_return_bool; - Dwarf_Locdesc *llbuf = NULL; - Dwarf_Signed listlen; - off64_t addr = (off64_t) 0; - int code; - - code = - dwarf_hasattr(dwarf_child_die, addrList->type, &dwarf_return_bool, - &dwarf_error); - if ((code != DW_DLV_OK) || (!dwarf_return_bool)) { - printf("getElfAddress: no address given for %s. %s\n", addrList->name, - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - return; - } - code = - dwarf_attr(dwarf_child_die, addrList->type, &dwarf_return_attr, - &dwarf_error); - if (code != DW_DLV_OK) { - printf("getElfAddress: Can't get attribute. %s\n", - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - return; - } - - switch (addrList->type) { - case DW_AT_location: - code = - dwarf_loclist(dwarf_return_attr, &llbuf, &listlen, &dwarf_error); - if (code != DW_DLV_OK) { - printf("getElfAddress: Can't get location for %s. %s\n", - addrList->name, - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - return; - } - if ((listlen != 1) || (llbuf[0].ld_cents != 1)) { - printf("getElfAddress: %s has more than one address.\n", - addrList->name); - return; - } - addr = llbuf[0].ld_s[0].lr_number; - break; - - case DW_AT_low_pc: - code = - dwarf_lowpc(dwarf_child_die, (Dwarf_Addr *) & addr, &dwarf_error); - if (code != DW_DLV_OK) { - printf("getElfAddress: Can't get lowpc for %s. %s\n", - addrList->name, - (code == DW_DLV_ERROR) ? dwarf_errmsg(dwarf_error) : ""); - return; - } - break; - - default: - printf("getElfAddress: Bad case %d in switch.\n", addrList->type); - return; - } - - addrList->addr.high = (addr >> 32) & 0xffffffff; - addrList->addr.low = addr & 0xffffffff; - addrList->found = 1; -} - -#if defined(AFS_SGI62_ENV) && !defined(AFS_SGI65_ENV) -/* Find symbols in the .mdebug section for 32 bit kernels. */ -/* - * do_mdebug() - * On 32bit platforms, we're still using the ucode compilers to build - * the kernel, so we need to get our static text/data from the .mdebug - * section instead of the .dwarf sections. - */ -/* SearchNameList searches our bizarre structs for the given string. - * If found, sets the found bit and the address and returns 1. - * Not found returns 0. - */ -int -SearchNameList(char *name, afs_uint32 addr, staticNameList * nameList, - int nLists) -{ - int i, j; - for (i = 0; i < nLists; i++) { - for (j = 0; j < nameList[i].nAddrs; j++) { - if (nameList[i].addrList[j].found) - continue; - if (!strcmp(name, nameList[i].addrList[j].name)) { - nameList[i].addrList[j].addr.high = 0; - nameList[i].addrList[j].addr.low = addr; - nameList[i].addrList[j].found = 1; - return 1; - } - } - } - return 0; -} - -static void -SearchMDebug(Elf_Scn * scnp, Elf32_Shdr * shdrp, staticNameList * nameList, - int nLists, int needed) -{ - long *buf = (long *)(elf_getdata(scnp, NULL)->d_buf); - u_long addr, mdoff = shdrp->sh_offset; - HDRR *hdrp; - SYMR *symbase, *symp, *symend; - FDR *fdrbase, *fdrp; - int i, j; - char *strbase, *str; - int ifd; - int nFound = 0; - - /* get header */ - addr = (__psunsigned_t) buf; - hdrp = (HDRR *) addr; - - /* setup base addresses */ - addr = (u_long) buf + (u_long) (hdrp->cbFdOffset - mdoff); - fdrbase = (FDR *) addr; - addr = (u_long) buf + (u_long) (hdrp->cbSymOffset - mdoff); - symbase = (SYMR *) addr; - addr = (u_long) buf + (u_long) (hdrp->cbSsOffset - mdoff); - strbase = (char *)addr; - -#define KEEPER(a,b) ((a == stStaticProc && b == scText) || \ - (a == stStatic && (b == scData || b == scBss || \ - b == scSBss || b == scSData))) - - for (fdrp = fdrbase; fdrp < &fdrbase[hdrp->ifdMax]; fdrp++) { - str = strbase + fdrp->issBase + fdrp->rss; - - /* local symbols for each fd */ - for (symp = &symbase[fdrp->isymBase]; - symp < &symbase[fdrp->isymBase + fdrp->csym]; symp++) { - if (KEEPER(symp->st, symp->sc)) { - if (symp->value == 0) - continue; - - str = strbase + fdrp->issBase + symp->iss; - /* Look for AFS symbols of interest */ - if (SearchNameList(str, symp->value, nameList, nLists)) { - nFound++; - if (nFound >= needed) - return; - } - } - } - } -} - -/* - * returns section with the name of scn_name, & puts its header in shdr64 or - * shdr32 based on elf's file type - * - */ -Elf_Scn * -findMDebugSection(Elf * elf, char *scn_name) -{ - Elf64_Ehdr *ehdr64; - Elf32_Ehdr *ehdr32; - Elf_Scn *scn = NULL; - Elf64_Shdr *shdr64; - Elf32_Shdr *shdr32; - - if ((ehdr32 = elf32_getehdr(elf)) == NULL) - return (NULL); - do { - if ((scn = elf_nextscn(elf, scn)) == NULL) - break; - if ((shdr32 = elf32_getshdr(scn)) == NULL) - return (NULL); - } while (strcmp - (scn_name, - elf_strptr(elf, ehdr32->e_shstrndx, shdr32->sh_name))); - - return (scn); -} - - -void -findMDebugStaticAddresses(staticNameList * nameList, int nLists, int needed) -{ - int fd; - Elf *elf; - Elf_Scn *mdebug_scn; - Elf32_Shdr *mdebug_shdr; - char *names; - - if ((fd = open("/unix", O_RDONLY)) == -1) { - printf("findMDebugStaticAddresses: Failed to open /unix.\n"); - return; - } - - (void)elf_version(EV_CURRENT); - if ((elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL) { - printf - ("findMDebugStaticAddresses: /unix doesn't seem to be an elf file\n"); - close(fd); - return; - } - mdebug_scn = findMDebugSection(elf, ".mdebug"); - if (!mdebug_scn) { - printf("findMDebugStaticAddresses: Can't find .mdebug section.\n"); - goto find_end; - } - mdebug_shdr = elf32_getshdr(mdebug_scn); - if (!mdebug_shdr) { - printf("findMDebugStaticAddresses: Can't find .mdebug header.\n"); - goto find_end; - } - - (void)SearchMDebug(mdebug_scn, mdebug_shdr, nameList, nLists, needed); - - find_end: - elf_end(elf); - close(fd); -} -#endif /* AFS_SGI62_ENV */ - -#else /* AFS_SGI61_ENV */ -#include -struct nlist nlunix[] = { - {"rfsdisptab_v2"}, - {0}, -}; - -get_nfsstaticaddr() -{ - int i, j, kmem, count; - - if ((kmem = open("/dev/kmem", O_RDONLY)) < 0) { - printf("Warning: can't open /dev/kmem\n"); - return 0; - } - if ((j = nlist("/unix", nlunix)) < 0) { - printf("Warning: can't nlist /unix\n"); - return 0; - } - i = nlunix[0].n_value; - if (lseek(kmem, i, L_SET /*0 */ ) != i) { - printf("Warning: can't lseek to %x\n", i); - return 0; - } - if ((j = read(kmem, &count, sizeof count)) != sizeof count) { - printf("WARNING: kmem read at %x failed\n", i); - return 0; - } - return i; -} -#endif /* AFS_SGI61_ENV */ -#endif /* AFS_SGI53_ENV */ - struct afsd_syscall_args { long syscall; long param1; diff --git a/src/config/afs_args.h b/src/config/afs_args.h index 9864b8bfca..7e48d9c9f4 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -79,13 +79,6 @@ #define AFSCALL_INIT_KERNEL_CONFIG 47 /* set vnode glue ops. */ #endif -#ifdef AFS_SGI53_ENV -#define AFSOP_NFSSTATICADDR 32 /* to contents addr of nfs kernel addr */ -#define AFSOP_NFSSTATICADDRPTR 33 /* pass addr of variable containing - * address into kernel. */ -#define AFSOP_NFSSTATICADDR2 34 /* pass address in as hyper. */ -#define AFSOP_SBLOCKSTATICADDR2 35 /* for sblock and sbunlock */ -#endif #define AFSOP_GETMASK 42 /* stand-in for SIOCGIFNETMASK */ /* For SGI, this can't interfere with any of the 64 bit inode calls. */ #define AFSOP_RXLISTENER_DAEMON 48 /* starts kernel RX listener */