Perhaps someone in the community can help you. I have neither cycles nor equipment available to work on the problem. Just to ask: what kind of hardware are you using, or are you using a qemu model?
From: 薛欣颖 [mailto:xy...@fiberhome.com] Sent: Sunday, March 19, 2017 11:18 PM To: Dave Barach (dbarach) <dbar...@cisco.com>; vpp-dev <vpp-dev@lists.fd.io> Subject: Re: RE: [vpp-dev] problems in mips32 According to your suggestion,I re-write "clib_calljmp" in longjmp.S,and it also passes test_longjmp.c;but it doesn't work in vpp, still segmentation fault when excute a system call. At last time, I saving return address(ra) and old stack-pointer(old sp) in register s6 and s7, this time I saved them in new stack. I don't think Ra and old stack is the key of the question, becuase the function crashes before it returns. Here is the code; .text .global clib_calljmp .align 4; .ent clib_calljmp,0; .type clib_calljmp,@function clib_calljmp: move $10, $29 //sp->t2 backup old sp li $9, 4 //t1 = 4 subu $8, $6, $9 //t0 = a2 - t1 new sp -4 move $29, $8 //t0->sp write new sp in register sp addiu $29,$29,-8 sw $31,4($29) //push ra sw $10,0($29) //push old stack move $25, $4 //a0->t9 new function move $4, $5 //a1->a0 new function arg jalr $25 //jump nop lw $31,4($29) //pop ra lw $29,0($29) //pop old stack jr $31 //return .end clib_calljmp; Regards, Xinying Xue From: Dave Barach (dbarach)<mailto:dbar...@cisco.com> Date: 2017-03-16 21:03 To: 薛欣颖<mailto:xy...@fiberhome.com>; vpp-dev<mailto:vpp-dev@lists.fd.io> Subject: RE: [vpp-dev] problems in mips32 Please make sure that src/vppinfra/test_longjmp.c passes before you move on. You’ve undoubtedly pickled the stack and/or one or more of the registers. Clib_calljmp is always the source of subsequent issues. The code you wrote belongs in longjmp.S. Trying to write clib_calljmp(...) in C / doing the dirty work in an asm volatile makes it all but inevitable that GCC will get in the way. Even though it’s been a long time since I wrote MIPS assembler code: I don’t see where you’re saving clib_calljmp’s return address and old stack-pointer on the new stack. If you expect people to even try to help you with assembly code, comments are essential. Thanks… Dave From: vpp-dev-boun...@lists.fd.io<mailto:vpp-dev-boun...@lists.fd.io> [mailto:vpp-dev-boun...@lists.fd.io] On Behalf Of ??? Sent: Wednesday, March 15, 2017 9:52 PM To: vpp-dev <vpp-dev@lists.fd.io<mailto:vpp-dev@lists.fd.io>> Subject: [vpp-dev] problems in mips32 Guys, I'm looking forward to run vpp in mips32 arch,but problem was caused by "clib_calljmp","clib_setjmp" and "clib_longjmp". There is no code for mips32 in vpp, so I wrote them by myself, and they worked very well in my test program, However,when I run vpp with them, segmentation fault was happend when excute a system call like "open","SYS_clock_gettime",etc. The "stack" in "clib_calljmp" was alloced by "clib_mem_alloc_aligned", It is strange that if I did not use "clib_mem_alloc_aligned" but with "malloc", the problem is still there but less happened. Sometimes it occurs, but sometimes it's ok. Here is the code I worte for mips32. uword clib_calljmp (uword (*func) (uword func_arg), uword func_arg, void *stack) { unsigned long ret=0; __asm__ volatile ( ".set push \n" "move $23, $29\n" "li $9, 4\n\t" "subu $8, %3, $9\n\t" "sll $8, $8, 0\n\t" "move $29, $8\n\t" "move $9, %1\n\t" "move $4, %2\n\t" "move $25,$9\n\t" "move $22, $31\n\t" "jalr.hb $25\n\t" "nop\n\t" "move %0, $2\n\t" "move $29,$23\n" "move $31, $22\n\t" ".set pop\n" :"=r"(ret) :"r"(func),"r"(func_arg),"r"(stack) :"$8","$9","$23","$22" ); return ret; } Thanks, Xinying Xue
_______________________________________________ vpp-dev mailing list vpp-dev@lists.fd.io https://lists.fd.io/mailman/listinfo/vpp-dev