0N/A/*
1879N/A * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1472N/A * or visit www.oracle.com if you need additional information or have any
1472N/A * questions.
0N/A *
0N/A */
0N/A
1879N/A#ifndef OS_CPU_SOLARIS_X86_VM_THREADLS_SOLARIS_X86_HPP
1879N/A#define OS_CPU_SOLARIS_X86_VM_THREADLS_SOLARIS_X86_HPP
1879N/A
0N/A// Processor dependent parts of ThreadLocalStorage
0N/A
0N/Aprivate:
0N/A static Thread* _get_thread_cache[]; // index by [(raw_id>>9)^(raw_id>>20) % _pd_cache_size]
0N/A static Thread* get_thread_via_cache_slowly(uintptr_t raw_id, int index);
0N/A
0N/A NOT_PRODUCT(static int _tcacheHit;)
0N/A NOT_PRODUCT(static int _tcacheMiss;)
0N/A
0N/Apublic:
0N/A // Cache hit/miss statistics
0N/A static void print_statistics() PRODUCT_RETURN;
0N/A
0N/A enum Constants {
0N/A#ifdef AMD64
0N/A _pd_cache_size = 256*2 // projected typical # of threads * 2
0N/A#else
0N/A _pd_cache_size = 128*2 // projected typical # of threads * 2
0N/A#endif // AMD64
0N/A };
0N/A
0N/A enum pd_tlsAccessMode {
0N/A pd_tlsAccessUndefined = -1,
0N/A pd_tlsAccessSlow = 0,
0N/A pd_tlsAccessIndirect = 1,
0N/A pd_tlsAccessDirect = 2
0N/A } ;
0N/A
0N/A static void set_thread_in_slot (Thread *) ;
0N/A
0N/A static pd_tlsAccessMode pd_getTlsAccessMode () ;
0N/A static ptrdiff_t pd_getTlsOffset () ;
0N/A
0N/A static uintptr_t pd_raw_thread_id() {
0N/A#ifdef _GNU_SOURCE
0N/A#ifdef AMD64
0N/A uintptr_t rv;
0N/A __asm__ __volatile__ ("movq %%fs:0, %0" : "=r"(rv));
0N/A return rv;
0N/A#else
0N/A return gs_thread();
0N/A#endif // AMD64
0N/A#else //_GNU_SOURCE
0N/A return _raw_thread_id();
0N/A#endif //_GNU_SOURCE
0N/A }
0N/A
0N/A static int pd_cache_index(uintptr_t raw_id) {
0N/A // Copied from the sparc version. Dave said it should also work fine
0N/A // for solx86.
0N/A int ix = (int) (((raw_id >> 9) ^ (raw_id >> 20)) % _pd_cache_size);
0N/A return ix;
0N/A }
0N/A
0N/A // Java Thread
0N/A static inline Thread* thread();
1879N/A
1879N/A#endif // OS_CPU_SOLARIS_X86_VM_THREADLS_SOLARIS_X86_HPP