103479763SNathan Whitehorn# This script generates the PS3 hypervisor call stubs from an HV 203479763SNathan Whitehorn# interface definition file. The PS3 HV calling convention is very 303479763SNathan Whitehorn# similar to the PAPR one, except that the function token is passed in 403479763SNathan Whitehorn# r11 instead of r3. 503479763SNathan Whitehorn# 603479763SNathan Whitehorn# Invoke like so: awk -f ps3-hv-asm.awk < ps3-hvcall.master > ps3-hvcall.S 703479763SNathan Whitehorn# 803479763SNathan Whitehorn 903479763SNathan WhitehornBEGIN { 1003479763SNathan Whitehorn printf("#include <machine/asm.h>\n\n"); 1103479763SNathan Whitehorn printf("#define hc .long 0x44000022\n\n"); 1203479763SNathan Whitehorn} 1303479763SNathan Whitehorn 1403479763SNathan Whitehorn/HVCALL.*/ { 15*50a03971SChattrapat Sangmanee # Parameter save area 16*50a03971SChattrapat Sangmanee # 48 in elfv1, 32 in elfv2 17*50a03971SChattrapat Sangmanee stack_offset = 32; 18*50a03971SChattrapat Sangmanee 1903479763SNathan Whitehorn code = $2; 2003479763SNathan Whitehorn ins = split($4, a, ",") 2103479763SNathan Whitehorn outs = split($5, a, ",") 2203479763SNathan Whitehorn 2303479763SNathan Whitehorn printf("ASENTRY(%s)\n",$3); 2403479763SNathan Whitehorn printf("\tmflr %%r0\n"); 2503479763SNathan Whitehorn printf("\tstd %%r0,16(%%r1)\n"); 26*50a03971SChattrapat Sangmanee printf("\tstdu %%r1,-%d(%%r1)\n", stack_offset+8*outs); 2703479763SNathan Whitehorn 2803479763SNathan Whitehorn if ($4 == "UNUSED") 2903479763SNathan Whitehorn ins = 0 3003479763SNathan Whitehorn 3103479763SNathan Whitehorn # Save output reg addresses to the stack 3203479763SNathan Whitehorn for (i = 0; i < outs; i++) { 3303479763SNathan Whitehorn if (ins+i >= 8) { 34*50a03971SChattrapat Sangmanee printf("\tld %%r11,%d(%%r1)\n", stack_offset+8*outs + stack_offset + 8*(i+ins)); 35*50a03971SChattrapat Sangmanee printf("\tstd %%r11,%d(%%r1)\n", stack_offset+8*i); 3603479763SNathan Whitehorn } else { 37*50a03971SChattrapat Sangmanee printf("\tstd %%r%d,%d(%%r1)\n", 3+ins+i, stack_offset+8*i); 3803479763SNathan Whitehorn } 3903479763SNathan Whitehorn } 4003479763SNathan Whitehorn 4103479763SNathan Whitehorn printf("\tli %%r11,%d\n", code); 4203479763SNathan Whitehorn printf("\thc\n"); 4303479763SNathan Whitehorn printf("\textsw %%r3,%%r3\n"); 4403479763SNathan Whitehorn 4503479763SNathan Whitehorn for (i = 0; i < outs; i++) { 46*50a03971SChattrapat Sangmanee printf("\tld %%r11,%d(%%r1)\n", stack_offset+8*i); 4703479763SNathan Whitehorn printf("\tstd %%r%d,0(%%r11)\n", 4+i); 4803479763SNathan Whitehorn } 4903479763SNathan Whitehorn 5003479763SNathan Whitehorn printf("\tld %%r1,0(%%r1)\n"); 5103479763SNathan Whitehorn printf("\tld %%r0,16(%%r1)\n"); 5203479763SNathan Whitehorn printf("\tmtlr %%r0\n"); 53*50a03971SChattrapat Sangmanee printf("\tblr\n"); 54*50a03971SChattrapat Sangmanee 55*50a03971SChattrapat Sangmanee printf("ASEND(%s)\n\n",$3); 5603479763SNathan Whitehorn} 57