-/* src/vm/jit/x86_64/md.h - machine dependent x86_64 Linux functions
+/* src/vm/jit/x86_64/md.h - machine dependent x86_64 functions
- Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
- R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
- C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
- Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2009
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+*/
- Authors: Christian Thalinger
- Changes:
+#ifndef _VM_JIT_X86_64_MD_H
+#define _VM_JIT_X86_64_MD_H
- $Id: md.h 2796 2005-06-23 09:42:34Z twisti $
+#include "config.h"
-*/
+#include <assert.h>
+#include <stdint.h>
+
+#include "vm/jit/codegen-common.hpp"
+#include "vm/jit/methodtree.h"
+
+
+/* inline functions ***********************************************************/
+
+/**
+ * Returns the size (in bytes) of the current stackframe, specified by
+ * the passed codeinfo structure.
+ */
+inline static int32_t md_stacktrace_get_framesize(codeinfo* code)
+{
+ // Check for the asm_vm_call_method special case.
+ if (code == NULL)
+ return 0;
+
+ // On x86_64 we use 8-byte stackslots.
+ return code->stackframesize * 8;
+}
+
+
+/* md_stacktrace_get_returnaddress *********************************************
+
+ Returns the return address of the current stackframe, specified by
+ the passed stack pointer and the stack frame size.
+
+*******************************************************************************/
+
+inline static void *md_stacktrace_get_returnaddress(void *sp, int32_t stackframesize)
+{
+ void *ra;
+
+ /* On x86_64 the return address is above the current stack
+ frame. */
+
+ ra = *((void **) (((uintptr_t) sp) + stackframesize));
+
+ return ra;
+}
+
+
+/* md_codegen_get_pv_from_pc ***************************************************
+
+ On this architecture this is just a wrapper to methodtree_find.
+
+*******************************************************************************/
+
+inline static void *md_codegen_get_pv_from_pc(void *ra)
+{
+ void *pv;
+
+ /* Get the start address of the function which contains this
+ address from the method tree. */
+
+ pv = methodtree_find(ra);
+
+ return pv;
+}
+
+
+/* md_cacheflush ***************************************************************
+
+ Calls the system's function to flush the instruction and data
+ cache.
+
+*******************************************************************************/
+
+inline static void md_cacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_icacheflush **************************************************************
+
+ Calls the system's function to flush the instruction cache.
+
+*******************************************************************************/
+
+inline static void md_icacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_dcacheflush **************************************************************
+
+ Calls the system's function to flush the data cache.
+
+*******************************************************************************/
+
+inline static void md_dcacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_get_cycle_count **********************************************************
+
+ Get the current time-stamp counter from the CPU.
+
+*******************************************************************************/
+inline static uint64_t md_get_cycle_count()
+{
+ uint64_t cycles;
-#ifndef _MD_H
-#define _MD_H
+ // Get current cycles count from the CPU.
+ __asm__ __volatile__ ("rdtsc" : "=A" (cycles));
-/* function prototypes ********************************************************/
+ return cycles;
+}
-#endif /* _MD_H_ */
+#endif /* _VM_JIT_X86_64_MD_H */
/*
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/