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)
Date: 2017-03-16 21:03
To: 薛欣颖; vpp-dev
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: [email protected] [mailto:[email protected]] On
Behalf Of ???
Sent: Wednesday, March 15, 2017 9:52 PM
To: vpp-dev <[email protected]>
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
[email protected]
https://lists.fd.io/mailman/listinfo/vpp-dev