diff --git a/dialects/freebsd/dproc.c b/dialects/freebsd/dproc.c
index 8533265..6b66937 100644
--- a/dialects/freebsd/dproc.c
+++ b/dialects/freebsd/dproc.c
@@ -44,6 +44,9 @@ static char copyright[] =
#if __FreeBSD_version >= 1300081
#define HAS_PWD
#endif
+#if __FreeBSD_version >= 1300XXX
+#define HAS_PWDDESC
+#endif
_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
_PROTOTYPE(static void get_kernel_access,(void));
@@ -125,6 +128,9 @@ gather_proc_info()
* streams with eXPORT data,
* where supported */
struct filedesc fd;
+#if defined(HAS_PWDDESC)
+ struct pwddesc pd;
+#endif
int i, nf;
MALLOC_S nb;
@@ -317,6 +323,12 @@ gather_proc_info()
|| kread((KA_T)p->P_FD, (char *)&fd, sizeof(fd)))
continue;
+#if defined(HAS_PWDDESC)
+ if (!p->ki_pd
+ || kread((KA_T)p->ki_pd, (char *)&pd, sizeof(pd)))
+ continue;
+#endif
+
#if defined(HAS_FDESCENTTBL)
if (!fd.fd_files
|| kread((KA_T)fd.fd_files, (char *)&fdt, sizeof(fdt)))
@@ -330,7 +342,11 @@ gather_proc_info()
#if defined(HAS_PWD)
cdir = rdir = jdir = NULL;
+#if defined(HAS_PWDDESC)
+ pwd_addr = (KA_T)PWDDESC_KVM_LOAD_PWD(&pd);
+#else
pwd_addr = (KA_T)FILEDESC_KVM_LOAD_PWD(&fd);
+#endif
if (pwd_addr != 0) {
if (!kread(pwd_addr, (char *)&pwd, sizeof(pwd))) {
cdir = pwd.pwd_cdir;