188278ca27a43ae503572b52ea2c171fbf45db5a2Adrian Bunk/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * winmacro.h: Window loading-unloading macros. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _SPARC_WINMACRO_H 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _SPARC_WINMACRO_H 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/ptrace.h> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Store the register window onto the 8-byte aligned area starting 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * at %reg. It might be %sp, it might not, we don't care. 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_WINDOW(reg) \ 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %l0, [%reg + RW_L0]; \ 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %l2, [%reg + RW_L2]; \ 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %l4, [%reg + RW_L4]; \ 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %l6, [%reg + RW_L6]; \ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i0, [%reg + RW_I0]; \ 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i2, [%reg + RW_I2]; \ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i4, [%reg + RW_I4]; \ 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i6, [%reg + RW_I6]; 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Load a register window from the area beginning at %reg. */ 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_WINDOW(reg) \ 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_L0], %l0; \ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_L2], %l2; \ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_L4], %l4; \ 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_L6], %l6; \ 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_I0], %i0; \ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_I2], %i2; \ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_I4], %i4; \ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%reg + RW_I6], %i6; 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Loading and storing struct pt_reg trap frames. */ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_PT_INS(base_reg) \ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_I0], %i0; \ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_I2], %i2; \ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_I4], %i4; \ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_I6], %i6; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_PT_GLOBALS(base_reg) \ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%base_reg + STACKFRAME_SZ + PT_G1], %g1; \ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_G2], %g2; \ 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_G4], %g4; \ 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldd [%base_reg + STACKFRAME_SZ + PT_G6], %g6; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_PT_YREG(base_reg, scratch) \ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%base_reg + STACKFRAME_SZ + PT_Y], %scratch; \ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wr %scratch, 0x0, %y; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_PT_PRIV(base_reg, pt_psr, pt_pc, pt_npc) \ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%base_reg + STACKFRAME_SZ + PT_PSR], %pt_psr; \ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%base_reg + STACKFRAME_SZ + PT_PC], %pt_pc; \ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%base_reg + STACKFRAME_SZ + PT_NPC], %pt_npc; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_PT_ALL(base_reg, pt_psr, pt_pc, pt_npc, scratch) \ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOAD_PT_YREG(base_reg, scratch) \ 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOAD_PT_INS(base_reg) \ 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOAD_PT_GLOBALS(base_reg) \ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOAD_PT_PRIV(base_reg, pt_psr, pt_pc, pt_npc) 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_PT_INS(base_reg) \ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i0, [%base_reg + STACKFRAME_SZ + PT_I0]; \ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i2, [%base_reg + STACKFRAME_SZ + PT_I2]; \ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i4, [%base_reg + STACKFRAME_SZ + PT_I4]; \ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %i6, [%base_reg + STACKFRAME_SZ + PT_I6]; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_PT_GLOBALS(base_reg) \ 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %g1, [%base_reg + STACKFRAME_SZ + PT_G1]; \ 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %g2, [%base_reg + STACKFRAME_SZ + PT_G2]; \ 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %g4, [%base_reg + STACKFRAME_SZ + PT_G4]; \ 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds std %g6, [%base_reg + STACKFRAME_SZ + PT_G6]; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_PT_YREG(base_reg, scratch) \ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rd %y, %scratch; \ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %scratch, [%base_reg + STACKFRAME_SZ + PT_Y]; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_PT_PRIV(base_reg, pt_psr, pt_pc, pt_npc) \ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %pt_psr, [%base_reg + STACKFRAME_SZ + PT_PSR]; \ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %pt_pc, [%base_reg + STACKFRAME_SZ + PT_PC]; \ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %pt_npc, [%base_reg + STACKFRAME_SZ + PT_NPC]; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STORE_PT_ALL(base_reg, reg_psr, reg_pc, reg_npc, g_scratch) \ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds STORE_PT_PRIV(base_reg, reg_psr, reg_pc, reg_npc) \ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds STORE_PT_GLOBALS(base_reg) \ 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds STORE_PT_YREG(base_reg, g_scratch) \ 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds STORE_PT_INS(base_reg) 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAVE_BOLIXED_USER_STACK(cur_reg, scratch) \ 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%cur_reg + TI_W_SAVED], %scratch; \ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sll %scratch, 2, %scratch; \ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds add %scratch, %cur_reg, %scratch; \ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %sp, [%scratch + TI_RWIN_SPTRS]; \ 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sub %scratch, %cur_reg, %scratch; \ 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sll %scratch, 4, %scratch; \ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds add %scratch, %cur_reg, %scratch; \ 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds STORE_WINDOW(scratch + TI_REG_WINDOW); \ 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sub %scratch, %cur_reg, %scratch; \ 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srl %scratch, 6, %scratch; \ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds add %scratch, 1, %scratch; \ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds st %scratch, [%cur_reg + TI_W_SAVED]; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SMP 1065149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom/* Results of LOAD_CURRENT() after BTFIXUP for SUN4M, SUN4D & LEON (comments) */ 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_CURRENT4M(dest_reg, idreg) \ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rd %tbr, %idreg; \ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(current_set), %dest_reg; \ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srl %idreg, 10, %idreg; \ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds or %dest_reg, %lo(current_set), %dest_reg; \ 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds and %idreg, 0xc, %idreg; \ 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%idreg + %dest_reg], %dest_reg; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_CURRENT4D(dest_reg, idreg) \ 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds lda [%g0] ASI_M_VIKING_TMP1, %idreg; \ 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(C_LABEL(current_set)), %dest_reg; \ 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sll %idreg, 2, %idreg; \ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds or %dest_reg, %lo(C_LABEL(current_set)), %dest_reg; \ 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%idreg + %dest_reg], %dest_reg; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1225149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom#define LOAD_CURRENT_LEON(dest_reg, idreg) \ 1235149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom rd %asr17, %idreg; \ 1245149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom sethi %hi(current_set), %dest_reg; \ 1255149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom srl %idreg, 0x1c, %idreg; \ 1265149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom or %dest_reg, %lo(current_set), %dest_reg; \ 1275149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom sll %idreg, 0x2, %idreg; \ 1285149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom ld [%idreg + %dest_reg], %dest_reg; 1295149bed8912f4030f52feb33326cfe794831b184Daniel Hellstrom 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Blackbox - take care with this... - check smp4m and smp4d before changing this. */ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_CURRENT(dest_reg, idreg) \ 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(___b_load_current), %idreg; \ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(current_set), %dest_reg; \ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(boot_cpu_id4), %idreg; \ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds or %dest_reg, %lo(current_set), %dest_reg; \ 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ldub [%idreg + %lo(boot_cpu_id4)], %idreg; \ 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%idreg + %dest_reg], %dest_reg; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOAD_CURRENT(dest_reg, idreg) \ 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sethi %hi(current_set), %idreg; \ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ld [%idreg + %lo(current_set)], %dest_reg; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !(_SPARC_WINMACRO_H) */ 145