Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/compat/netbsd32 - expand the comment about what netbsd32...



details:   https://anonhg.NetBSD.org/src/rev/8d4c815980da
branches:  trunk
changeset: 448806:8d4c815980da
user:      mrg <mrg%NetBSD.org@localhost>
date:      Sat Feb 09 11:30:13 2019 +0000

description:
- expand the comment about what netbsd32_machdep.h should provide.
- add missing NETBSD32_POINTER_TYPE
- add static inline functions to convert pointers to/from 32 bit,
  inclusing an overflow check for NETBSD32PTR32PLUS().

diffstat:

 sys/compat/netbsd32/netbsd32.h |  42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

diffs (76 lines):

diff -r b876d6c49151 -r 8d4c815980da sys/compat/netbsd32/netbsd32.h
--- a/sys/compat/netbsd32/netbsd32.h    Sat Feb 09 11:27:05 2019 +0000
+++ b/sys/compat/netbsd32/netbsd32.h    Sat Feb 09 11:30:13 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: netbsd32.h,v 1.121 2019/01/27 02:08:40 pgoyette Exp $  */
+/*     $NetBSD: netbsd32.h,v 1.122 2019/02/09 11:30:13 mrg Exp $       */
 
 /*
  * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -76,10 +76,16 @@
 
 /*
  * machine dependant section; must define:
- *     netbsd32_pointer_t
+ *     NETBSD32_POINTER_TYPE
  *             - 32-bit pointer type, normally uint32_t but can be int32_t
  *               for platforms which rely on sign-extension of pointers
  *               such as SH-5.
+ *                eg:  #define NETBSD32_POINTER_TYPE uint32_t
+ *     netbsd32_pointer_t
+ *             - a typedef'd struct with the above as an "i32" member.
+ *                eg:  typedef struct {
+ *                             NETBSD32_POINTER_TYPE i32;
+ *                     } netbsd32_pointer_t;
  *     NETBSD32PTR64(p32)
  *             - Translate a 32-bit pointer into something valid in a
  *               64-bit context.
@@ -100,11 +106,6 @@
  */
 #include <machine/netbsd32_machdep.h>
 
-/* netbsd32_machdep.h will have (typically) defined:
-#define NETBSD32_POINTER_TYPE uint32_t
-typedef        struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t;
-*/
-
 /*
  * Conversion functions for the rest of the compat32 code:
  *
@@ -119,12 +120,33 @@
  */
 #define        NETBSD32PTR64(p32)              NETBSD32IPTR64((p32).i32)
 #define        NETBSD32PTR32(p32, p64)         ((p32).i32 = NETBSD32PTR32I(p64))
-#define        NETBSD32PTR32PLUS(p32, incr)    ((p32).i32 += incr)
+#define        NETBSD32PTR32PLUS(p32, incr)    netbsd32_ptr32_incr(&p32, incr)
+#define        NETBSD32PTR32I(p32)             netbsd32_ptr32i(p32)
+#define        NETBSD32IPTR64(p32)             netbsd32_iptr64(p32)
 
 static __inline NETBSD32_POINTER_TYPE
-NETBSD32PTR32I(const void *p64) { return (uintptr_t)p64; }
+netbsd32_ptr32i(const void *p64)
+{
+       uintptr_t u64 = (uintptr_t)p64;
+       KASSERT(u64 == (NETBSD32_POINTER_TYPE)u64);
+       return u64;
+}
+
 static __inline void *
-NETBSD32IPTR64(NETBSD32_POINTER_TYPE p32) { return (void *)(intptr_t)p32; }
+netbsd32_iptr64(NETBSD32_POINTER_TYPE p32)
+{
+       return (void *)(intptr_t)p32;
+}
+
+static __inline netbsd32_pointer_t
+netbsd32_ptr32_incr(netbsd32_pointer_t *p32, uint32_t incr)
+{
+       netbsd32_pointer_t n32 = *p32;
+
+       n32.i32 += incr;
+       KASSERT(NETBSD32PTR64(n32) > NETBSD32PTR64(*p32));
+       return *p32 = n32;
+}
 
 /* Nothing should be using the raw type, so kill it */
 #undef NETBSD32_POINTER_TYPE



Home | Main Index | Thread Index | Old Index