Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142937784
D15386.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D15386.diff
View Options
Index: head/UPDATING
===================================================================
--- head/UPDATING
+++ head/UPDATING
@@ -31,6 +31,14 @@
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20180705:
+ 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.
+
20180702:
On i386 and amd64 atomics are now inlined. Out of tree modules using
atomics will need to be rebuilt.
Index: head/lib/libkvm/kvm.h
===================================================================
--- head/lib/libkvm/kvm.h
+++ head/lib/libkvm/kvm.h
@@ -61,8 +61,6 @@
#define _SSIZE_T_DECLARED
#endif
-typedef uint64_t kvaddr_t; /* An address in a target image. */
-
struct kvm_nlist {
const char *n_name;
unsigned char n_type;
Index: head/sys/kern/kern_descrip.c
===================================================================
--- head/sys/kern/kern_descrip.c
+++ head/sys/kern/kern_descrip.c
@@ -3362,10 +3362,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 = (kvaddr_t)fp;
+ xf.xf_data = (kvaddr_t)fp->f_data;
+ xf.xf_vnode = (kvaddr_t)fp->f_vnode;
+ xf.xf_type = (kvaddr_t)fp->f_type;
xf.xf_count = fp->f_count;
xf.xf_msgcount = 0;
xf.xf_offset = foffset_get(fp);
Index: head/sys/kern/uipc_socket.c
===================================================================
--- head/sys/kern/uipc_socket.c
+++ head/sys/kern/uipc_socket.c
@@ -3985,12 +3985,12 @@
{
xso->xso_len = sizeof *xso;
- xso->xso_so = so;
+ xso->xso_so = (kvaddr_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 = (kvaddr_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: head/sys/kern/uipc_usrreq.c
===================================================================
--- head/sys/kern/uipc_usrreq.c
+++ head/sys/kern/uipc_usrreq.c
@@ -1853,7 +1853,7 @@
if (freeunp == 0 && unp->unp_gencnt <= gencnt) {
xu->xu_len = sizeof *xu;
- xu->xu_unpp = unp;
+ xu->xu_unpp = (kvaddr_t)unp;
/*
* XXX - need more locking here to protect against
* connect/disconnect races for SMP.
@@ -1870,10 +1870,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 = (kvaddr_t)unp->unp_vnode;
+ xu->unp_conn = (kvaddr_t)unp->unp_conn;
+ xu->xu_firstref = (kvaddr_t)LIST_FIRST(&unp->unp_refs);
+ xu->xu_nextref = (kvaddr_t)LIST_NEXT(unp, unp_reflink);
xu->unp_gencnt = unp->unp_gencnt;
sotoxsocket(unp->unp_socket, &xu->xu_socket);
UNP_PCB_UNLOCK(unp);
Index: head/sys/netinet/in_pcb.h
===================================================================
--- head/sys/netinet/in_pcb.h
+++ head/sys/netinet/in_pcb.h
@@ -366,12 +366,12 @@
*/
#ifdef _SYS_SOCKETVAR_H_
struct xinpcb {
- size_t xi_len; /* length of this structure */
+ ksize_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) */
+ kvaddr_t inp_ppcb; /* (s) netstat(1) */
int64_t ph_ppcb;
};
int64_t inp_spare64[4];
@@ -394,10 +394,12 @@
} __aligned(8);
struct xinpgen {
- size_t xig_len; /* length of this structure */
+ ksize_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: head/sys/netinet/in_pcb.c
===================================================================
--- head/sys/netinet/in_pcb.c
+++ head/sys/netinet/in_pcb.c
@@ -2906,7 +2906,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 = (kvaddr_t)inp->inp_ppcb;
xi->inp_flow = inp->inp_flow;
xi->inp_flowid = inp->inp_flowid;
xi->inp_flowtype = inp->inp_flowtype;
Index: head/sys/netinet/sctp_sysctl.c
===================================================================
--- head/sys/netinet/sctp_sysctl.c
+++ head/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 = (kvaddr_t)inp->sctp_socket;
so = inp->sctp_socket;
if ((so == NULL) ||
(!SCTP_IS_LISTENING(inp)) ||
Index: head/sys/netinet/sctp_uio.h
===================================================================
--- head/sys/netinet/sctp_uio.h
+++ head/sys/netinet/sctp_uio.h
@@ -1175,14 +1175,11 @@
uint16_t local_port;
uint16_t qlen_old;
uint16_t maxqlen_old;
- void *socket;
+ uint16_t __spare16;
+ kvaddr_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
+ uint32_t extra_padding[26]; /* future */
};
struct xsctp_tcb {
Index: head/sys/netinet/tcp_var.h
===================================================================
--- head/sys/netinet/tcp_var.h
+++ head/sys/netinet/tcp_var.h
@@ -677,7 +677,7 @@
*/
#if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
struct xtcpcb {
- size_t xt_len; /* length of this structure */
+ ksize_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: head/sys/sys/file.h
===================================================================
--- head/sys/sys/file.h
+++ head/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 */
+ ksize_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;
+ kvaddr_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 */
+ kvaddr_t xf_data; /* file descriptor specific data */
+ kvaddr_t xf_vnode; /* vnode pointer */
u_int xf_flag; /* flags (see fcntl.h) */
+ int _xf_int_pad3;
+ int64_t _xf_int64_pad[6];
};
#ifdef _KERNEL
Index: head/sys/sys/param.h
===================================================================
--- head/sys/sys/param.h
+++ head/sys/sys/param.h
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1200071 /* Master, propagated to newvers */
+#define __FreeBSD_version 1200072 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
Index: head/sys/sys/socketvar.h
===================================================================
--- head/sys/sys/socketvar.h
+++ head/sys/sys/socketvar.h
@@ -474,13 +474,13 @@
* Structure to export socket from kernel to utilities, via sysctl(3).
*/
struct xsocket {
- size_t xso_len; /* length of this structure */
+ ksize_t xso_len; /* length of this structure */
union {
- void *xso_so; /* kernel address of struct socket */
+ kvaddr_t xso_so; /* kernel address of struct socket */
int64_t ph_so;
};
union {
- void *so_pcb; /* kernel address of struct inpcb */
+ kvaddr_t so_pcb; /* kernel address of struct inpcb */
int64_t ph_pcb;
};
uint64_t so_oobmark;
Index: head/sys/sys/types.h
===================================================================
--- head/sys/sys/types.h
+++ head/sys/sys/types.h
@@ -251,6 +251,15 @@
typedef struct cap_rights cap_rights_t;
#endif
+/*
+ * Types suitable for exporting size and pointers (as virtual addresses)
+ * from the kernel independent of native word size. These should be
+ * used in place of size_t and (u)intptr_t in structs which contain such
+ * types that are shared with userspace.
+ */
+typedef __uint64_t kvaddr_t;
+typedef __uint64_t ksize_t;
+
typedef __vm_offset_t vm_offset_t;
typedef __int64_t vm_ooffset_t;
typedef __vm_paddr_t vm_paddr_t;
Index: head/sys/sys/unpcb.h
===================================================================
--- head/sys/sys/unpcb.h
+++ head/sys/sys/unpcb.h
@@ -138,12 +138,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) */
+ ksize_t xu_len; /* length of this structure */
+ kvaddr_t xu_unpp; /* to help netstat, fstat */
+ kvaddr_t unp_vnode; /* (s) */
+ kvaddr_t unp_conn; /* (s) */
+ kvaddr_t xu_firstref; /* (s) */
+ kvaddr_t xu_nextref; /* (s) */
unp_gen_t unp_gencnt; /* (s) */
int64_t xu_spare64[8];
int32_t xu_spare32[8];
@@ -159,7 +159,7 @@
} __aligned(8);
struct xunpgen {
- size_t xug_len;
+ ksize_t xug_len;
u_int xug_count;
unp_gen_t xug_gen;
so_gen_t xug_sogen;
Index: head/usr.bin/netstat/inet.c
===================================================================
--- head/usr.bin/netstat/inet.c
+++ head/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 = (kvaddr_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 = (kvaddr_t)so->so_pcb;
if (kread((uintptr_t)so->so_proto, &proto, sizeof(proto)) != 0)
return (-1);
xso->xso_protocol = proto.pr_protocol;
Index: head/usr.bin/netstat/unix.c
===================================================================
--- head/usr.bin/netstat/unix.c
+++ head/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 = (kvaddr_t)unp;
KREAD(unp, &unp0, sizeof (*unp));
unp = &unp0;
Index: head/usr.bin/sockstat/sockstat.c
===================================================================
--- head/usr.bin/sockstat/sockstat.c
+++ head/usr.bin/sockstat/sockstat.c
@@ -108,8 +108,8 @@
};
struct sock {
- void *socket;
- void *pcb;
+ kvaddr_t socket;
+ kvaddr_t pcb;
int shown;
int vflag;
int family;
@@ -789,8 +789,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()");
@@ -806,8 +806,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)
+ *(kvaddr_t*)&(faddr->address) = xup->unp_conn;
laddr->next = NULL;
faddr->next = NULL;
sock->laddr = laddr;
@@ -1008,7 +1008,7 @@
static void
displaysock(struct sock *s, int pos)
{
- void *p;
+ kvaddr_t p;
int hash, first, offset;
struct addr *laddr, *faddr;
struct sock *s_tmp;
@@ -1054,8 +1054,8 @@
break;
}
/* client */
- p = *(void **)&(faddr->address);
- if (p == NULL) {
+ p = *(kvaddr_t*)&(faddr->address);
+ if (p == 0) {
pos += xprintf("(not connected)");
offset += opt_w ? 92 : 44;
break;
@@ -1174,13 +1174,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
Details
Attached
Mime Type
text/plain
Expires
Sun, Jan 25, 8:06 PM (14 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27965207
Default Alt Text
D15386.diff (12 KB)
Attached To
Mode
D15386: Improve portability of structs xinpcb and friends.
Attached
Detach File
Event Timeline
Log In to Comment