diff --git a/include_core/omrutil.h b/include_core/omrutil.h index 1834838267d..813e8820af0 100644 --- a/include_core/omrutil.h +++ b/include_core/omrutil.h @@ -300,7 +300,30 @@ omr_error_t detectVMDirectory(wchar_t *vmDirectory, size_t vmDirectoryLength, wc uintptr_t getStorageKey(void); -#endif /*if defined(J9ZOS390)*/ +/* ---------------- zosversion.c ---------------- */ + +#define ZOS_V1R10_RELEASE 20.00 +#define ZOS_V1R10_VERSION 3 + +#define ZOS_V2R4_RELEASE 27.00 +#define ZOS_V2R4_VERSION 4 + +/** + * Determine if the z/OS version is greater than or equal to a given + * release and version. The implementation is based on uname(), + * NOT on __osname() as the __osname() release numbers are not + * guaranteed to increase. + * + * For release and version numbers, see + * https://www.ibm.com/docs/en/zos/2.5.0?topic=functions-uname-display-current-operating-system-name + * + * @param[in] min_release the release to be checked. + * @param[in] min_version the version to be checked. + * @return TRUE if the z/OS version is greater than or equal to the given release and version, + * FALSE otherwise. + */ +BOOLEAN zos_version_at_least(double min_release, double min_version); +#endif /* defined(J9ZOS390) */ /** * Returns a string representing the type of page indicated by the given pageFlags. diff --git a/port/unix/omrmmap.c b/port/unix/omrmmap.c index b5390c4c867..aaf22c79e83 100644 --- a/port/unix/omrmmap.c +++ b/port/unix/omrmmap.c @@ -48,6 +48,7 @@ #include "ut_omrport.h" #include "protect_helpers.h" #include "omrportpriv.h" +#include "omrutil.h" #if defined(J9ZOS390) #include "omrvmem.h" @@ -56,6 +57,10 @@ #endif /* !defined(MAP_FAILED) */ #endif /* defined(J9ZOS390) */ +#if defined(J9ZOS39064) && !defined(__MAP_64) +#define __MAP_64 0x10 +#endif /* defined(J9ZOS39064) && !defined(__MAP_64) */ + #if defined(AIXPPC) #include #include @@ -205,11 +210,25 @@ omrmmap_map_file(struct OMRPortLibrary *portLibrary, intptr_t file, uint64_t off spCount++; } -#if defined(J9ZOS39064) && defined(__MAP_64) +#if defined(J9ZOS39064) if (OMR_ARE_ANY_BITS_SET(flags, OMRPORT_MMAP_FLAG_ZOS_64BIT)) { - mmapFlags |= __MAP_64; + if (zos_version_at_least(ZOS_V2R4_RELEASE, ZOS_V2R4_VERSION)) { + mmapFlags |= __MAP_64; + } else { + Trc_PRT_mmap_map_file_unix_invalidFlags(); + errMsg = portLibrary->nls_lookup_message( + portLibrary, + J9NLS_ERROR | J9NLS_DO_NOT_APPEND_NEWLINE, + J9NLS_PORT_MMAP_INVALID_FLAG, + NULL); + portLibrary->error_set_last_error_with_message( + portLibrary, + OMRPORT_ERROR_MMAP_MAP_FILE_INVALIDFLAGS, + errMsg); + return NULL; + } } -#endif /* defined(J9ZOS39064) && defined(__MAP_64) */ +#endif /* defined(J9ZOS39064) */ if (1 != rwCount) { Trc_PRT_mmap_map_file_unix_invalidFlags();