Path: blob/master/arch/powerpc/platforms/ps3/hvcall.S
10818 views
/*1* PS3 hvcall interface.2*3* Copyright (C) 2006 Sony Computer Entertainment Inc.4* Copyright 2006 Sony Corp.5* Copyright 2003, 2004 (c) MontaVista Software, Inc.6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License as published by9* the Free Software Foundation; version 2 of the License.10*11* This program is distributed in the hope that it will be useful,12* but WITHOUT ANY WARRANTY; without even the implied warranty of13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14* GNU General Public License for more details.15*16* You should have received a copy of the GNU General Public License17* along with this program; if not, write to the Free Software18* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA19*/2021#include <asm/processor.h>22#include <asm/ppc_asm.h>2324#define lv1call .long 0x44000022; extsw r3, r32526#define LV1_N_IN_0_OUT(API_NAME, API_NUMBER) \27_GLOBAL(_##API_NAME) \28\29mflr r0; \30std r0, 16(r1); \31\32li r11, API_NUMBER; \33lv1call; \34\35ld r0, 16(r1); \36mtlr r0; \37blr3839#define LV1_0_IN_0_OUT LV1_N_IN_0_OUT40#define LV1_1_IN_0_OUT LV1_N_IN_0_OUT41#define LV1_2_IN_0_OUT LV1_N_IN_0_OUT42#define LV1_3_IN_0_OUT LV1_N_IN_0_OUT43#define LV1_4_IN_0_OUT LV1_N_IN_0_OUT44#define LV1_5_IN_0_OUT LV1_N_IN_0_OUT45#define LV1_6_IN_0_OUT LV1_N_IN_0_OUT46#define LV1_7_IN_0_OUT LV1_N_IN_0_OUT4748#define LV1_0_IN_1_OUT(API_NAME, API_NUMBER) \49_GLOBAL(_##API_NAME) \50\51mflr r0; \52std r0, 16(r1); \53\54stdu r3, -8(r1); \55\56li r11, API_NUMBER; \57lv1call; \58\59addi r1, r1, 8; \60ld r11, -8(r1); \61std r4, 0(r11); \62\63ld r0, 16(r1); \64mtlr r0; \65blr6667#define LV1_0_IN_2_OUT(API_NAME, API_NUMBER) \68_GLOBAL(_##API_NAME) \69\70mflr r0; \71std r0, 16(r1); \72\73std r3, -8(r1); \74stdu r4, -16(r1); \75\76li r11, API_NUMBER; \77lv1call; \78\79addi r1, r1, 16; \80ld r11, -8(r1); \81std r4, 0(r11); \82ld r11, -16(r1); \83std r5, 0(r11); \84\85ld r0, 16(r1); \86mtlr r0; \87blr8889#define LV1_0_IN_3_OUT(API_NAME, API_NUMBER) \90_GLOBAL(_##API_NAME) \91\92mflr r0; \93std r0, 16(r1); \94\95std r3, -8(r1); \96std r4, -16(r1); \97stdu r5, -24(r1); \98\99li r11, API_NUMBER; \100lv1call; \101\102addi r1, r1, 24; \103ld r11, -8(r1); \104std r4, 0(r11); \105ld r11, -16(r1); \106std r5, 0(r11); \107ld r11, -24(r1); \108std r6, 0(r11); \109\110ld r0, 16(r1); \111mtlr r0; \112blr113114#define LV1_0_IN_7_OUT(API_NAME, API_NUMBER) \115_GLOBAL(_##API_NAME) \116\117mflr r0; \118std r0, 16(r1); \119\120std r3, -8(r1); \121std r4, -16(r1); \122std r5, -24(r1); \123std r6, -32(r1); \124std r7, -40(r1); \125std r8, -48(r1); \126stdu r9, -56(r1); \127\128li r11, API_NUMBER; \129lv1call; \130\131addi r1, r1, 56; \132ld r11, -8(r1); \133std r4, 0(r11); \134ld r11, -16(r1); \135std r5, 0(r11); \136ld r11, -24(r1); \137std r6, 0(r11); \138ld r11, -32(r1); \139std r7, 0(r11); \140ld r11, -40(r1); \141std r8, 0(r11); \142ld r11, -48(r1); \143std r9, 0(r11); \144ld r11, -56(r1); \145std r10, 0(r11); \146\147ld r0, 16(r1); \148mtlr r0; \149blr150151#define LV1_1_IN_1_OUT(API_NAME, API_NUMBER) \152_GLOBAL(_##API_NAME) \153\154mflr r0; \155std r0, 16(r1); \156\157stdu r4, -8(r1); \158\159li r11, API_NUMBER; \160lv1call; \161\162addi r1, r1, 8; \163ld r11, -8(r1); \164std r4, 0(r11); \165\166ld r0, 16(r1); \167mtlr r0; \168blr169170#define LV1_1_IN_2_OUT(API_NAME, API_NUMBER) \171_GLOBAL(_##API_NAME) \172\173mflr r0; \174std r0, 16(r1); \175\176std r4, -8(r1); \177stdu r5, -16(r1); \178\179li r11, API_NUMBER; \180lv1call; \181\182addi r1, r1, 16; \183ld r11, -8(r1); \184std r4, 0(r11); \185ld r11, -16(r1); \186std r5, 0(r11); \187\188ld r0, 16(r1); \189mtlr r0; \190blr191192#define LV1_1_IN_3_OUT(API_NAME, API_NUMBER) \193_GLOBAL(_##API_NAME) \194\195mflr r0; \196std r0, 16(r1); \197\198std r4, -8(r1); \199std r5, -16(r1); \200stdu r6, -24(r1); \201\202li r11, API_NUMBER; \203lv1call; \204\205addi r1, r1, 24; \206ld r11, -8(r1); \207std r4, 0(r11); \208ld r11, -16(r1); \209std r5, 0(r11); \210ld r11, -24(r1); \211std r6, 0(r11); \212\213ld r0, 16(r1); \214mtlr r0; \215blr216217#define LV1_1_IN_4_OUT(API_NAME, API_NUMBER) \218_GLOBAL(_##API_NAME) \219\220mflr r0; \221std r0, 16(r1); \222\223std r4, -8(r1); \224std r5, -16(r1); \225std r6, -24(r1); \226stdu r7, -32(r1); \227\228li r11, API_NUMBER; \229lv1call; \230\231addi r1, r1, 32; \232ld r11, -8(r1); \233std r4, 0(r11); \234ld r11, -16(r1); \235std r5, 0(r11); \236ld r11, -24(r1); \237std r6, 0(r11); \238ld r11, -32(r1); \239std r7, 0(r11); \240\241ld r0, 16(r1); \242mtlr r0; \243blr244245#define LV1_1_IN_5_OUT(API_NAME, API_NUMBER) \246_GLOBAL(_##API_NAME) \247\248mflr r0; \249std r0, 16(r1); \250\251std r4, -8(r1); \252std r5, -16(r1); \253std r6, -24(r1); \254std r7, -32(r1); \255stdu r8, -40(r1); \256\257li r11, API_NUMBER; \258lv1call; \259\260addi r1, r1, 40; \261ld r11, -8(r1); \262std r4, 0(r11); \263ld r11, -16(r1); \264std r5, 0(r11); \265ld r11, -24(r1); \266std r6, 0(r11); \267ld r11, -32(r1); \268std r7, 0(r11); \269ld r11, -40(r1); \270std r8, 0(r11); \271\272ld r0, 16(r1); \273mtlr r0; \274blr275276#define LV1_1_IN_6_OUT(API_NAME, API_NUMBER) \277_GLOBAL(_##API_NAME) \278\279mflr r0; \280std r0, 16(r1); \281\282std r4, -8(r1); \283std r5, -16(r1); \284std r6, -24(r1); \285std r7, -32(r1); \286std r8, -40(r1); \287stdu r9, -48(r1); \288\289li r11, API_NUMBER; \290lv1call; \291\292addi r1, r1, 48; \293ld r11, -8(r1); \294std r4, 0(r11); \295ld r11, -16(r1); \296std r5, 0(r11); \297ld r11, -24(r1); \298std r6, 0(r11); \299ld r11, -32(r1); \300std r7, 0(r11); \301ld r11, -40(r1); \302std r8, 0(r11); \303ld r11, -48(r1); \304std r9, 0(r11); \305\306ld r0, 16(r1); \307mtlr r0; \308blr309310#define LV1_1_IN_7_OUT(API_NAME, API_NUMBER) \311_GLOBAL(_##API_NAME) \312\313mflr r0; \314std r0, 16(r1); \315\316std r4, -8(r1); \317std r5, -16(r1); \318std r6, -24(r1); \319std r7, -32(r1); \320std r8, -40(r1); \321std r9, -48(r1); \322stdu r10, -56(r1); \323\324li r11, API_NUMBER; \325lv1call; \326\327addi r1, r1, 56; \328ld r11, -8(r1); \329std r4, 0(r11); \330ld r11, -16(r1); \331std r5, 0(r11); \332ld r11, -24(r1); \333std r6, 0(r11); \334ld r11, -32(r1); \335std r7, 0(r11); \336ld r11, -40(r1); \337std r8, 0(r11); \338ld r11, -48(r1); \339std r9, 0(r11); \340ld r11, -56(r1); \341std r10, 0(r11); \342\343ld r0, 16(r1); \344mtlr r0; \345blr346347#define LV1_2_IN_1_OUT(API_NAME, API_NUMBER) \348_GLOBAL(_##API_NAME) \349\350mflr r0; \351std r0, 16(r1); \352\353stdu r5, -8(r1); \354\355li r11, API_NUMBER; \356lv1call; \357\358addi r1, r1, 8; \359ld r11, -8(r1); \360std r4, 0(r11); \361\362ld r0, 16(r1); \363mtlr r0; \364blr365366#define LV1_2_IN_2_OUT(API_NAME, API_NUMBER) \367_GLOBAL(_##API_NAME) \368\369mflr r0; \370std r0, 16(r1); \371\372std r5, -8(r1); \373stdu r6, -16(r1); \374\375li r11, API_NUMBER; \376lv1call; \377\378addi r1, r1, 16; \379ld r11, -8(r1); \380std r4, 0(r11); \381ld r11, -16(r1); \382std r5, 0(r11); \383\384ld r0, 16(r1); \385mtlr r0; \386blr387388#define LV1_2_IN_3_OUT(API_NAME, API_NUMBER) \389_GLOBAL(_##API_NAME) \390\391mflr r0; \392std r0, 16(r1); \393\394std r5, -8(r1); \395std r6, -16(r1); \396stdu r7, -24(r1); \397\398li r11, API_NUMBER; \399lv1call; \400\401addi r1, r1, 24; \402ld r11, -8(r1); \403std r4, 0(r11); \404ld r11, -16(r1); \405std r5, 0(r11); \406ld r11, -24(r1); \407std r6, 0(r11); \408\409ld r0, 16(r1); \410mtlr r0; \411blr412413#define LV1_2_IN_4_OUT(API_NAME, API_NUMBER) \414_GLOBAL(_##API_NAME) \415\416mflr r0; \417std r0, 16(r1); \418\419std r5, -8(r1); \420std r6, -16(r1); \421std r7, -24(r1); \422stdu r8, -32(r1); \423\424li r11, API_NUMBER; \425lv1call; \426\427addi r1, r1, 32; \428ld r11, -8(r1); \429std r4, 0(r11); \430ld r11, -16(r1); \431std r5, 0(r11); \432ld r11, -24(r1); \433std r6, 0(r11); \434ld r11, -32(r1); \435std r7, 0(r11); \436\437ld r0, 16(r1); \438mtlr r0; \439blr440441#define LV1_2_IN_5_OUT(API_NAME, API_NUMBER) \442_GLOBAL(_##API_NAME) \443\444mflr r0; \445std r0, 16(r1); \446\447std r5, -8(r1); \448std r6, -16(r1); \449std r7, -24(r1); \450std r8, -32(r1); \451stdu r9, -40(r1); \452\453li r11, API_NUMBER; \454lv1call; \455\456addi r1, r1, 40; \457ld r11, -8(r1); \458std r4, 0(r11); \459ld r11, -16(r1); \460std r5, 0(r11); \461ld r11, -24(r1); \462std r6, 0(r11); \463ld r11, -32(r1); \464std r7, 0(r11); \465ld r11, -40(r1); \466std r8, 0(r11); \467\468ld r0, 16(r1); \469mtlr r0; \470blr471472#define LV1_3_IN_1_OUT(API_NAME, API_NUMBER) \473_GLOBAL(_##API_NAME) \474\475mflr r0; \476std r0, 16(r1); \477\478stdu r6, -8(r1); \479\480li r11, API_NUMBER; \481lv1call; \482\483addi r1, r1, 8; \484ld r11, -8(r1); \485std r4, 0(r11); \486\487ld r0, 16(r1); \488mtlr r0; \489blr490491#define LV1_3_IN_2_OUT(API_NAME, API_NUMBER) \492_GLOBAL(_##API_NAME) \493\494mflr r0; \495std r0, 16(r1); \496\497std r6, -8(r1); \498stdu r7, -16(r1); \499\500li r11, API_NUMBER; \501lv1call; \502\503addi r1, r1, 16; \504ld r11, -8(r1); \505std r4, 0(r11); \506ld r11, -16(r1); \507std r5, 0(r11); \508\509ld r0, 16(r1); \510mtlr r0; \511blr512513#define LV1_3_IN_3_OUT(API_NAME, API_NUMBER) \514_GLOBAL(_##API_NAME) \515\516mflr r0; \517std r0, 16(r1); \518\519std r6, -8(r1); \520std r7, -16(r1); \521stdu r8, -24(r1); \522\523li r11, API_NUMBER; \524lv1call; \525\526addi r1, r1, 24; \527ld r11, -8(r1); \528std r4, 0(r11); \529ld r11, -16(r1); \530std r5, 0(r11); \531ld r11, -24(r1); \532std r6, 0(r11); \533\534ld r0, 16(r1); \535mtlr r0; \536blr537538#define LV1_4_IN_1_OUT(API_NAME, API_NUMBER) \539_GLOBAL(_##API_NAME) \540\541mflr r0; \542std r0, 16(r1); \543\544stdu r7, -8(r1); \545\546li r11, API_NUMBER; \547lv1call; \548\549addi r1, r1, 8; \550ld r11, -8(r1); \551std r4, 0(r11); \552\553ld r0, 16(r1); \554mtlr r0; \555blr556557#define LV1_4_IN_2_OUT(API_NAME, API_NUMBER) \558_GLOBAL(_##API_NAME) \559\560mflr r0; \561std r0, 16(r1); \562\563std r7, -8(r1); \564stdu r8, -16(r1); \565\566li r11, API_NUMBER; \567lv1call; \568\569addi r1, r1, 16; \570ld r11, -8(r1); \571std r4, 0(r11); \572ld r11, -16(r1); \573std r5, 0(r11); \574\575ld r0, 16(r1); \576mtlr r0; \577blr578579#define LV1_4_IN_3_OUT(API_NAME, API_NUMBER) \580_GLOBAL(_##API_NAME) \581\582mflr r0; \583std r0, 16(r1); \584\585std r7, -8(r1); \586std r8, -16(r1); \587stdu r9, -24(r1); \588\589li r11, API_NUMBER; \590lv1call; \591\592addi r1, r1, 24; \593ld r11, -8(r1); \594std r4, 0(r11); \595ld r11, -16(r1); \596std r5, 0(r11); \597ld r11, -24(r1); \598std r6, 0(r11); \599\600ld r0, 16(r1); \601mtlr r0; \602blr603604#define LV1_5_IN_1_OUT(API_NAME, API_NUMBER) \605_GLOBAL(_##API_NAME) \606\607mflr r0; \608std r0, 16(r1); \609\610stdu r8, -8(r1); \611\612li r11, API_NUMBER; \613lv1call; \614\615addi r1, r1, 8; \616ld r11, -8(r1); \617std r4, 0(r11); \618\619ld r0, 16(r1); \620mtlr r0; \621blr622623#define LV1_5_IN_2_OUT(API_NAME, API_NUMBER) \624_GLOBAL(_##API_NAME) \625\626mflr r0; \627std r0, 16(r1); \628\629std r8, -8(r1); \630stdu r9, -16(r1); \631\632li r11, API_NUMBER; \633lv1call; \634\635addi r1, r1, 16; \636ld r11, -8(r1); \637std r4, 0(r11); \638ld r11, -16(r1); \639std r5, 0(r11); \640\641ld r0, 16(r1); \642mtlr r0; \643blr644645#define LV1_5_IN_3_OUT(API_NAME, API_NUMBER) \646_GLOBAL(_##API_NAME) \647\648mflr r0; \649std r0, 16(r1); \650\651std r8, -8(r1); \652std r9, -16(r1); \653stdu r10, -24(r1); \654\655li r11, API_NUMBER; \656lv1call; \657\658addi r1, r1, 24; \659ld r11, -8(r1); \660std r4, 0(r11); \661ld r11, -16(r1); \662std r5, 0(r11); \663ld r11, -24(r1); \664std r6, 0(r11); \665\666ld r0, 16(r1); \667mtlr r0; \668blr669670#define LV1_6_IN_1_OUT(API_NAME, API_NUMBER) \671_GLOBAL(_##API_NAME) \672\673mflr r0; \674std r0, 16(r1); \675\676stdu r9, -8(r1); \677\678li r11, API_NUMBER; \679lv1call; \680\681addi r1, r1, 8; \682ld r11, -8(r1); \683std r4, 0(r11); \684\685ld r0, 16(r1); \686mtlr r0; \687blr688689#define LV1_6_IN_2_OUT(API_NAME, API_NUMBER) \690_GLOBAL(_##API_NAME) \691\692mflr r0; \693std r0, 16(r1); \694\695std r9, -8(r1); \696stdu r10, -16(r1); \697\698li r11, API_NUMBER; \699lv1call; \700\701addi r1, r1, 16; \702ld r11, -8(r1); \703std r4, 0(r11); \704ld r11, -16(r1); \705std r5, 0(r11); \706\707ld r0, 16(r1); \708mtlr r0; \709blr710711#define LV1_6_IN_3_OUT(API_NAME, API_NUMBER) \712_GLOBAL(_##API_NAME) \713\714mflr r0; \715std r0, 16(r1); \716\717std r9, -8(r1); \718stdu r10, -16(r1); \719\720li r11, API_NUMBER; \721lv1call; \722\723addi r1, r1, 16; \724ld r11, -8(r1); \725std r4, 0(r11); \726ld r11, -16(r1); \727std r5, 0(r11); \728ld r11, 48+8*8(r1); \729std r6, 0(r11); \730\731ld r0, 16(r1); \732mtlr r0; \733blr734735#define LV1_7_IN_1_OUT(API_NAME, API_NUMBER) \736_GLOBAL(_##API_NAME) \737\738mflr r0; \739std r0, 16(r1); \740\741stdu r10, -8(r1); \742\743li r11, API_NUMBER; \744lv1call; \745\746addi r1, r1, 8; \747ld r11, -8(r1); \748std r4, 0(r11); \749\750ld r0, 16(r1); \751mtlr r0; \752blr753754#define LV1_7_IN_6_OUT(API_NAME, API_NUMBER) \755_GLOBAL(_##API_NAME) \756\757mflr r0; \758std r0, 16(r1); \759\760std r10, 48+8*7(r1); \761\762li r11, API_NUMBER; \763lv1call; \764\765ld r11, 48+8*7(r1); \766std r4, 0(r11); \767ld r11, 48+8*8(r1); \768std r5, 0(r11); \769ld r11, 48+8*9(r1); \770std r6, 0(r11); \771ld r11, 48+8*10(r1); \772std r7, 0(r11); \773ld r11, 48+8*11(r1); \774std r8, 0(r11); \775ld r11, 48+8*12(r1); \776std r9, 0(r11); \777\778ld r0, 16(r1); \779mtlr r0; \780blr781782#define LV1_8_IN_1_OUT(API_NAME, API_NUMBER) \783_GLOBAL(_##API_NAME) \784\785mflr r0; \786std r0, 16(r1); \787\788li r11, API_NUMBER; \789lv1call; \790\791ld r11, 48+8*8(r1); \792std r4, 0(r11); \793\794ld r0, 16(r1); \795mtlr r0; \796blr797798.text799800/* the lv1 underscored call definitions expand here */801802#define LV1_CALL(name, in, out, num) LV1_##in##_IN_##out##_OUT(lv1_##name, num)803#include <asm/lv1call.h>804805806