aoqi@1: /* aoqi@1: * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. aoqi@1: * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved. aoqi@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@1: * aoqi@1: * This code is free software; you can redistribute it and/or modify it aoqi@1: * under the terms of the GNU General Public License version 2 only, as aoqi@1: * published by the Free Software Foundation. aoqi@1: * aoqi@1: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@1: * version 2 for more details (a copy is included in the LICENSE file that aoqi@1: * accompanied this code). aoqi@1: * aoqi@1: * You should have received a copy of the GNU General Public License version aoqi@1: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@1: * aoqi@1: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@1: * or visit www.oracle.com if you need additional information or have any aoqi@1: * questions. aoqi@1: * aoqi@1: */ aoqi@1: aoqi@1: #include "precompiled.hpp" aoqi@1: #include "asm/macroAssembler.hpp" aoqi@1: #include "runtime/icache.hpp" aoqi@1: #include aoqi@1: #include aoqi@1: #include aoqi@1: aoqi@1: #ifdef _LP64 aoqi@1: #define CACHE_OPT 1 aoqi@1: #endif aoqi@1: aoqi@1: //no need, we just call cacheflush system call to flush cache aoqi@1: //update @jerome , 12/05/2006 aoqi@1: //flush cache is a very frequent operation, flush all the cache decrease the performance sharply, so i modify it. aoqi@1: void ICacheStubGenerator::generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub) {}; aoqi@1: aoqi@1: void ICache::call_flush_stub(address start, int lines) { aoqi@1: //in fact, the current os implementation simply flush all ICACHE&DCACHE aoqi@1: #ifndef CACHE_OPT aoqi@1: /* Loongson3A supports automatic synchronization between Icache and Dcache. aoqi@1: * No manual synchronization is needed. */ aoqi@1: cacheflush(start, lines * line_size , ICACHE); aoqi@1: #endif aoqi@1: // sysmips(3, 0, 0, 0); aoqi@1: } aoqi@1: aoqi@1: void ICache::invalidate_word(address addr) { aoqi@1: //cacheflush(addr, 4, ICACHE); aoqi@1: aoqi@1: #ifndef CACHE_OPT aoqi@1: cacheflush(addr,4, ICACHE); aoqi@1: #endif aoqi@1: // sysmips(3, 0, 0, 0); aoqi@1: } aoqi@1: aoqi@1: void ICache::invalidate_range(address start, int nbytes) { aoqi@1: #ifndef CACHE_OPT aoqi@1: cacheflush(start, nbytes, ICACHE); aoqi@1: #endif aoqi@1: // sysmips(3, 0, 0, 0); aoqi@1: } aoqi@1: aoqi@1: void ICache::invalidate_all() { aoqi@1: #ifndef CACHE_OPT aoqi@1: sysmips(3, 0, 0, 0); aoqi@1: #endif aoqi@1: } aoqi@1: