FreeBSD Bugzilla – Attachment 193463 Details for
Bug 228301
[exp-run] Improve portability of struct xinpcb and friends
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
D15386 patch
D15386.diff (text/plain), 11.75 KB, created by
Brooks Davis
on 2018-05-16 18:23:22 UTC
(
hide
)
Description:
D15386 patch
Filename:
MIME Type:
Creator:
Brooks Davis
Created:
2018-05-16 18:23:22 UTC
Size:
11.75 KB
patch
obsolete
>Index: UPDATING >=================================================================== >--- UPDATING >+++ UPDATING >@@ -51,6 +51,14 @@ > > ****************************** SPECIAL WARNING: ****************************** > >+20180516: >+ The ABI of syscalls used by managment tools like sockstat and >+ netstat has been broken to allow 32-bit binaries to work on >+ 64-bit kernels without modification. These programs will need >+ to match the kernel in order to function. External programs may >+ require minor modifications to accommodate a change of type in >+ structures from pointers to 64-bit virtual addresses. >+ > 20180508: > The nxge(4) driver has been removed. This driver was for PCI-X 10g > cards made by s2io/Neterion. The company was aquired by Exar and >Index: sys/kern/kern_descrip.c >=================================================================== >--- sys/kern/kern_descrip.c >+++ sys/kern/kern_descrip.c >@@ -3363,10 +3363,10 @@ > if ((fp = fdp->fd_ofiles[n].fde_file) == NULL) > continue; > xf.xf_fd = n; >- xf.xf_file = fp; >- xf.xf_data = fp->f_data; >- xf.xf_vnode = fp->f_vnode; >- xf.xf_type = fp->f_type; >+ xf.xf_file = (int64_t)fp; >+ xf.xf_data = (int64_t)fp->f_data; >+ xf.xf_vnode = (int64_t)fp->f_vnode; >+ xf.xf_type = (int64_t)fp->f_type; > xf.xf_count = fp->f_count; > xf.xf_msgcount = 0; > xf.xf_offset = foffset_get(fp); >Index: sys/kern/uipc_socket.c >=================================================================== >--- sys/kern/uipc_socket.c >+++ sys/kern/uipc_socket.c >@@ -3971,12 +3971,12 @@ > { > > xso->xso_len = sizeof *xso; >- xso->xso_so = so; >+ xso->xso_so = (int64_t)so; > xso->so_type = so->so_type; > xso->so_options = so->so_options; > xso->so_linger = so->so_linger; > xso->so_state = so->so_state; >- xso->so_pcb = so->so_pcb; >+ xso->so_pcb = (uint64_t)so->so_pcb; > xso->xso_protocol = so->so_proto->pr_protocol; > xso->xso_family = so->so_proto->pr_domain->dom_family; > xso->so_timeo = so->so_timeo; >Index: sys/kern/uipc_usrreq.c >=================================================================== >--- sys/kern/uipc_usrreq.c >+++ sys/kern/uipc_usrreq.c >@@ -1640,7 +1640,7 @@ > unp->unp_refcount--; > if (unp->unp_refcount != 0 && unp->unp_gencnt <= gencnt) { > xu->xu_len = sizeof *xu; >- xu->xu_unpp = unp; >+ xu->xu_unpp = (int64_t)unp; > /* > * XXX - need more locking here to protect against > * connect/disconnect races for SMP. >@@ -1657,10 +1657,10 @@ > unp->unp_conn->unp_addr->sun_len); > else > bzero(&xu->xu_caddr, sizeof(xu->xu_caddr)); >- xu->unp_vnode = unp->unp_vnode; >- xu->unp_conn = unp->unp_conn; >- xu->xu_firstref = LIST_FIRST(&unp->unp_refs); >- xu->xu_nextref = LIST_NEXT(unp, unp_reflink); >+ xu->unp_vnode = (int64_t)unp->unp_vnode; >+ xu->unp_conn = (int64_t)unp->unp_conn; >+ xu->xu_firstref = (int64_t)LIST_FIRST(&unp->unp_refs); >+ xu->xu_nextref = (int64_t)LIST_NEXT(unp, unp_reflink); > xu->unp_gencnt = unp->unp_gencnt; > sotoxsocket(unp->unp_socket, &xu->xu_socket); > UNP_PCB_UNLOCK(unp); >Index: sys/netinet/in_pcb.h >=================================================================== >--- sys/netinet/in_pcb.h >+++ sys/netinet/in_pcb.h >@@ -363,12 +363,12 @@ > */ > #ifdef _SYS_SOCKETVAR_H_ > struct xinpcb { >- size_t xi_len; /* length of this structure */ >+ uint64_t xi_len; /* length of this structure */ > struct xsocket xi_socket; /* (s,p) */ > struct in_conninfo inp_inc; /* (s,p) */ > uint64_t inp_gencnt; /* (s,p) */ > union { >- void *inp_ppcb; /* (s) netstat(1) */ >+ int64_t inp_ppcb; /* (s) netstat(1) */ > int64_t ph_ppcb; > }; > int64_t inp_spare64[4]; >@@ -391,10 +391,12 @@ > } __aligned(8); > > struct xinpgen { >- size_t xig_len; /* length of this structure */ >+ uint64_t xig_len; /* length of this structure */ > u_int xig_count; /* number of PCBs at this time */ >+ uint32_t _xig_spare32; > inp_gen_t xig_gen; /* generation count at this time */ > so_gen_t xig_sogen; /* socket generation count this time */ >+ uint64_t _xig_spare64[4]; > } __aligned(8); > #ifdef _KERNEL > void in_pcbtoxinpcb(const struct inpcb *, struct xinpcb *); >Index: sys/netinet/in_pcb.c >=================================================================== >--- sys/netinet/in_pcb.c >+++ sys/netinet/in_pcb.c >@@ -2563,7 +2563,7 @@ > bzero(&xi->xi_socket, sizeof(struct xsocket)); > bcopy(&inp->inp_inc, &xi->inp_inc, sizeof(struct in_conninfo)); > xi->inp_gencnt = inp->inp_gencnt; >- xi->inp_ppcb = inp->inp_ppcb; >+ xi->inp_ppcb = (int64_t)inp->inp_ppcb; > xi->inp_flow = inp->inp_flow; > xi->inp_flowid = inp->inp_flowid; > xi->inp_flowtype = inp->inp_flowtype; >Index: sys/netinet/sctp_sysctl.c >=================================================================== >--- sys/netinet/sctp_sysctl.c >+++ sys/netinet/sctp_sysctl.c >@@ -409,7 +409,7 @@ > xinpcb.total_recvs = inp->total_recvs; > xinpcb.total_nospaces = inp->total_nospaces; > xinpcb.fragmentation_point = inp->sctp_frag_point; >- xinpcb.socket = inp->sctp_socket; >+ xinpcb.socket = (int64_t)inp->sctp_socket; > so = inp->sctp_socket; > if ((so == NULL) || > (!SCTP_IS_LISTENING(inp)) || >Index: sys/netinet/sctp_uio.h >=================================================================== >--- sys/netinet/sctp_uio.h >+++ sys/netinet/sctp_uio.h >@@ -1175,14 +1175,10 @@ > uint16_t local_port; > uint16_t qlen_old; > uint16_t maxqlen_old; >- void *socket; >+ uint64_t socket; > uint32_t qlen; > uint32_t maxqlen; >-#if defined(__LP64__) > uint32_t extra_padding[27]; /* future */ >-#else >- uint32_t extra_padding[28]; /* future */ >-#endif > }; > > struct xsctp_tcb { >Index: sys/netinet/tcp_var.h >=================================================================== >--- sys/netinet/tcp_var.h >+++ sys/netinet/tcp_var.h >@@ -668,7 +668,7 @@ > */ > #if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_) > struct xtcpcb { >- size_t xt_len; /* length of this structure */ >+ uint64_t xt_len; /* length of this structure */ > struct xinpcb xt_inp; > char xt_stack[TCP_FUNCTION_NAME_LEN_MAX]; /* (s) */ > char xt_logid[TCP_LOG_ID_LEN]; /* (s) */ >Index: sys/sys/file.h >=================================================================== >--- sys/sys/file.h >+++ sys/sys/file.h >@@ -209,18 +209,23 @@ > * Userland version of struct file, for sysctl > */ > struct xfile { >- size_t xf_size; /* size of struct xfile */ >+ uint64_t xf_size; /* size of struct xfile */ > pid_t xf_pid; /* owning process */ > uid_t xf_uid; /* effective uid of owning process */ > int xf_fd; /* descriptor number */ >- void *xf_file; /* address of struct file */ >+ int _xf_int_pad1; >+ int64_t xf_file; /* address of struct file */ > short xf_type; /* descriptor type */ >+ short _xf_short_pad1; > int xf_count; /* reference count */ > int xf_msgcount; /* references from message queue */ >+ int _xf_int_pad2; > off_t xf_offset; /* file offset */ >- void *xf_data; /* file descriptor specific data */ >- void *xf_vnode; /* vnode pointer */ >+ int64_t xf_data; /* file descriptor specific data */ >+ int64_t xf_vnode; /* vnode pointer */ > u_int xf_flag; /* flags (see fcntl.h) */ >+ int _xf_int_pad3; >+ int64_t _xf_int64_pad[4]; > }; > > #ifdef _KERNEL >Index: sys/sys/param.h >=================================================================== >--- sys/sys/param.h >+++ sys/sys/param.h >@@ -60,7 +60,7 @@ > * in the range 5 to 9. > */ > #undef __FreeBSD_version >-#define __FreeBSD_version 1200063 /* Master, propagated to newvers */ >+#define __FreeBSD_version 1200064 /* Master, propagated to newvers */ > > /* > * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, >Index: sys/sys/socketvar.h >=================================================================== >--- sys/sys/socketvar.h >+++ sys/sys/socketvar.h >@@ -471,13 +471,13 @@ > * Structure to export socket from kernel to utilities, via sysctl(3). > */ > struct xsocket { >- size_t xso_len; /* length of this structure */ >+ uint64_t xso_len; /* length of this structure */ > union { >- void *xso_so; /* kernel address of struct socket */ >+ int64_t xso_so; /* kernel address of struct socket */ > int64_t ph_so; > }; > union { >- void *so_pcb; /* kernel address of struct inpcb */ >+ int64_t so_pcb; /* kernel address of struct inpcb */ > int64_t ph_pcb; > }; > uint64_t so_oobmark; >Index: sys/sys/unpcb.h >=================================================================== >--- sys/sys/unpcb.h >+++ sys/sys/unpcb.h >@@ -136,12 +136,12 @@ > */ > #ifdef _SYS_SOCKETVAR_H_ > struct xunpcb { >- size_t xu_len; /* length of this structure */ >- void *xu_unpp; /* to help netstat, fstat */ >- void *unp_vnode; /* (s) */ >- void *unp_conn; /* (s) */ >- void *xu_firstref; /* (s) */ >- void *xu_nextref; /* (s) */ >+ uint64_t xu_len; /* length of this structure */ >+ int64_t xu_unpp; /* to help netstat, fstat */ >+ int64_t unp_vnode; /* (s) */ >+ int64_t unp_conn; /* (s) */ >+ int64_t xu_firstref; /* (s) */ >+ int64_t xu_nextref; /* (s) */ > unp_gen_t unp_gencnt; /* (s) */ > int64_t xu_spare64[8]; > int32_t xu_spare32[8]; >@@ -157,7 +157,7 @@ > } __aligned(8); > > struct xunpgen { >- size_t xug_len; >+ uint64_t xug_len; > u_int xug_count; > unp_gen_t xug_gen; > so_gen_t xug_sogen; >Index: usr.bin/netstat/inet.c >=================================================================== >--- usr.bin/netstat/inet.c >+++ usr.bin/netstat/inet.c >@@ -159,12 +159,12 @@ > > bzero(xso, sizeof *xso); > xso->xso_len = sizeof *xso; >- xso->xso_so = so; >+ xso->xso_so = (uint64_t)so; > xso->so_type = so->so_type; > xso->so_options = so->so_options; > xso->so_linger = so->so_linger; > xso->so_state = so->so_state; >- xso->so_pcb = so->so_pcb; >+ xso->so_pcb = (uint64_t)so->so_pcb; > if (kread((uintptr_t)so->so_proto, &proto, sizeof(proto)) != 0) > return (-1); > xso->xso_protocol = proto.pr_protocol; >Index: usr.bin/netstat/unix.c >=================================================================== >--- usr.bin/netstat/unix.c >+++ usr.bin/netstat/unix.c >@@ -153,7 +153,7 @@ > xu.xu_len = sizeof xu; > KREAD(head_off, &head, sizeof(head)); > LIST_FOREACH(unp, &head, unp_link) { >- xu.xu_unpp = unp; >+ xu.xu_unpp = (int64_t)unp; > KREAD(unp, &unp0, sizeof (*unp)); > unp = &unp0; > >Index: usr.bin/sockstat/sockstat.c >=================================================================== >--- usr.bin/sockstat/sockstat.c >+++ usr.bin/sockstat/sockstat.c >@@ -107,8 +107,8 @@ > }; > > struct sock { >- void *socket; >- void *pcb; >+ int64_t socket; >+ int64_t pcb; > int shown; > int vflag; > int family; >@@ -788,8 +788,8 @@ > warnx("struct xunpcb size mismatch"); > goto out; > } >- if ((xup->unp_conn == NULL && !opt_l) || >- (xup->unp_conn != NULL && !opt_c)) >+ if ((xup->unp_conn == 0 && !opt_l) || >+ (xup->unp_conn != 0 && !opt_c)) > continue; > if ((sock = calloc(1, sizeof(*sock))) == NULL) > err(1, "malloc()"); >@@ -805,8 +805,8 @@ > if (xup->xu_addr.sun_family == AF_UNIX) > laddr->address = > *(struct sockaddr_storage *)(void *)&xup->xu_addr; >- else if (xup->unp_conn != NULL) >- *(void **)&(faddr->address) = xup->unp_conn; >+ else if (xup->unp_conn != 0) >+ *(int64_t*)&(faddr->address) = xup->unp_conn; > laddr->next = NULL; > faddr->next = NULL; > sock->laddr = laddr; >@@ -1007,7 +1007,7 @@ > static void > displaysock(struct sock *s, int pos) > { >- void *p; >+ int64_t p; > int hash, first, offset; > struct addr *laddr, *faddr; > struct sock *s_tmp; >@@ -1053,8 +1053,8 @@ > break; > } > /* client */ >- p = *(void **)&(faddr->address); >- if (p == NULL) { >+ p = *(int64_t*)&(faddr->address); >+ if (p == 0) { > pos += xprintf("(not connected)"); > offset += opt_w ? 92 : 44; > break; >@@ -1173,13 +1173,13 @@ > } > setpassent(1); > for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) { >- if (xf->xf_data == NULL) >+ if (xf->xf_data == 0) > continue; > if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid)) > continue; > hash = (int)((uintptr_t)xf->xf_data % HASHSIZE); > for (s = sockhash[hash]; s != NULL; s = s->next) { >- if ((void *)s->socket != xf->xf_data) >+ if (s->socket != xf->xf_data) > continue; > if (!check_ports(s)) > continue;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 228301
: 193463