/* SPDX-License-Identifier: GPL-2.0-or-later */12/* TOC (Transfer of Control) handler. */34.level 1.156#include <asm/assembly.h>7#include <linux/threads.h>8#include <linux/linkage.h>910.text11.import toc_intr,code12.import toc_stack,data13.align 1614ENTRY_CFI(toc_handler)15load32 PA(toc_stack),%sp1617#ifdef CONFIG_SMP18/* get per-cpu toc_stack address. */19mfctl %cr30, %r120tophys %r1,%r2 /* task_struct */21LDREG TASK_TI_CPU(%r2),%r4 /* cpu */22load32 PA(__per_cpu_offset),%r123LDREGX %r4(%r1),%r424add %r4,%sp,%sp25#endif2627/*28* setup pt_regs on stack and save the29* floating point registers. PIM_TOC doesn't30* save fp registers, so we're doing it here.31*/32copy %sp,%arg033ldo PT_SZ_ALGN(%sp), %sp3435/* clear pt_regs */36copy %arg0,%r1370: cmpb,<<,n %r1,%sp,0b38stw,ma %r0,4(%r1)3940ldo PT_FR0(%arg0),%r2541save_fp %r254243/* go virtual */44load32 PA(swapper_pg_dir),%r445mtctl %r4,%cr2446mtctl %r4,%cr254748/* Clear sr4-sr7 */49mtsp %r0, %sr450mtsp %r0, %sr551mtsp %r0, %sr652mtsp %r0, %sr75354tovirt_r1 %sp55tovirt_r1 %arg056virt_map5758loadgp5960#ifdef CONFIG_64BIT61ldo -16(%sp),%r2962#endif63load32 toc_intr,%r164be 0(%sr7,%r1)65nop66ENDPROC_CFI(toc_handler)6768/*69* keep this checksum here, as it is part of the toc_handler70* spanned by toc_handler_size (all words in toc_handler are71* added in PDC and the sum must equal to zero.72*/73SYM_DATA(toc_handler_csum, .long 0)74SYM_DATA(toc_handler_size, .long . - toc_handler)757677