src/hotspot/os_cpu/linux_s390/orderAccess_linux_s390.hpp
author egahlin
Fri, 18 Oct 2019 17:45:17 +0200
branchJEP-349-branch
changeset 58687 222f727e9b05
parent 54323 846bc643f4ef
child 59122 5d73255c2d52
permissions -rw-r--r--
Stabilize TestLatestEvent.java
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51050
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
 * Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
 * accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
 * questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
 */
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51050
diff changeset
    26
#ifndef OS_CPU_LINUX_S390_ORDERACCESS_LINUX_S390_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51050
diff changeset
    27
#define OS_CPU_LINUX_S390_ORDERACCESS_LINUX_S390_HPP
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 49364
diff changeset
    29
// Included in orderAccess.hpp header file.
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 49364
diff changeset
    30
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
#include "vm_version_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
// Implementation of class OrderAccess.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
// machine barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
//   - z_sync            two-way memory barrier, aka fence
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
// semantic barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
// (as defined in orderAccess.hpp)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
//   - z_release         orders Store|Store,    (maps to compiler barrier)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
//                               Load|Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
//   - z_acquire         orders  Load|Store,    (maps to compiler barrier)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
//                               Load|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
//   - z_fence           orders Store|Store,    (maps to z_sync)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
//                               Load|Store,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
//                               Load|Load,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
//                              Store|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
// Only load-after-store-order is not guaranteed on z/Architecture, i.e. only 'fence'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
// is needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
#define inlasm_compiler_barrier() __asm__ volatile ("" : : : "memory");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
// "bcr 15, 0" is used as two way memory barrier.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
#define inlasm_zarch_sync() __asm__ __volatile__ ("bcr 15, 0" : : : "memory");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
// Release and acquire are empty on z/Architecture, but potential
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
// optimizations of gcc must be forbidden by OrderAccess::release and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
// OrderAccess::acquire.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
#define inlasm_zarch_release() inlasm_compiler_barrier()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
#define inlasm_zarch_acquire() inlasm_compiler_barrier()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
#define inlasm_zarch_fence()   inlasm_zarch_sync()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
inline void OrderAccess::loadload()   { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
inline void OrderAccess::storestore() { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
inline void OrderAccess::loadstore()  { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
inline void OrderAccess::storeload()  { inlasm_zarch_sync(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
inline void OrderAccess::acquire()    { inlasm_zarch_acquire(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
inline void OrderAccess::release()    { inlasm_zarch_release(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
inline void OrderAccess::fence()      { inlasm_zarch_sync(); }
54323
846bc643f4ef 8220351: Cross-modifying code
rehn
parents: 53244
diff changeset
    77
inline void OrderAccess::cross_modify_fence() { inlasm_zarch_sync(); }
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
47609
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    79
template<size_t byte_size>
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    80
struct OrderAccess::PlatformOrderedLoad<byte_size, X_ACQUIRE>
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    81
{
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    82
  template <typename T>
51050
96ea37459ca7 8207011: Remove uses of the register storage class specifier
mikael
parents: 50429
diff changeset
    83
  T operator()(const volatile T* p) const { T t = *p; inlasm_zarch_acquire(); return t; }
47609
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    84
};
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
#undef inlasm_compiler_barrier
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
#undef inlasm_zarch_sync
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
#undef inlasm_zarch_release
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
#undef inlasm_zarch_acquire
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
#undef inlasm_zarch_fence
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51050
diff changeset
    92
#endif // OS_CPU_LINUX_S390_ORDERACCESS_LINUX_S390_HPP