#include <assert.h>
#include <stdint.h>
-#include "md-os.h"
-
#include "vm/types.h"
-#include "vm/jit/codegen-common.h"
-#include "vm/jit/md.h"
#include "vm/vm.h"
-#include "vmcore/class.h"
-#include "vmcore/linker.h"
-#include "vmcore/method.h"
-#include "mm/memory.h"
-#include "vm/jit/asmpart.h"
/*
{
}
-/* md_codegen_get_pv_from_pc ***************************************************
-
- On this architecture just a wrapper function to
- codegen_get_pv_from_pc.
-
-*******************************************************************************/
-u1* md_codegen_get_pv_from_pc(u1 *ra)
-{
- u1 *pv;
- pv = codegen_get_pv_from_pc(ra);
-
- return pv;
-}
/* md_jit_method_patch_address *************************************************
return pa;
}
-/* XXX i can't find a definition of cacheflush in any installed header files but i can find the symbol in libc */
-/* lets extract the signature from the assembler code*/
-/*
- 000e7158 <cacheflush>:
- e7158: 707b moveq #123,%d0
- e715a: 2f04 movel %d4,%sp@-
- e715c: 282f 0014 movel %sp@(20),%d4 arg
- e7160: 2243 moveal %d3,%a1
- e7162: 262f 0010 movel %sp@(16),%d3 arg
- e7166: 2042 moveal %d2,%a0
- e7168: 242f 000c movel %sp@(12),%d2 arg
- e716c: 222f 0008 movel %sp@(8),%d1 arg
- e7170: 4e40 trap #0 traps into system i guess
- e7172: 2408 movel %a0,%d2
- e7174: 2609 movel %a1,%d3
- e7176: 281f movel %sp@+,%d4
- e7178: 223c ffff f001 movel #-4095,%d1
- e717e: b081 cmpl %d1,%d0
- e7180: 6402 bccs e7184 <cacheflush+0x2c>
- e7182: 4e75 rts
- e7184: 4480 negl %d0
- e7186: 2f00 movel %d0,%sp@-
- e7188: 61ff fff3 82e2 bsrl 1f46c <D_MAX_EXP+0x1ec6d>
- e718e: 209f movel %sp@+,%a0@
- e7190: 70ff moveq #-1,%d0
- e7192: 2040 moveal %d0,%a0
- e7194: 4e75 rts
- e7196: 4e75 rts
- */
-
-/* seems to have 4 arguments */
-/* best guess: it is this syscall */
-/* asmlinkage int sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len) */
-/* kernel 2.6.10 with freescale patches (the one I develop against) needs a patch of */
-/* arch/m68k/kernel/sys_m68k.c(sys_cacheflush) */
-/* evil hack: */
-/*
-void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size);
-void IcacheInvalidateCacheBlock(void *start, unsigned long size);
-
-asmlinkage int
-sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
-{
- lock_kernel();
- DcacheFlushInvalidateCacheBlock(addr, len);
- IcacheInvalidateCacheBlock(addr, len);
- unlock_kernel();
- return 0;
-}
-*/
-extern int cacheflush(unsigned long addr, int scope, int cache, unsigned long len);
-
-#include "asm/cachectl.h" /* found more traces of the cacheflush function */
-#include "errno.h"
-
-void md_cacheflush(u1 *addr, s4 nbytes) { cacheflush((unsigned long)addr, FLUSH_SCOPE_PAGE, FLUSH_CACHE_BOTH, nbytes); }
-void md_dcacheflush(u1 *addr, s4 nbytes) { cacheflush((unsigned long)addr, FLUSH_SCOPE_PAGE, FLUSH_CACHE_DATA, nbytes); }
-void md_icacheflush(u1* addr, s4 nbytes) { cacheflush((unsigned long)addr, FLUSH_SCOPE_LINE, FLUSH_CACHE_INSN, nbytes); }
-
-/* md_stacktrace_get_returnaddress *********************************************
-
- Returns the return address of the current stackframe, specified by
- the passed stack pointer and the stack frame size.
-
-*******************************************************************************/
-u1* md_stacktrace_get_returnaddress(u1* sp, u4 framesize)
-{
- /* return address is above stackpointer */
- u1 *ra = *((u1**)(sp + framesize));
-
- /* XXX: This helps for now, but it's a ugly hack
- * the problem _may_ be: the link instruction is used
- * by some gcc generated code, and we get an additional word
- * on the stack, the old framepointer. Its address is somewhere
- * near sp, but that all depends the code generated by the compiler.
- * I'm unsure about a clean solution.
- */
- #if 0
- if (!(ra > 0x40000000 && ra < 0x80000000)) {
- ra = *((u1**)(sp + framesize + 4));
- }
- #endif
- /* assert(ra > 0x40000000 && ra < 0x80000000);
- printf("XXXXXX=%x\n", ra);
- */
- return ra;
-}
-
/*
* These are local overrides for various environment variables in Emacs.