|  | /* | 
|  | * Copyright (c) 2016 IBM Corporation. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public License | 
|  | * as published by the Free Software Foundation; either version | 
|  | * 2 of the License, or (at your option) any later version. | 
|  | */ | 
|  |  | 
|  | #include "ppc_asm.h" | 
|  | #include "../include/asm/opal-api.h" | 
|  |  | 
|  | .text | 
|  |  | 
|  | .globl opal_kentry | 
|  | opal_kentry: | 
|  | /* r3 is the fdt ptr */ | 
|  | mtctr r4 | 
|  | li	r4, 0 | 
|  | li	r5, 0 | 
|  | li	r6, 0 | 
|  | li	r7, 0 | 
|  | ld	r11,opal@got(r2) | 
|  | ld	r8,0(r11) | 
|  | ld	r9,8(r11) | 
|  | bctr | 
|  |  | 
|  | #define OPAL_CALL(name, token)				\ | 
|  | .globl name;					\ | 
|  | name:							\ | 
|  | li	r0, token;				\ | 
|  | b	opal_call; | 
|  |  | 
|  | opal_call: | 
|  | mflr	r11 | 
|  | std	r11,16(r1) | 
|  | mfcr	r12 | 
|  | stw	r12,8(r1) | 
|  | mr	r13,r2 | 
|  |  | 
|  | /* Set opal return address */ | 
|  | ld	r11,opal_return@got(r2) | 
|  | mtlr	r11 | 
|  | mfmsr	r12 | 
|  |  | 
|  | /* switch to BE when we enter OPAL */ | 
|  | li	r11,MSR_LE | 
|  | andc	r12,r12,r11 | 
|  | mtspr	SPRN_HSRR1,r12 | 
|  |  | 
|  | /* load the opal call entry point and base */ | 
|  | ld	r11,opal@got(r2) | 
|  | ld	r12,8(r11) | 
|  | ld	r2,0(r11) | 
|  | mtspr	SPRN_HSRR0,r12 | 
|  | hrfid | 
|  |  | 
|  | opal_return: | 
|  | FIXUP_ENDIAN | 
|  | mr	r2,r13; | 
|  | lwz	r11,8(r1); | 
|  | ld	r12,16(r1) | 
|  | mtcr	r11; | 
|  | mtlr	r12 | 
|  | blr | 
|  |  | 
|  | OPAL_CALL(opal_console_write,			OPAL_CONSOLE_WRITE); | 
|  | OPAL_CALL(opal_console_read,			OPAL_CONSOLE_READ); | 
|  | OPAL_CALL(opal_console_write_buffer_space,	OPAL_CONSOLE_WRITE_BUFFER_SPACE); | 
|  | OPAL_CALL(opal_poll_events,			OPAL_POLL_EVENTS); | 
|  | OPAL_CALL(opal_console_flush,			OPAL_CONSOLE_FLUSH); |