diff --git a/include_core/omrutil.h b/include_core/omrutil.h index 1834838267d..f4a693fe2ec 100644 --- a/include_core/omrutil.h +++ b/include_core/omrutil.h @@ -300,6 +300,21 @@ omr_error_t detectVMDirectory(wchar_t *vmDirectory, size_t vmDirectoryLength, wc uintptr_t getStorageKey(void); +/* ---------------- zosversion.c ---------------- */ + +#define ZOS_V2R4_RELEASE 27.00 +#define ZOS_V2R4_VERSION 4 + +/** + * Function to determine if the zos version is at least 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 + */ +BOOLEAN zos_version_at_least(double min_release, double min_version); #endif /*if defined(J9ZOS390)*/ /** diff --git a/port/unix/omrmmap.c b/port/unix/omrmmap.c index b5390c4c867..423fc930acc 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,12 @@ #endif /* !defined(MAP_FAILED) */ #endif /* defined(J9ZOS390) */ +#if defined(J9ZOS39064) +#if !defined(__MAP_64) +#define __MAP_64 0x10 +#endif /* !defined(__MAP_64) */ +#endif /* defined(J9ZOS39064) */ + #if defined(AIXPPC) #include #include @@ -205,11 +212,21 @@ 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();