Page MenuHomeFreeBSD

D15386.id43175.diff
No OneTemporary

D15386.id43175.diff

Index: UPDATING
===================================================================
--- UPDATING
+++ UPDATING
@@ -51,6 +51,14 @@
****************************** SPECIAL WARNING: ******************************
+20180531:
+ The ABI of syscalls used by management 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 1200065 /* 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;

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 26, 4:44 PM (12 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24239764
Default Alt Text
D15386.id43175.diff (11 KB)

Event Timeline