Module Name: src Committed By: mrg Date: Sat Feb 9 11:30:13 UTC 2019
Modified Files: src/sys/compat/netbsd32: netbsd32.h Log Message: - 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(). To generate a diff of this commit: cvs rdiff -u -r1.121 -r1.122 src/sys/compat/netbsd32/netbsd32.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/netbsd32/netbsd32.h diff -u src/sys/compat/netbsd32/netbsd32.h:1.121 src/sys/compat/netbsd32/netbsd32.h:1.122 --- src/sys/compat/netbsd32/netbsd32.h:1.121 Sun Jan 27 02:08:40 2019 +++ src/sys/compat/netbsd32/netbsd32.h Sat Feb 9 11:30:13 2019 @@ -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 @@ typedef uint32_t netbsd32_uintptr_t; /* * 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 @@ typedef uint32_t netbsd32_uintptr_t; */ #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 @@ typedef struct { NETBSD32_POINTER_TYPE i */ #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