Author: dtanzer Date: Thu Dec 8 07:13:26 2005 New Revision: 355115 URL: http://svn.apache.org/viewcvs?rev=355115&view=rev Log: I added a direcotry for ppc specific stuff. ppc_definitions.h: Added file. This file includes architecture specific definitions for the power pc. For _JC_REGISTER_OFFS I used the same definitions as in i386_definitions.h where used for FreeBSD, I'm not sure if this is really the right way... ppc_libjc.h: Added file. Again I copied the content from the i386-specific file and took the FreeBSD section where OS-specific things were done. I'm not sure if this is correct. To be compile-clean I left some functions unimplemented here for the moment. They just print a warning statement to stderr and then exit(0). ppc_functions.c: Added file. I used the parts from libjc/arch/i386/arch_functions.c where !defined(_JC_I386_REG_PARAM) as a starting point. Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/Makefile.am incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/arch_functions.c incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_definitions.h incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_libjc.h incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_structures.h Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/Makefile.am URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/Makefile.am?rev=355115&view=auto ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/Makefile.am (added) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/Makefile.am Thu Dec 8 07:13:26 2005 @@ -0,0 +1,5 @@ +noinst_HEADERS= arch_functions.c \ + ppc_definitions.h \ + ppc_libjc.h \ + ppc_structures.h + Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/arch_functions.c URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/arch_functions.c?rev=355115&view=auto ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/arch_functions.c (added) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/arch_functions.c Thu Dec 8 07:13:26 2005 @@ -0,0 +1,268 @@ + +/* + * Copyright 2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "libjc.h" + +int +_jc_build_trampoline(u_char *code, _jc_method *method, const void *func) +{ + u_char buf[100 + 14 * method->num_parameters]; + u_char *pc; + + /* Sanity check */ + _JC_ASSERT(_JC_OFFSETOF(_jc_env, interp) < 0x80); + + /* Handle length only computation */ + if (code == NULL) + code = buf; + pc = code; + + { + u_char ptypebuf[2]; + u_char offsets[4]; + u_char isfloat[3]; + const u_char *ptypes; + int nparams2; + int nparams; + int offset; + int pnum; + + /* Count total number of parameter words */ + nparams2 = 1; /* "env" */ + if (!_JC_ACC_TEST(method, STATIC)) + nparams2++; /* "this" */ + nparams2 += method->num_parameters; + for (pnum = 0; pnum < method->num_parameters; pnum++) { + if (_jc_dword_type[method->param_ptypes[pnum]]) + nparams2++; + } + + /* Get types of parameter words 1 and 2 (we know type for 0, "env") */ + if (_JC_ACC_TEST(method, STATIC)) { + ptypes = method->param_ptypes; + nparams = method->num_parameters; + } else { + ptypebuf[0] = _JC_TYPE_REFERENCE; /* this */ + ptypebuf[1] = method->param_ptypes[0]; /* first parameter */ + ptypes = ptypebuf; + nparams = method->num_parameters + 1; + } + + /* Prologue */ + *pc++ = 0x55; /* push %ebp */ + *pc++ = 0x89; /* mov %esp,%ebp */ + *pc++ = 0xe5; + + /* Calculate offsets to parameter words not passed in registers */ + memset(&offsets, 0, sizeof(offsets)); + memset(&isfloat, 0, sizeof(isfloat)); + offset = 2; /* skip %ebp, return address */ + if (nparams >= 1) { + switch (ptypes[0]) { + case _JC_TYPE_DOUBLE: + offsets[1] = offset++; + offsets[2] = offset++; + break; + case _JC_TYPE_FLOAT: + offsets[1] = offset++; + isfloat[1] = JNI_TRUE; + if (nparams >= 2) { + switch (ptypes[1]) { + case _JC_TYPE_DOUBLE: + case _JC_TYPE_LONG: + offsets[2] = offset++; + break; + case _JC_TYPE_FLOAT: + offsets[2] = offset++; + isfloat[2] = JNI_TRUE; + break; + default: + break; + } + } + break; + case _JC_TYPE_LONG: + break; + default: + if (nparams >= 2) { + switch (ptypes[1]) { + case _JC_TYPE_DOUBLE: + case _JC_TYPE_LONG: + offsets[2] = offset++; + break; + case _JC_TYPE_FLOAT: + offsets[2] = offset++; + isfloat[2] = JNI_TRUE; + break; + default: + break; + } + } + break; + } + offsets[3] = offset++; + } + + /* Copy 4th and later parameter words into parameter array */ + if (nparams2 >= 4) { + int pword; + + /* Save %eax */ + *pc++ = 0x50; /* push %eax */ + + /* Copy 4th and later parameter words */ + offset = (offsets[3] + (nparams2 - 4)) * 4; + pnum = method->num_parameters - 1; + if (_jc_dword_type[method->param_ptypes[pnum]]) + pnum = -pnum; + for (pword = nparams2 - 1; pword >= 3; pword--, offset -= 4) { + + /* Load parameter word from stack and then push it */ + if (pnum >= 0 + && method->param_ptypes[pnum] == _JC_TYPE_FLOAT) { + + /* Load float */ + if (offset < 0x80) { + /* flds 0xOFFSET(%ebp) */ + *pc++ = 0xd9; + *pc++ = 0x45; + *pc++ = offset; + } else { + /* flds 0xOFFSET(%ebp) */ + *pc++ = 0xd9; + *pc++ = 0x85; + memcpy(pc, &offset, 4); + pc += 4; + } + + /* Push double */ + *pc++ = 0x83; /* sub 0x8,%esp */ + *pc++ = 0xec; + *pc++ = 0x8; + *pc++ = 0xdd; /* fstpl (%esp,1) */ + *pc++ = 0x1c; + *pc++ = 0x24; + } else { + if (offset < 0x80) { + /* mov 0xOFFSET(%ebp),%eax */ + *pc++ = 0x8b; + *pc++ = 0x45; + *pc++ = offset; + } else { + /* mov 0xOFFSET(%ebp),%eax */ + *pc++ = 0x8b; + *pc++ = 0x85; + memcpy(pc, &offset, 4); + pc += 4; + } + *pc++ = 0x50; /* push %eax */ + } + + /* Keep track of corresponding parameter index */ + if (pnum < 0) /* was second word of long/double */ + pnum = -pnum; + else if (_jc_dword_type[method->param_ptypes[--pnum]]) + pnum = -pnum; + } + + /* Restore %eax */ + *pc++ = 0x8b; /* mov -4(%ebp),%eax */ + *pc++ = 0x45; + *pc++ = 0xfc; + } + + /* Recall 3rd parameter word from stack (if necessary) and push */ + if (nparams2 >= 3) { + if (isfloat[2]) { + *pc++ = 0xd9; /* flds 0xNN(%ebp) */ + *pc++ = 0x45; + *pc++ = offsets[2] * 4; + *pc++ = 0x83; /* sub 0x8,%esp */ + *pc++ = 0xec; + *pc++ = 0x8; + *pc++ = 0xdd; /* fstpl (%esp,1) */ + *pc++ = 0x1c; + *pc++ = 0x24; + } else { + if (offsets[2] > 0) { + *pc++ = 0x8b; /* mov 0xNN(%ebp),%ecx */ + *pc++ = 0x4d; + *pc++ = offsets[2] * 4; + } + *pc++ = 0x51; /* push %ecx */ + } + } + + /* Recall 2nd parameter word from stack (if necessary) and push */ + if (nparams2 >= 2) { + if (isfloat[1]) { + *pc++ = 0xd9; /* flds 0xNN(%ebp) */ + *pc++ = 0x45; + *pc++ = offsets[1] * 4; + *pc++ = 0x83; /* sub 0x8,%esp */ + *pc++ = 0xec; + *pc++ = 0x8; + *pc++ = 0xdd; /* fstpl (%esp,1) */ + *pc++ = 0x1c; + *pc++ = 0x24; + } else { + if (offsets[1] > 0) { + *pc++ = 0x8b; /* mov 0xNN(%ebp),%edx */ + *pc++ = 0x55; + *pc++ = offsets[1] * 4; + } + *pc++ = 0x52; /* push %edx */ + } + } + + /* Push "env" (first parameter) onto the stack */ + *pc++ = 0x50; /* push %eax */ + + /* Set env->interp = method */ + *pc++ = 0xc7; /* mov METHOD,OFFSET(%eax) */ + *pc++ = 0x40; + *pc++ = _JC_OFFSETOF(_jc_env, interp); + memcpy(pc, &method, 4); + pc += 4; + + /* Call function */ + *pc++ = 0xe8; /* call func */ + func = (void *)((jint)func - (jint)(pc + 4)); + memcpy(pc, &func, 4); + pc += 4; + + /* Epilogue */ + *pc++ = 0xc9; /* leave */ + *pc++ = 0xc3; /* ret */ + } + + /* Done */ + return pc - code; +} + +#include + +void +_jc_dynamic_invoke(const void *func, int jcni, int nparams, + const u_char *ptypes, int nwords, _jc_word *words, _jc_value *retval) +{ + fprintf(stdout, "WARNING: Call to unimplemented function _jc_dynamic_invoke(...).\n"); + exit(0); +} + Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_definitions.h URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_definitions.h?rev=355115&view=auto ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_definitions.h (added) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_definitions.h Thu Dec 8 07:13:26 2005 @@ -0,0 +1,52 @@ + +/* + * Copyright 2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _ARCH_PPC_DEFINITIONS_H_ +#define _ARCH_PPC_DEFINITIONS_H_ + +#if !defined(__ppc__) +#error "This include file is for the ppc architecture only" +#endif + +#define _JC_PAGE_SHIFT 12 /* 4096 byte pages */ + +#define _JC_STACK_ALIGN 2 + +#define _JC_BIG_ENDIAN 1 + +#define _JC_REGISTER_OFFS { \ + _JC_OFFSETOF(mcontext_t, mc_gs), \ + _JC_OFFSETOF(mcontext_t, mc_fs), \ + _JC_OFFSETOF(mcontext_t, mc_es), \ + _JC_OFFSETOF(mcontext_t, mc_ds), \ + _JC_OFFSETOF(mcontext_t, mc_edi), \ + _JC_OFFSETOF(mcontext_t, mc_esi), \ + _JC_OFFSETOF(mcontext_t, mc_ebp), \ + _JC_OFFSETOF(mcontext_t, mc_isp), \ + _JC_OFFSETOF(mcontext_t, mc_ebx), \ + _JC_OFFSETOF(mcontext_t, mc_edx), \ + _JC_OFFSETOF(mcontext_t, mc_ecx), \ + _JC_OFFSETOF(mcontext_t, mc_eax), \ + _JC_OFFSETOF(mcontext_t, mc_cs), \ + _JC_OFFSETOF(mcontext_t, mc_esp), \ + _JC_OFFSETOF(mcontext_t, mc_ss), \ + } + +#endif /* _ARCH_PPC_DEFINITIONS_H_ */ + Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_libjc.h URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_libjc.h?rev=355115&view=auto ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_libjc.h (added) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_libjc.h Thu Dec 8 07:13:26 2005 @@ -0,0 +1,144 @@ + +/* + * Copyright 2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _ARCH_PPC_LIBJC_H_ +#define _ARCH_PPC_LIBJC_H_ + +#ifndef __ppc__ +#error "This header file is meant for the PPC architecture only." +#endif /* __ppc__ */ + +/* stdio.h included to print warning outputs in the stub functions which return + * NULL for the moment... + */ +#include + +/* + * Architecture-specific functions for ppc architecture. + */ + +/** + * @todo Left unimplemented for the moment. + */ +extern inline int +_jc_compare_and_swap(volatile _jc_word *word, _jc_word old, _jc_word new) +{ + if (*word == old) { + *word = new; + return JNI_TRUE; + } else { + return JNI_FALSE; + } +} + +/** + * @todo Is there nothing todo on the ppc too? + */ +extern inline void +_jc_iflush(const void *mem, size_t len) +{ + /* From the original header file: "nothing to do: i386 has coherent data and + * instruction caches" + */ +} + +extern inline void +_jc_stack_frame_init(_jc_stack_frame *framep) +{ + *framep = NULL; +} + +#define _jc_stack_frame_current(framep) \ + do { \ + *(framep) = __builtin_frame_address(0); \ + } while (0) + +extern inline void +_jc_stack_frame_next(_jc_stack_frame *framep, const void **pcp) +{ + _jc_word *const ebp = *framep; + + *pcp = (const void *)ebp[1]; /* saved %eip is one slot above %ebp */ + *framep = (_jc_word *)ebp[0]; /* %ebp points to saved %ebp */ +} + +extern inline jboolean +_jc_stack_frame_valid(_jc_stack_frame frame) +{ + return frame != NULL; +} + +extern inline jboolean +_jc_stack_frame_equal(_jc_stack_frame frame1, _jc_stack_frame frame2) +{ + return frame1 == frame2; +} + +extern inline const void * +_jc_stack_frame_sp(_jc_stack_frame frame) +{ + return (const void *)frame; +} + +/** + * @todo Returning NULL to be compile-clean for the moment. + */ +extern inline const void * +_jc_mcontext_sp(const mcontext_t *mctx) +{ + fprintf(stderr, "WARNING: call to unimplemented function _jc_mcontext_sp(...)\n"); + exit(0); + return (const void *) NULL; +} + +/** + * @todo Returning NULL to be compile-clean for the moment. + */ +extern inline const void * +_jc_mcontext_pc(const mcontext_t *mctx) +{ + fprintf(stderr, "WARNING: call to unimplemented function _jc_mcontext_pc(...)\n"); + exit(0); + return (const void *) NULL; +} + +/** + * @todo Returning NULL to be compile-clean for the moment. + */ +extern inline _jc_stack_frame +_jc_mcontext_frame(const mcontext_t *mctx) +{ + fprintf(stderr, "WARNING: call to unimplemented function _jc_mcontext_frame(...)\n"); + exit(0); + return (_jc_word *) NULL; +} + +/** + * @todo Returning NULL to be compile-clean for the moment. + */ +extern inline const void * +_jc_signal_fault_address(int sig_num, siginfo_t *info, ucontext_t *uctx) +{ + fprintf(stderr, "WARNING: call to unimplemented function _jc_signal_falut_address(...)\n"); + exit(0); + return (const void *) NULL; +} + +#endif /* _ARCH_PPC_LIBJC_H_ */ + Added: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_structures.h URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_structures.h?rev=355115&view=auto ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_structures.h (added) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/arch/ppc/ppc_structures.h Thu Dec 8 07:13:26 2005 @@ -0,0 +1,26 @@ + +/* + * Copyright 2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _ARCH_PPC_STRUCTURES_H_ +#define _ARCH_PPC_STRUCTURES_H_ + +typedef _jc_word *_jc_stack_frame; /* pointer to saved %epb */ + +#endif /* _ARCH_PPC_STRUCTURES_H_ */ +