Author: brooks
Date: Wed Mar 14 21:11:41 2018
New Revision: 330949
URL: https://svnweb.freebsd.org/changeset/base/330949

Log:
  Fix FSACTL_GET_NEXT_ADAPTER_FIB under 32-bit compat.
  
  This includes FSACTL_LNX_GET_NEXT_ADAPTER_FIB.
  
  Reviewed by:  cem
  Obtained from:        CheriBSD
  MFC after:    1 week
  Sponsored by: DARPA, AFRL
  Differential Revision:        https://reviews.freebsd.org/D14672

Modified:
  head/sys/dev/aac/aac.c
  head/sys/dev/aacraid/aacraid.c
  head/sys/modules/aac/Makefile
  head/sys/modules/aacraid/Makefile
  head/sys/sys/aac_ioctl.h

Modified: head/sys/dev/aac/aac.c
==============================================================================
--- head/sys/dev/aac/aac.c      Wed Mar 14 20:55:28 2018        (r330948)
+++ head/sys/dev/aac/aac.c      Wed Mar 14 21:11:41 2018        (r330949)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
 #define AAC_DRIVERNAME                 "aac"
 
 #include "opt_aac.h"
+#include "opt_compat.h"
 
 /* #include <stddef.h> */
 #include <sys/param.h>
@@ -45,7 +46,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/proc.h>
 #include <sys/sysctl.h>
+#include <sys/sysent.h>
 #include <sys/poll.h>
 #include <sys/ioccom.h>
 
@@ -3521,7 +3524,19 @@ aac_getnext_aif(struct aac_softc *sc, caddr_t arg)
 
        fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
 
-       if ((error = copyin(arg, &agf, sizeof(agf))) == 0) {
+#ifdef COMPAT_FREEBSD32
+       if (SV_CURPROC_FLAG(SV_ILP32)) {
+               struct get_adapter_fib_ioctl32 agf32;
+               error = copyin(arg, &agf32, sizeof(agf32));
+               if (error == 0) {
+                       agf.AdapterFibContext = agf32.AdapterFibContext;
+                       agf.Wait = agf32.Wait;
+                       agf.AifFib = (caddr_t)(uintptr_t)agf32.AifFib;
+               }
+       } else
+#endif
+               error = copyin(arg, &agf, sizeof(agf));
+       if (error == 0) {
                for (ctx = sc->fibctx; ctx; ctx = ctx->next) {
                        if (agf.AdapterFibContext == ctx->unique)
                                break;

Modified: head/sys/dev/aacraid/aacraid.c
==============================================================================
--- head/sys/dev/aacraid/aacraid.c      Wed Mar 14 20:55:28 2018        
(r330948)
+++ head/sys/dev/aacraid/aacraid.c      Wed Mar 14 21:11:41 2018        
(r330949)
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
 #define AAC_DRIVERNAME                 "aacraid"
 
 #include "opt_aacraid.h"
+#include "opt_compat.h"
 
 /* #include <stddef.h> */
 #include <sys/param.h>
@@ -46,7 +47,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/proc.h>
 #include <sys/sysctl.h>
+#include <sys/sysent.h>
 #include <sys/poll.h>
 #include <sys/ioccom.h>
 
@@ -3381,7 +3384,19 @@ aac_getnext_aif(struct aac_softc *sc, caddr_t arg)
        fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
 
        mtx_lock(&sc->aac_io_lock);
-       if ((error = copyin(arg, &agf, sizeof(agf))) == 0) {
+#ifdef COMPAT_FREEBSD32
+       if (SV_CURPROC_FLAG(SV_ILP32)) {
+               struct get_adapter_fib_ioctl32 agf32;
+               error = copyin(arg, &agf32, sizeof(agf32));
+               if (error == 0) {
+                       agf.AdapterFibContext = agf32.AdapterFibContext;
+                       agf.Wait = agf32.Wait;
+                       agf.AifFib = (caddr_t)(uintptr_t)agf32.AifFib;
+               }
+       } else
+#endif
+               error = copyin(arg, &agf, sizeof(agf));
+       if (error == 0) {
                for (ctx = sc->fibctx; ctx; ctx = ctx->next) {
                        if (agf.AdapterFibContext == ctx->unique)
                                break;

Modified: head/sys/modules/aac/Makefile
==============================================================================
--- head/sys/modules/aac/Makefile       Wed Mar 14 20:55:28 2018        
(r330948)
+++ head/sys/modules/aac/Makefile       Wed Mar 14 21:11:41 2018        
(r330949)
@@ -8,7 +8,7 @@ SUBDIR= aac_linux
 
 KMOD=  aac
 SRCS=  aac.c aac_pci.c aac_disk.c aac_cam.c
-SRCS+= opt_scsi.h opt_cam.h opt_aac.h
+SRCS+= opt_scsi.h opt_cam.h opt_compat.h opt_aac.h
 SRCS+= device_if.h bus_if.h pci_if.h
 
 # To enable debug output from the driver, uncomment these two lines.

Modified: head/sys/modules/aacraid/Makefile
==============================================================================
--- head/sys/modules/aacraid/Makefile   Wed Mar 14 20:55:28 2018        
(r330948)
+++ head/sys/modules/aacraid/Makefile   Wed Mar 14 21:11:41 2018        
(r330949)
@@ -8,7 +8,7 @@ SUBDIR= aacraid_linux
 
 KMOD=  aacraid
 SRCS=  aacraid.c aacraid_pci.c aacraid_cam.c
-SRCS+= opt_scsi.h opt_cam.h opt_aacraid.h
+SRCS+= opt_scsi.h opt_cam.h opt_compat.h opt_aacraid.h
 SRCS+= device_if.h bus_if.h pci_if.h
 
 # To enable debug output from the driver, uncomment these two lines.

Modified: head/sys/sys/aac_ioctl.h
==============================================================================
--- head/sys/sys/aac_ioctl.h    Wed Mar 14 20:55:28 2018        (r330948)
+++ head/sys/sys/aac_ioctl.h    Wed Mar 14 21:11:41 2018        (r330949)
@@ -175,6 +175,14 @@ struct get_adapter_fib_ioctl {
        caddr_t         AifFib;
 };
 
+#ifdef _KERNEL
+struct get_adapter_fib_ioctl32 {
+       u_int32_t       AdapterFibContext;
+       int             Wait;
+       u_int32_t       AifFib;
+};
+#endif
+
 struct aac_query_disk {
        int32_t         ContainerNumber;
        int32_t         Bus;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to