diff options
Diffstat (limited to 'arch/powerpc/include/asm/epapr_hcalls.h')
-rw-r--r-- | arch/powerpc/include/asm/epapr_hcalls.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h index 86b0ac79990c..334459ad145b 100644 --- a/arch/powerpc/include/asm/epapr_hcalls.h +++ b/arch/powerpc/include/asm/epapr_hcalls.h | |||
@@ -460,5 +460,116 @@ static inline unsigned int ev_idle(void) | |||
460 | 460 | ||
461 | return r3; | 461 | return r3; |
462 | } | 462 | } |
463 | |||
464 | #ifdef CONFIG_EPAPR_PARAVIRT | ||
465 | static inline unsigned long epapr_hypercall(unsigned long *in, | ||
466 | unsigned long *out, | ||
467 | unsigned long nr) | ||
468 | { | ||
469 | unsigned long register r0 asm("r0"); | ||
470 | unsigned long register r3 asm("r3") = in[0]; | ||
471 | unsigned long register r4 asm("r4") = in[1]; | ||
472 | unsigned long register r5 asm("r5") = in[2]; | ||
473 | unsigned long register r6 asm("r6") = in[3]; | ||
474 | unsigned long register r7 asm("r7") = in[4]; | ||
475 | unsigned long register r8 asm("r8") = in[5]; | ||
476 | unsigned long register r9 asm("r9") = in[6]; | ||
477 | unsigned long register r10 asm("r10") = in[7]; | ||
478 | unsigned long register r11 asm("r11") = nr; | ||
479 | unsigned long register r12 asm("r12"); | ||
480 | |||
481 | asm volatile("bl epapr_hypercall_start" | ||
482 | : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6), | ||
483 | "=r"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11), | ||
484 | "=r"(r12) | ||
485 | : "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "r"(r8), | ||
486 | "r"(r9), "r"(r10), "r"(r11) | ||
487 | : "memory", "cc", "xer", "ctr", "lr"); | ||
488 | |||
489 | out[0] = r4; | ||
490 | out[1] = r5; | ||
491 | out[2] = r6; | ||
492 | out[3] = r7; | ||
493 | out[4] = r8; | ||
494 | out[5] = r9; | ||
495 | out[6] = r10; | ||
496 | out[7] = r11; | ||
497 | |||
498 | return r3; | ||
499 | } | ||
500 | #else | ||
501 | static unsigned long epapr_hypercall(unsigned long *in, | ||
502 | unsigned long *out, | ||
503 | unsigned long nr) | ||
504 | { | ||
505 | return EV_UNIMPLEMENTED; | ||
506 | } | ||
507 | #endif | ||
508 | |||
509 | static inline long epapr_hypercall0_1(unsigned int nr, unsigned long *r2) | ||
510 | { | ||
511 | unsigned long in[8]; | ||
512 | unsigned long out[8]; | ||
513 | unsigned long r; | ||
514 | |||
515 | r = epapr_hypercall(in, out, nr); | ||
516 | *r2 = out[0]; | ||
517 | |||
518 | return r; | ||
519 | } | ||
520 | |||
521 | static inline long epapr_hypercall0(unsigned int nr) | ||
522 | { | ||
523 | unsigned long in[8]; | ||
524 | unsigned long out[8]; | ||
525 | |||
526 | return epapr_hypercall(in, out, nr); | ||
527 | } | ||
528 | |||
529 | static inline long epapr_hypercall1(unsigned int nr, unsigned long p1) | ||
530 | { | ||
531 | unsigned long in[8]; | ||
532 | unsigned long out[8]; | ||
533 | |||
534 | in[0] = p1; | ||
535 | return epapr_hypercall(in, out, nr); | ||
536 | } | ||
537 | |||
538 | static inline long epapr_hypercall2(unsigned int nr, unsigned long p1, | ||
539 | unsigned long p2) | ||
540 | { | ||
541 | unsigned long in[8]; | ||
542 | unsigned long out[8]; | ||
543 | |||
544 | in[0] = p1; | ||
545 | in[1] = p2; | ||
546 | return epapr_hypercall(in, out, nr); | ||
547 | } | ||
548 | |||
549 | static inline long epapr_hypercall3(unsigned int nr, unsigned long p1, | ||
550 | unsigned long p2, unsigned long p3) | ||
551 | { | ||
552 | unsigned long in[8]; | ||
553 | unsigned long out[8]; | ||
554 | |||
555 | in[0] = p1; | ||
556 | in[1] = p2; | ||
557 | in[2] = p3; | ||
558 | return epapr_hypercall(in, out, nr); | ||
559 | } | ||
560 | |||
561 | static inline long epapr_hypercall4(unsigned int nr, unsigned long p1, | ||
562 | unsigned long p2, unsigned long p3, | ||
563 | unsigned long p4) | ||
564 | { | ||
565 | unsigned long in[8]; | ||
566 | unsigned long out[8]; | ||
567 | |||
568 | in[0] = p1; | ||
569 | in[1] = p2; | ||
570 | in[2] = p3; | ||
571 | in[3] = p4; | ||
572 | return epapr_hypercall(in, out, nr); | ||
573 | } | ||
463 | #endif /* !__ASSEMBLY__ */ | 574 | #endif /* !__ASSEMBLY__ */ |
464 | #endif /* _EPAPR_HCALLS_H */ | 575 | #endif /* _EPAPR_HCALLS_H */ |