Lines Matching +full:1 +full:a0
41 * Macro to find first bit set in WINDOWBASE from the left + 1
43 * 100....0 -> 1
45 * 000....1 -> WSBITS
52 addi \bit, \bit, WSBITS - 32 + 1 # uppest bit set -> return 1
72 addi \bit, \bit, -1
111 * a0: trashed, original value saved on stack (PT_AREG0)
123 * a0-a3 and depc have been saved to PT_AREG0...PT_AREG3 and PT_DEPC
135 rsr a0, depc
137 s32i a0, a2, PT_AREG2
173 _bbsi.l a2, 1, 1f
178 _bbsi.l a2, 2, 1f
183 _bbsi.l a2, 3, 1f
188 _bnei a2, 1, 1f # only one valid frame?
195 * We have to save all registers up to the first '1' from
198 * All register frames starting from the top field to the marked '1'
202 1: addi a3, a2, -1 # eliminate '1' in bit 0: yyyyxxww0
203 neg a3, a3 # yyyyxxww0 -> YYYYXXWW1+1
208 ffs_ws a0, a3 # number of frames to the '1' from left
215 slli a3, a0, 4 # number of frames to save in bits 8..4
222 1: rotw -1
223 s32i a0, a5, PT_AREG_END - 16
227 addi a0, a4, -1
229 _bnez a0, 1b
234 movi a3, 1
258 * a0: trashed, original value saved on stack (PT_AREG0)
270 * a0-a3 and depc have been saved to PT_AREG0...PT_AREG3 and PT_DEPC
281 rsr a0, depc # get a2
283 s32i a0, a2, PT_AREG2
311 _bbsi.l a2, 1, 1f
316 _bbsi.l a2, 2, 1f
321 _bbsi.l a2, 3, 1f
327 _bnei a2, 1, 1f
329 /* Copy spill slots of a0 and a1 to imitate movsp
333 l32i a0, a1, PT_SIZE + 4
335 s32e a0, a1, -12
336 1:
337 l32i a0, a1, PT_AREG0 # restore saved a0
338 wsr a0, depc
386 rsr a0, excsave1
388 s32i a3, a0, EXC_TABLE_FIXUP
395 * Set PS(EXCM = 0, UM = 0, RING = 0, OWB = 0, WOE = 1, INTLEVEL = X)
403 * - in case of exception or level-1 interrupt it's in the PS,
407 movi a0, EXCCAUSE_MAPPED_NMI
409 beq a2, a0, .Lmedium_level_irq
411 beqz a3, .Llevel1_irq # level-1 IRQ sets ps.intlevel to 0
414 rsr a0, excsave2
415 s32i a0, a1, PT_PS # save medium-level interrupt ps
422 movi a0, PS_WOE_MASK
423 or a3, a3, a0
426 movi a0, LOCKLEVEL
429 moveqz a3, a0, a2 # a3 = LOCKLEVEL iff interrupt
436 rsr a0, depc
482 1:
517 j 1b
526 j 1b
561 bgei a4, LOCKLEVEL, 1f
563 1:
594 rotw -1 # we restore a4..a7
595 _bltui a6, 16, 1f # only have to restore current window?
597 /* The working registers are a0 and a3. We are restoring to
607 2: rotw -1 # a0..a3 become a4..a7
618 1: rsr a0, windowbase
620 sub a3, a0, a3
624 1: rotw -1
625 addi a3, a7, -1
630 bgei a3, 1, 1b
635 * (if we have restored WSBITS-1 frames).
662 * 'and' WINDOWSTART and WINDOWSTART-1:
664 * (XXXXXX1[0]* - 1) AND XXXXXX1[0]* = XXXXXX0[0]*
674 * We actually have WMASK, so we only have to test if it is 1 or not.
678 _beqi a2, 1, common_exception_exit # Spilled before exception,jump
683 addi a0, a3, -1
684 and a3, a3, a0
687 /* Do a movsp (we returned from a call4, so we have at least a0..a7) */
689 addi a0, a1, -16
690 l32i a3, a0, 0
691 l32i a4, a0, 4
694 l32i a3, a0, 8
695 l32i a4, a0, 12
710 _bbsi.l a2, 1, 1f
715 _bbsi.l a2, 2, 1f
720 _bbsi.l a2, 3, 1f
728 1: l32i a2, a1, PT_PC
752 l32i a0, a1, PT_DEPC
755 _bgeui a0, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
757 /* Restore a0...a3 and return */
759 l32i a0, a1, PT_AREG0
763 1: wsr a0, depc
764 l32i a0, a1, PT_AREG0
775 * When we get here, a0 is trashed and saved to excsave[debuglevel]
782 rsr a0, SREG_EPS + XCHAL_DEBUGLEVEL
783 bbsi.l a0, PS_EXCM_BIT, 1f # exception mode
796 movi a2, 1 << PS_EXCM_BIT
797 or a2, a0, a2
800 /* Switch to kernel/user stack, restore jump vector, and save a0 */
806 l32i a0, a3, DT_DEBUG_SAVE
808 s32i a0, a2, PT_AREG0
809 movi a0, 0
810 s32i a0, a2, PT_DEPC # mark it as a regular exception
812 xsr a0, depc
814 s32i a0, a2, PT_AREG2
825 addi a3, a3, 1
844 1:
845 bbci.l a0, PS_UM_BIT, 1b # jump if kernel mode
847 rsr a0, debugcause
848 bbsi.l a0, DEBUGCAUSE_DBREAK_BIT, .Ldebug_save_dbreak
852 l32i a0, a3, DT_DBREAKC_SAVE + _index * 4
853 wsr a0, SREG_DBREAKC + _index
854 .set _index, _index + 1
857 l32i a0, a3, DT_ICOUNT_LEVEL_SAVE
858 wsr a0, icountlevel
860 l32i a0, a3, DT_ICOUNT_SAVE
861 xsr a0, icount
863 l32i a0, a3, DT_DEBUG_SAVE
870 movi a0, 0
871 xsr a0, SREG_DBREAKC + _index
872 s32i a0, a3, DT_DBREAKC_SAVE + _index * 4
873 .set _index, _index + 1
876 movi a0, XCHAL_EXCM_LEVEL + 1
877 xsr a0, icountlevel
878 s32i a0, a3, DT_ICOUNT_LEVEL_SAVE
880 movi a0, 0xfffffffe
881 xsr a0, icount
882 s32i a0, a3, DT_ICOUNT_SAVE
884 l32i a0, a3, DT_DEBUG_SAVE
889 1: j 1b // FIXME!!
902 * - a0 contains the caller address; original value saved in excsave1.
903 * - the original a0 contains a valid return address (backtrace) or 0.
923 movi a0, 1
926 wsr a0, windowstart
935 movi a0, 0
941 1: j 1b
979 * a0: trashed, original value saved on stack (PT_AREG0)
991 rsr a0, windowbase
992 rotw -1
1006 rotw -1
1008 rotw -1
1024 * a0: trashed, original value saved on stack (PT_AREG0)
1034 rsr a0, ps
1035 bbsi.l a0, PS_WOE_BIT, 1f
1038 or a0, a0, a3
1039 wsr a0, ps
1041 l32i a0, a2, PT_AREG0
1044 1:
1061 * a0: trashed, original value saved on stack (PT_AREG0)
1073 rsr a0, epc1
1074 addi a0, a0, 3
1075 wsr a0, epc1
1077 l32i a0, a2, PT_DEPC
1078 bgeui a0, VALID_DOUBLE_EXCEPTION_ADDRESS, fast_syscall_unrecoverable
1080 rsr a0, depc # get syscall-nr
1081 _beqz a0, fast_syscall_spill_registers
1082 _beqi a0, __NR_xtensa, fast_syscall_xtensa
1092 l32i a0, a2, PT_AREG0 # restore a0
1095 wsr a0, excsave1
1111 * a0: a2 (syscall-nr), original value saved on stack (PT_AREG0)
1113 * a2: new stack pointer, original in a0 and DEPC
1133 access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp
1142 EX(.Leac) l32i a0, a3, 0 # read old value
1143 bne a0, a4, 1f # same as old value? jump
1146 l32i a0, a2, PT_AREG0 # restore a0
1147 movi a2, 1 # and return 1
1150 1: l32i a7, a2, PT_AREG7 # restore a7
1151 l32i a0, a2, PT_AREG0 # restore a0
1159 add a0, a4, a7 # + arg
1160 moveqz a0, a4, a6 # set
1162 EX(.Leac) s32i a0, a3, 0 # write new value
1164 mov a0, a2
1166 l32i a7, a0, PT_AREG7 # restore a7
1167 l32i a0, a0, PT_AREG0 # restore a0
1171 l32i a0, a2, PT_AREG0 # restore a0
1176 l32i a0, a2, PT_AREG0 # restore a0
1186 l32i a0, a2, PT_AREG0 # restore a0
1199 * a0: trashed, original value saved on stack (PT_AREG0)
1216 movi a0, fast_syscall_spill_registers_fixup
1217 s32i a0, a3, EXC_TABLE_FIXUP
1218 rsr a0, windowbase
1219 s32i a0, a3, EXC_TABLE_PARAM
1224 rsr a0, sar
1226 s32i a0, a2, PT_SAR
1243 rsr a0, windowbase
1245 ssr a0 # holds WB
1246 slli a0, a3, WSBITS
1247 or a3, a3, a0 # a3 = xxxwww1yyxxxwww1yy
1252 extui a3, a3, 1, WSBITS-1 # a3 = 0yyxxxwww
1253 movi a0, (1 << (WSBITS-1))
1256 /* We want 1 at the top, so that we return to the current windowbase */
1258 or a3, a3, a0 # 1yyxxxwww
1263 neg a0, a3
1264 and a3, a0, a3 # first bit set from right: 000010000
1266 ffs_ws a0, a3 # a0: shifts to skip empty frames
1268 sub a0, a3, a0 # WSBITS-a0:number of 0-bits from right
1269 ssr a0 # save in SAR for later.
1272 add a3, a3, a0
1288 .Lloop: _bbsi.l a3, 1, .Lc4
1302 _bnei a3, 1, .Lloop
1310 srli a7, a3, 1
1311 rotw 1
1312 _bnei a3, 1, .Lloop
1319 l32e a0, a5, -12
1320 s32e a8, a0, -48
1321 mov a8, a0
1336 * rotw 1
1337 * s32e a0, a13, -16
1342 rotw 1
1344 rotw -1
1353 _beqi a3, 1, .Lexit
1360 rotw 1
1363 movi a3, 1
1371 l32i a0, a2, PT_AREG0
1394 movi a0, 1
1397 wsr a0, windowstart
1401 movi a0, 0
1415 wsr a0, excsave1
1417 1: j 1b
1432 * frame for the current windowbase - 1, we need to rotate a3 left by the
1433 * value of the current windowbase + 1 and move it to windowstart.
1435 * a0: value of depc, original value in depc
1443 xsr a0, depc # restore depc and a0
1446 /* We need to make sure the current registers (a0-a3) are preserved.
1456 slli a3, a3, 1 # shift left by one
1457 addi a3, a3, 1 # set the bit for the current window frame
1463 srli a3, a3, 1
1473 * a0, a1, a2 same
1483 * a0: return address
1495 s32i a0, a2, PT_AREG0
1505 rsr a0, exccause
1506 addx4 a0, a0, a3 # find entry in table
1507 l32i a0, a0, EXC_TABLE_FAST_USER # load handler
1509 jx a0
1547 l32i a0, a2, PT_AREG0 # restore a0
1562 1:
1564 1: j 1b
1577 * a0: trashed, original value saved on stack (PT_AREG0)
1612 l32i a0, a1, TASK_MM # tsk->mm
1613 beqz a0, 9f
1616 _PGD_OFFSET(a0, a3, a1)
1617 l32i a0, a0, 0 # read pmdval
1618 beqz a0, 2f
1635 add a0, a0, a1 # pmdval - PAGE_OFFSET
1636 extui a1, a0, 0, PAGE_SHIFT # ... & PAGE_MASK
1637 xor a0, a0, a1
1640 or a0, a0, a1 # ... | PAGE_DIRECTORY
1647 * 0,1 -> way 7 program (0040.0000) and virtual (c000.0000)
1652 extui a3, a3, 28, 2 # addr. bit 28 and 29 0,1,2,3
1656 extui a3, a3, 2, 2 # -> 0,0,1,2
1661 3: wdtlb a0, a1
1667 movi a0, 0
1668 s32i a0, a3, EXC_TABLE_FIXUP
1672 l32i a0, a2, PT_AREG0
1677 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
1686 1: xsr a2, depc
1690 9: l32i a0, a1, TASK_ACTIVE_MM # unlikely case mm == 0
1691 bnez a0, 8b
1697 movi a0, init_mm
1711 l32i a0, a2, PT_DEPC
1712 bgeui a0, VALID_DOUBLE_EXCEPTION_ADDRESS, 2f
1716 movi a0, __tlbtemp_mapping_start
1718 bltu a3, a0, 2f
1719 movi a0, __tlbtemp_mapping_end
1720 bgeu a3, a0, 2f
1725 rsr a0, excvaddr
1726 bltu a0, a3, 2f
1728 addi a1, a0, -TLBTEMP_SIZE
1740 and a1, a1, a0
1744 bgez a3, 1f
1748 extui a3, a0, PAGE_SHIFT + DCACHE_ALIAS_ORDER, 1
1753 mov a0, a6
1754 movnez a0, a7, a3
1759 1: witlb a6, a1
1774 bbsi.l a2, PS_UM_BIT, 1f
1776 1: call0 _user_exception
1787 * a0: trashed, original value saved on stack (PT_AREG0)
1806 l32i a0, a1, TASK_MM # tsk->mm
1807 beqz a0, 9f
1810 _PGD_OFFSET(a0, a1, a3)
1811 l32i a0, a0, 0
1812 beqz a0, 2f
1819 _PTE_OFFSET(a0, a1, a3)
1820 l32i a3, a0, 0 # read pteval
1828 s32i a3, a0, 0
1832 dhwb a0, 0
1834 pdtlb a0, a1
1835 wdtlb a3, a0
1839 movi a0, 0
1841 s32i a0, a3, EXC_TABLE_FIXUP
1847 l32i a0, a2, PT_AREG0
1850 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
1857 1: xsr a2, depc
1861 9: l32i a0, a1, TASK_ACTIVE_MM # unlikely case mm == 0
1871 bbsi.l a2, PS_UM_BIT, 1f
1873 1: call0 _user_exception
1901 beqz a3, 1f
1908 1:
1914 bgeu a7, a5, 1f
1930 1: /* regs->areg[2] = return_value */
1933 bnez a3, 1f
1937 1:
1954 call12 1f
1958 1:
1960 addi a12, a0, 3
1964 mov a12, a0
2002 s32i a0, a10, THREAD_RA - TASK_THREAD # save return address
2005 s32i a0, a2, THREAD_RA # save return address
2050 l32i a0, a11, THREAD_RA # restore return address