1217044Snwhitehorn# This script generates the PS3 hypervisor call stubs from an HV 2217044Snwhitehorn# interface definition file. The PS3 HV calling convention is very 3217044Snwhitehorn# similar to the PAPR one, except that the function token is passed in 4217044Snwhitehorn# r11 instead of r3. 5217044Snwhitehorn# 6217044Snwhitehorn# Invoke like so: awk -f ps3-hv-asm.awk < ps3-hvcall.master > ps3-hvcall.S 7217044Snwhitehorn# 8217044Snwhitehorn 9217044Snwhitehorn# $FreeBSD: releng/10.3/sys/powerpc/ps3/ps3-hv-asm.awk 228688 2011-12-18 16:53:03Z nwhitehorn $ 10217044Snwhitehorn 11217044SnwhitehornBEGIN { 12228688Snwhitehorn printf("/* $FreeBSD: releng/10.3/sys/powerpc/ps3/ps3-hv-asm.awk 228688 2011-12-18 16:53:03Z nwhitehorn $ */\n\n"); 13217044Snwhitehorn printf("#include <machine/asm.h>\n\n"); 14217044Snwhitehorn printf("#define hc .long 0x44000022\n\n"); 15217044Snwhitehorn} 16217044Snwhitehorn 17217044Snwhitehorn/HVCALL.*/ { 18217044Snwhitehorn code = $2; 19217044Snwhitehorn ins = split($4, a, ",") 20217044Snwhitehorn outs = split($5, a, ",") 21217044Snwhitehorn 22217044Snwhitehorn printf("ASENTRY(%s)\n",$3); 23217044Snwhitehorn printf("\tmflr %%r0\n"); 24217044Snwhitehorn printf("\tstd %%r0,16(%%r1)\n"); 25217044Snwhitehorn printf("\tstdu %%r1,-%d(%%r1)\n", 48+8*outs); 26217044Snwhitehorn 27217044Snwhitehorn if ($4 == "UNUSED") 28217044Snwhitehorn ins = 0 29217044Snwhitehorn 30217044Snwhitehorn # Save output reg addresses to the stack 31217044Snwhitehorn for (i = 0; i < outs; i++) { 32217044Snwhitehorn if (ins+i >= 8) { 33217044Snwhitehorn printf("\tld %%r11,%d(%%r1)\n", 48+8*outs + 48 + 8*(i+ins)); 34217044Snwhitehorn printf("\tstd %%r11,%d(%%r1)\n", 48+8*i); 35217044Snwhitehorn } else { 36217044Snwhitehorn printf("\tstd %%r%d,%d(%%r1)\n", 3+ins+i, 48+8*i); 37217044Snwhitehorn } 38217044Snwhitehorn } 39217044Snwhitehorn 40217044Snwhitehorn printf("\tli %%r11,%d\n", code); 41217044Snwhitehorn printf("\thc\n"); 42217044Snwhitehorn printf("\textsw %%r3,%%r3\n"); 43217044Snwhitehorn 44217044Snwhitehorn for (i = 0; i < outs; i++) { 45217044Snwhitehorn printf("\tld %%r11,%d(%%r1)\n", 48+8*i); 46217044Snwhitehorn printf("\tstd %%r%d,0(%%r11)\n", 4+i); 47217044Snwhitehorn } 48217044Snwhitehorn 49217044Snwhitehorn printf("\tld %%r1,0(%%r1)\n"); 50217044Snwhitehorn printf("\tld %%r0,16(%%r1)\n"); 51217044Snwhitehorn printf("\tmtlr %%r0\n"); 52217044Snwhitehorn printf("\tblr\n\n"); 53217044Snwhitehorn} 54