1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds/* 31da177e4SLinus Torvalds * Here is where the ball gets rolling as far as the kernel is concerned. 41da177e4SLinus Torvalds * When control is transferred to _start, the bootload has already 51da177e4SLinus Torvalds * loaded us to the correct address. All that's left to do here is 61da177e4SLinus Torvalds * to set up the kernel's global pointer and jump to the kernel 71da177e4SLinus Torvalds * entry point. 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * Copyright (C) 1998-2001, 2003, 2005 Hewlett-Packard Co 101da177e4SLinus Torvalds * David Mosberger-Tang <davidm@hpl.hp.com> 111da177e4SLinus Torvalds * Stephane Eranian <eranian@hpl.hp.com> 121da177e4SLinus Torvalds * Copyright (C) 1999 VA Linux Systems 131da177e4SLinus Torvalds * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 141da177e4SLinus Torvalds * Copyright (C) 1999 Intel Corp. 151da177e4SLinus Torvalds * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com> 161da177e4SLinus Torvalds * Copyright (C) 1999 Don Dugger <Don.Dugger@intel.com> 171da177e4SLinus Torvalds * Copyright (C) 2002 Fenghua Yu <fenghua.yu@intel.com> 181da177e4SLinus Torvalds * -Optimize __ia64_save_fpu() and __ia64_load_fpu() for Itanium 2. 19b8d8b883SAshok Raj * Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com> 20b8d8b883SAshok Raj * Support for CPU Hotplug 211da177e4SLinus Torvalds */ 221da177e4SLinus Torvalds 23*ab03e604SMasahiro Yamada#include <linux/export.h> 2465fddcfcSMike Rapoport#include <linux/pgtable.h> 251da177e4SLinus Torvalds#include <asm/asmmacro.h> 261da177e4SLinus Torvalds#include <asm/fpu.h> 271da177e4SLinus Torvalds#include <asm/kregs.h> 281da177e4SLinus Torvalds#include <asm/mmu_context.h> 2939e01cb8SSam Ravnborg#include <asm/asm-offsets.h> 301da177e4SLinus Torvalds#include <asm/pal.h> 311da177e4SLinus Torvalds#include <asm/processor.h> 321da177e4SLinus Torvalds#include <asm/ptrace.h> 33b8d8b883SAshok Raj#include <asm/mca_asm.h> 343e0879deSIsaku Yamahata#include <linux/init.h> 353e0879deSIsaku Yamahata#include <linux/linkage.h> 36b8d8b883SAshok Raj 37b8d8b883SAshok Raj#ifdef CONFIG_HOTPLUG_CPU 38b8d8b883SAshok Raj#define SAL_PSR_BITS_TO_SET \ 39b8d8b883SAshok Raj (IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_MFH | IA64_PSR_MFL) 40b8d8b883SAshok Raj 41b8d8b883SAshok Raj#define SAVE_FROM_REG(src, ptr, dest) \ 42b8d8b883SAshok Raj mov dest=src;; \ 43b8d8b883SAshok Raj st8 [ptr]=dest,0x08 44b8d8b883SAshok Raj 45b8d8b883SAshok Raj#define RESTORE_REG(reg, ptr, _tmp) \ 46b8d8b883SAshok Raj ld8 _tmp=[ptr],0x08;; \ 47b8d8b883SAshok Raj mov reg=_tmp 48b8d8b883SAshok Raj 49b8d8b883SAshok Raj#define SAVE_BREAK_REGS(ptr, _idx, _breg, _dest)\ 50b8d8b883SAshok Raj mov ar.lc=IA64_NUM_DBG_REGS-1;; \ 51b8d8b883SAshok Raj mov _idx=0;; \ 52b8d8b883SAshok Raj1: \ 53b8d8b883SAshok Raj SAVE_FROM_REG(_breg[_idx], ptr, _dest);; \ 54b8d8b883SAshok Raj add _idx=1,_idx;; \ 55b8d8b883SAshok Raj br.cloop.sptk.many 1b 56b8d8b883SAshok Raj 57b8d8b883SAshok Raj#define RESTORE_BREAK_REGS(ptr, _idx, _breg, _tmp, _lbl)\ 58b8d8b883SAshok Raj mov ar.lc=IA64_NUM_DBG_REGS-1;; \ 59b8d8b883SAshok Raj mov _idx=0;; \ 60b8d8b883SAshok Raj_lbl: RESTORE_REG(_breg[_idx], ptr, _tmp);; \ 61b8d8b883SAshok Raj add _idx=1, _idx;; \ 62b8d8b883SAshok Raj br.cloop.sptk.many _lbl 63b8d8b883SAshok Raj 64b8d8b883SAshok Raj#define SAVE_ONE_RR(num, _reg, _tmp) \ 65b8d8b883SAshok Raj movl _tmp=(num<<61);; \ 66b8d8b883SAshok Raj mov _reg=rr[_tmp] 67b8d8b883SAshok Raj 68b8d8b883SAshok Raj#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \ 69b8d8b883SAshok Raj SAVE_ONE_RR(0,_r0, _tmp);; \ 70b8d8b883SAshok Raj SAVE_ONE_RR(1,_r1, _tmp);; \ 71b8d8b883SAshok Raj SAVE_ONE_RR(2,_r2, _tmp);; \ 72b8d8b883SAshok Raj SAVE_ONE_RR(3,_r3, _tmp);; \ 73b8d8b883SAshok Raj SAVE_ONE_RR(4,_r4, _tmp);; \ 74b8d8b883SAshok Raj SAVE_ONE_RR(5,_r5, _tmp);; \ 75b8d8b883SAshok Raj SAVE_ONE_RR(6,_r6, _tmp);; \ 76b8d8b883SAshok Raj SAVE_ONE_RR(7,_r7, _tmp);; 77b8d8b883SAshok Raj 78b8d8b883SAshok Raj#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \ 79b8d8b883SAshok Raj st8 [ptr]=_r0, 8;; \ 80b8d8b883SAshok Raj st8 [ptr]=_r1, 8;; \ 81b8d8b883SAshok Raj st8 [ptr]=_r2, 8;; \ 82b8d8b883SAshok Raj st8 [ptr]=_r3, 8;; \ 83b8d8b883SAshok Raj st8 [ptr]=_r4, 8;; \ 84b8d8b883SAshok Raj st8 [ptr]=_r5, 8;; \ 85b8d8b883SAshok Raj st8 [ptr]=_r6, 8;; \ 86b8d8b883SAshok Raj st8 [ptr]=_r7, 8;; 87b8d8b883SAshok Raj 88b8d8b883SAshok Raj#define RESTORE_REGION_REGS(ptr, _idx1, _idx2, _tmp) \ 89b8d8b883SAshok Raj mov ar.lc=0x08-1;; \ 90b8d8b883SAshok Raj movl _idx1=0x00;; \ 91b8d8b883SAshok RajRestRR: \ 92b8d8b883SAshok Raj dep.z _idx2=_idx1,61,3;; \ 93b8d8b883SAshok Raj ld8 _tmp=[ptr],8;; \ 94b8d8b883SAshok Raj mov rr[_idx2]=_tmp;; \ 95b8d8b883SAshok Raj srlz.d;; \ 96b8d8b883SAshok Raj add _idx1=1,_idx1;; \ 97b8d8b883SAshok Raj br.cloop.sptk.few RestRR 98b8d8b883SAshok Raj 99df6c6804SAshok Raj#define SET_AREA_FOR_BOOTING_CPU(reg1, reg2) \ 100df6c6804SAshok Raj movl reg1=sal_state_for_booting_cpu;; \ 101df6c6804SAshok Raj ld8 reg2=[reg1];; 102df6c6804SAshok Raj 103b8d8b883SAshok Raj/* 104b8d8b883SAshok Raj * Adjust region registers saved before starting to save 105b8d8b883SAshok Raj * break regs and rest of the states that need to be preserved. 106b8d8b883SAshok Raj */ 107b8d8b883SAshok Raj#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(_reg1,_reg2,_pred) \ 108b8d8b883SAshok Raj SAVE_FROM_REG(b0,_reg1,_reg2);; \ 109b8d8b883SAshok Raj SAVE_FROM_REG(b1,_reg1,_reg2);; \ 110b8d8b883SAshok Raj SAVE_FROM_REG(b2,_reg1,_reg2);; \ 111b8d8b883SAshok Raj SAVE_FROM_REG(b3,_reg1,_reg2);; \ 112b8d8b883SAshok Raj SAVE_FROM_REG(b4,_reg1,_reg2);; \ 113b8d8b883SAshok Raj SAVE_FROM_REG(b5,_reg1,_reg2);; \ 114b8d8b883SAshok Raj st8 [_reg1]=r1,0x08;; \ 115b8d8b883SAshok Raj st8 [_reg1]=r12,0x08;; \ 116b8d8b883SAshok Raj st8 [_reg1]=r13,0x08;; \ 117b8d8b883SAshok Raj SAVE_FROM_REG(ar.fpsr,_reg1,_reg2);; \ 118b8d8b883SAshok Raj SAVE_FROM_REG(ar.pfs,_reg1,_reg2);; \ 119b8d8b883SAshok Raj SAVE_FROM_REG(ar.rnat,_reg1,_reg2);; \ 120b8d8b883SAshok Raj SAVE_FROM_REG(ar.unat,_reg1,_reg2);; \ 121b8d8b883SAshok Raj SAVE_FROM_REG(ar.bspstore,_reg1,_reg2);; \ 122b8d8b883SAshok Raj SAVE_FROM_REG(cr.dcr,_reg1,_reg2);; \ 123b8d8b883SAshok Raj SAVE_FROM_REG(cr.iva,_reg1,_reg2);; \ 124b8d8b883SAshok Raj SAVE_FROM_REG(cr.pta,_reg1,_reg2);; \ 125b8d8b883SAshok Raj SAVE_FROM_REG(cr.itv,_reg1,_reg2);; \ 126b8d8b883SAshok Raj SAVE_FROM_REG(cr.pmv,_reg1,_reg2);; \ 127b8d8b883SAshok Raj SAVE_FROM_REG(cr.cmcv,_reg1,_reg2);; \ 128b8d8b883SAshok Raj SAVE_FROM_REG(cr.lrr0,_reg1,_reg2);; \ 129b8d8b883SAshok Raj SAVE_FROM_REG(cr.lrr1,_reg1,_reg2);; \ 130b8d8b883SAshok Raj st8 [_reg1]=r4,0x08;; \ 131b8d8b883SAshok Raj st8 [_reg1]=r5,0x08;; \ 132b8d8b883SAshok Raj st8 [_reg1]=r6,0x08;; \ 133b8d8b883SAshok Raj st8 [_reg1]=r7,0x08;; \ 134b8d8b883SAshok Raj st8 [_reg1]=_pred,0x08;; \ 135b8d8b883SAshok Raj SAVE_FROM_REG(ar.lc, _reg1, _reg2);; \ 136b8d8b883SAshok Raj stf.spill.nta [_reg1]=f2,16;; \ 137b8d8b883SAshok Raj stf.spill.nta [_reg1]=f3,16;; \ 138b8d8b883SAshok Raj stf.spill.nta [_reg1]=f4,16;; \ 139b8d8b883SAshok Raj stf.spill.nta [_reg1]=f5,16;; \ 140b8d8b883SAshok Raj stf.spill.nta [_reg1]=f16,16;; \ 141b8d8b883SAshok Raj stf.spill.nta [_reg1]=f17,16;; \ 142b8d8b883SAshok Raj stf.spill.nta [_reg1]=f18,16;; \ 143b8d8b883SAshok Raj stf.spill.nta [_reg1]=f19,16;; \ 144b8d8b883SAshok Raj stf.spill.nta [_reg1]=f20,16;; \ 145b8d8b883SAshok Raj stf.spill.nta [_reg1]=f21,16;; \ 146b8d8b883SAshok Raj stf.spill.nta [_reg1]=f22,16;; \ 147b8d8b883SAshok Raj stf.spill.nta [_reg1]=f23,16;; \ 148b8d8b883SAshok Raj stf.spill.nta [_reg1]=f24,16;; \ 149b8d8b883SAshok Raj stf.spill.nta [_reg1]=f25,16;; \ 150b8d8b883SAshok Raj stf.spill.nta [_reg1]=f26,16;; \ 151b8d8b883SAshok Raj stf.spill.nta [_reg1]=f27,16;; \ 152b8d8b883SAshok Raj stf.spill.nta [_reg1]=f28,16;; \ 153b8d8b883SAshok Raj stf.spill.nta [_reg1]=f29,16;; \ 154b8d8b883SAshok Raj stf.spill.nta [_reg1]=f30,16;; \ 155b8d8b883SAshok Raj stf.spill.nta [_reg1]=f31,16;; 156b8d8b883SAshok Raj 157b8d8b883SAshok Raj#else 158df6c6804SAshok Raj#define SET_AREA_FOR_BOOTING_CPU(a1, a2) 159df6c6804SAshok Raj#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(a1,a2, a3) 160b8d8b883SAshok Raj#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) 161b8d8b883SAshok Raj#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) 162b8d8b883SAshok Raj#endif 163b8d8b883SAshok Raj 164b8d8b883SAshok Raj#define SET_ONE_RR(num, pgsize, _tmp1, _tmp2, vhpt) \ 165b8d8b883SAshok Raj movl _tmp1=(num << 61);; \ 166b8d8b883SAshok Raj mov _tmp2=((ia64_rid(IA64_REGION_ID_KERNEL, (num<<61)) << 8) | (pgsize << 2) | vhpt);; \ 167b8d8b883SAshok Raj mov rr[_tmp1]=_tmp2 1681da177e4SLinus Torvalds 169ed7af3e6SNelson Elhage __PAGE_ALIGNED_DATA 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds .global empty_zero_page 1727d59313fSMasahiro YamadaEXPORT_SYMBOL_GPL(empty_zero_page) 1731da177e4SLinus Torvaldsempty_zero_page: 1741da177e4SLinus Torvalds .skip PAGE_SIZE 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds .global swapper_pg_dir 1771da177e4SLinus Torvaldsswapper_pg_dir: 1781da177e4SLinus Torvalds .skip PAGE_SIZE 1791da177e4SLinus Torvalds 1801da177e4SLinus Torvalds .rodata 1811da177e4SLinus Torvaldshalt_msg: 1821da177e4SLinus Torvalds stringz "Halting kernel\n" 1831da177e4SLinus Torvalds 184f172468aSTim Abbott __REF 1851da177e4SLinus Torvalds 1861da177e4SLinus Torvalds .global start_ap 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds /* 1891da177e4SLinus Torvalds * Start the kernel. When the bootloader passes control to _start(), r28 1901da177e4SLinus Torvalds * points to the address of the boot parameter area. Execution reaches 1911da177e4SLinus Torvalds * here in physical mode. 1921da177e4SLinus Torvalds */ 1931da177e4SLinus TorvaldsGLOBAL_ENTRY(_start) 1941da177e4SLinus Torvaldsstart_ap: 1951da177e4SLinus Torvalds .prologue 1961da177e4SLinus Torvalds .save rp, r0 // terminate unwind chain with a NULL rp 1971da177e4SLinus Torvalds .body 1981da177e4SLinus Torvalds 1991da177e4SLinus Torvalds rsm psr.i | psr.ic 2001da177e4SLinus Torvalds ;; 2011da177e4SLinus Torvalds srlz.i 2021da177e4SLinus Torvalds ;; 2031c7d6707SJack Steiner { 2041c7d6707SJack Steiner flushrs // must be first insn in group 2051c7d6707SJack Steiner srlz.i 2061c7d6707SJack Steiner } 2071c7d6707SJack Steiner ;; 2081da177e4SLinus Torvalds /* 209b8d8b883SAshok Raj * Save the region registers, predicate before they get clobbered 210b8d8b883SAshok Raj */ 211b8d8b883SAshok Raj SAVE_REGION_REGS(r2, r8,r9,r10,r11,r12,r13,r14,r15); 212b8d8b883SAshok Raj mov r25=pr;; 213b8d8b883SAshok Raj 214b8d8b883SAshok Raj /* 2151da177e4SLinus Torvalds * Initialize kernel region registers: 2161da177e4SLinus Torvalds * rr[0]: VHPT enabled, page size = PAGE_SHIFT 2171da177e4SLinus Torvalds * rr[1]: VHPT enabled, page size = PAGE_SHIFT 2181da177e4SLinus Torvalds * rr[2]: VHPT enabled, page size = PAGE_SHIFT 2191da177e4SLinus Torvalds * rr[3]: VHPT enabled, page size = PAGE_SHIFT 2201da177e4SLinus Torvalds * rr[4]: VHPT enabled, page size = PAGE_SHIFT 2211da177e4SLinus Torvalds * rr[5]: VHPT enabled, page size = PAGE_SHIFT 2221da177e4SLinus Torvalds * rr[6]: VHPT disabled, page size = IA64_GRANULE_SHIFT 2231da177e4SLinus Torvalds * rr[7]: VHPT disabled, page size = IA64_GRANULE_SHIFT 2241da177e4SLinus Torvalds * We initialize all of them to prevent inadvertently assuming 2251da177e4SLinus Torvalds * something about the state of address translation early in boot. 2261da177e4SLinus Torvalds */ 227b8d8b883SAshok Raj SET_ONE_RR(0, PAGE_SHIFT, r2, r16, 1);; 228b8d8b883SAshok Raj SET_ONE_RR(1, PAGE_SHIFT, r2, r16, 1);; 229b8d8b883SAshok Raj SET_ONE_RR(2, PAGE_SHIFT, r2, r16, 1);; 230b8d8b883SAshok Raj SET_ONE_RR(3, PAGE_SHIFT, r2, r16, 1);; 231b8d8b883SAshok Raj SET_ONE_RR(4, PAGE_SHIFT, r2, r16, 1);; 232b8d8b883SAshok Raj SET_ONE_RR(5, PAGE_SHIFT, r2, r16, 1);; 233b8d8b883SAshok Raj SET_ONE_RR(6, IA64_GRANULE_SHIFT, r2, r16, 0);; 234b8d8b883SAshok Raj SET_ONE_RR(7, IA64_GRANULE_SHIFT, r2, r16, 0);; 2351da177e4SLinus Torvalds /* 2361da177e4SLinus Torvalds * Now pin mappings into the TLB for kernel text and data 2371da177e4SLinus Torvalds */ 2381da177e4SLinus Torvalds mov r18=KERNEL_TR_PAGE_SHIFT<<2 2391da177e4SLinus Torvalds movl r17=KERNEL_START 2401da177e4SLinus Torvalds ;; 2411da177e4SLinus Torvalds mov cr.itir=r18 2421da177e4SLinus Torvalds mov cr.ifa=r17 2431da177e4SLinus Torvalds mov r16=IA64_TR_KERNEL 2441da177e4SLinus Torvalds mov r3=ip 2451da177e4SLinus Torvalds movl r18=PAGE_KERNEL 2461da177e4SLinus Torvalds ;; 2471da177e4SLinus Torvalds dep r2=0,r3,0,KERNEL_TR_PAGE_SHIFT 2481da177e4SLinus Torvalds ;; 2491da177e4SLinus Torvalds or r18=r2,r18 2501da177e4SLinus Torvalds ;; 2511da177e4SLinus Torvalds srlz.i 2521da177e4SLinus Torvalds ;; 2531da177e4SLinus Torvalds itr.i itr[r16]=r18 2541da177e4SLinus Torvalds ;; 2551da177e4SLinus Torvalds itr.d dtr[r16]=r18 2561da177e4SLinus Torvalds ;; 2571da177e4SLinus Torvalds srlz.i 2581da177e4SLinus Torvalds 2591da177e4SLinus Torvalds /* 2601da177e4SLinus Torvalds * Switch into virtual mode: 2611da177e4SLinus Torvalds */ 2621da177e4SLinus Torvalds movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ 263c0b5a64dSTony Luck |IA64_PSR_DI) 2641da177e4SLinus Torvalds ;; 2651da177e4SLinus Torvalds mov cr.ipsr=r16 2661da177e4SLinus Torvalds movl r17=1f 2671da177e4SLinus Torvalds ;; 2681da177e4SLinus Torvalds mov cr.iip=r17 2691da177e4SLinus Torvalds mov cr.ifs=r0 2701da177e4SLinus Torvalds ;; 2711da177e4SLinus Torvalds rfi 2721da177e4SLinus Torvalds ;; 2731da177e4SLinus Torvalds1: // now we are in virtual mode 2741da177e4SLinus Torvalds 275df6c6804SAshok Raj SET_AREA_FOR_BOOTING_CPU(r2, r16); 276b8d8b883SAshok Raj 277b8d8b883SAshok Raj STORE_REGION_REGS(r16, r8,r9,r10,r11,r12,r13,r14,r15); 278b8d8b883SAshok Raj SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(r16,r17,r25) 279b8d8b883SAshok Raj ;; 280b8d8b883SAshok Raj 2811da177e4SLinus Torvalds // set IVT entry point---can't access I/O ports without it 2821da177e4SLinus Torvalds movl r3=ia64_ivt 2831da177e4SLinus Torvalds ;; 2841da177e4SLinus Torvalds mov cr.iva=r3 2851da177e4SLinus Torvalds movl r2=FPSR_DEFAULT 2861da177e4SLinus Torvalds ;; 2871da177e4SLinus Torvalds srlz.i 2881da177e4SLinus Torvalds movl gp=__gp 2891da177e4SLinus Torvalds 2901da177e4SLinus Torvalds mov ar.fpsr=r2 2911da177e4SLinus Torvalds ;; 2921da177e4SLinus Torvalds 2931da177e4SLinus Torvalds#define isAP p2 // are we an Application Processor? 2941da177e4SLinus Torvalds#define isBP p3 // are we the Bootstrap Processor? 2951da177e4SLinus Torvalds 2961da177e4SLinus Torvalds#ifdef CONFIG_SMP 2971da177e4SLinus Torvalds /* 2981da177e4SLinus Torvalds * Find the init_task for the currently booting CPU. At poweron, and in 2991da177e4SLinus Torvalds * UP mode, task_for_booting_cpu is NULL. 3001da177e4SLinus Torvalds */ 3011da177e4SLinus Torvalds movl r3=task_for_booting_cpu 3021da177e4SLinus Torvalds ;; 3031da177e4SLinus Torvalds ld8 r3=[r3] 3041da177e4SLinus Torvalds movl r2=init_task 3051da177e4SLinus Torvalds ;; 3061da177e4SLinus Torvalds cmp.eq isBP,isAP=r3,r0 3071da177e4SLinus Torvalds ;; 3081da177e4SLinus Torvalds(isAP) mov r2=r3 3091da177e4SLinus Torvalds#else 3101da177e4SLinus Torvalds movl r2=init_task 3111da177e4SLinus Torvalds cmp.eq isBP,isAP=r0,r0 3121da177e4SLinus Torvalds#endif 3131da177e4SLinus Torvalds ;; 3141da177e4SLinus Torvalds tpa r3=r2 // r3 == phys addr of task struct 3151da177e4SLinus Torvalds mov r16=-1 3161da177e4SLinus Torvalds(isBP) br.cond.dpnt .load_current // BP stack is on region 5 --- no need to map it 3171da177e4SLinus Torvalds 3181da177e4SLinus Torvalds // load mapping for stack (virtaddr in r2, physaddr in r3) 3191da177e4SLinus Torvalds rsm psr.ic 3201da177e4SLinus Torvalds movl r17=PAGE_KERNEL 3211da177e4SLinus Torvalds ;; 3221da177e4SLinus Torvalds srlz.d 3231da177e4SLinus Torvalds dep r18=0,r3,0,12 3241da177e4SLinus Torvalds ;; 3251da177e4SLinus Torvalds or r18=r17,r18 3261da177e4SLinus Torvalds dep r2=-1,r3,61,3 // IMVA of task 3271da177e4SLinus Torvalds ;; 3281da177e4SLinus Torvalds mov r17=rr[r2] 3291da177e4SLinus Torvalds shr.u r16=r3,IA64_GRANULE_SHIFT 3301da177e4SLinus Torvalds ;; 3311da177e4SLinus Torvalds dep r17=0,r17,8,24 3321da177e4SLinus Torvalds ;; 3331da177e4SLinus Torvalds mov cr.itir=r17 3341da177e4SLinus Torvalds mov cr.ifa=r2 3351da177e4SLinus Torvalds 3361da177e4SLinus Torvalds mov r19=IA64_TR_CURRENT_STACK 3371da177e4SLinus Torvalds ;; 3381da177e4SLinus Torvalds itr.d dtr[r19]=r18 3391da177e4SLinus Torvalds ;; 3401da177e4SLinus Torvalds ssm psr.ic 3411da177e4SLinus Torvalds srlz.d 3421da177e4SLinus Torvalds ;; 3431da177e4SLinus Torvalds 3441da177e4SLinus Torvalds.load_current: 3451da177e4SLinus Torvalds // load the "current" pointer (r13) and ar.k6 with the current task 3461da177e4SLinus Torvalds mov IA64_KR(CURRENT)=r2 // virtual address 3471da177e4SLinus Torvalds mov IA64_KR(CURRENT_STACK)=r16 3481da177e4SLinus Torvalds mov r13=r2 3491da177e4SLinus Torvalds /* 350b8d8b883SAshok Raj * Reserve space at the top of the stack for "struct pt_regs". Kernel 351b8d8b883SAshok Raj * threads don't store interesting values in that structure, but the space 352b8d8b883SAshok Raj * still needs to be there because time-critical stuff such as the context 353b8d8b883SAshok Raj * switching can be implemented more efficiently (for example, __switch_to() 3541da177e4SLinus Torvalds * always sets the psr.dfh bit of the task it is switching to). 3551da177e4SLinus Torvalds */ 356b8d8b883SAshok Raj 3571da177e4SLinus Torvalds addl r12=IA64_STK_OFFSET-IA64_PT_REGS_SIZE-16,r2 3581da177e4SLinus Torvalds addl r2=IA64_RBS_OFFSET,r2 // initialize the RSE 3591da177e4SLinus Torvalds mov ar.rsc=0 // place RSE in enforced lazy mode 3601da177e4SLinus Torvalds ;; 3611da177e4SLinus Torvalds loadrs // clear the dirty partition 36210617bbeSTony Luck movl r19=__phys_per_cpu_start 36310617bbeSTony Luck mov r18=PERCPU_PAGE_SIZE 36410617bbeSTony Luck ;; 36510617bbeSTony Luck#ifndef CONFIG_SMP 36610617bbeSTony Luck add r19=r19,r18 36710617bbeSTony Luck ;; 36810617bbeSTony Luck#else 36910617bbeSTony Luck(isAP) br.few 2f 370c459ce8bSTony Luck movl r20=__cpu0_per_cpu 37110617bbeSTony Luck ;; 37210617bbeSTony Luck shr.u r18=r18,3 37310617bbeSTony Luck1: 374c459ce8bSTony Luck ld8 r21=[r19],8;; 375c459ce8bSTony Luck st8[r20]=r21,8 37610617bbeSTony Luck adds r18=-1,r18;; 37710617bbeSTony Luck cmp4.lt p7,p6=0,r18 37810617bbeSTony Luck(p7) br.cond.dptk.few 1b 379c459ce8bSTony Luck mov r19=r20 380c459ce8bSTony Luck ;; 38110617bbeSTony Luck2: 38210617bbeSTony Luck#endif 38310617bbeSTony Luck tpa r19=r19 38410617bbeSTony Luck ;; 38510617bbeSTony Luck .pred.rel.mutex isBP,isAP 38610617bbeSTony Luck(isBP) mov IA64_KR(PER_CPU_DATA)=r19 // per-CPU base for cpu0 38710617bbeSTony Luck(isAP) mov IA64_KR(PER_CPU_DATA)=r0 // clear physical per-CPU base 3881da177e4SLinus Torvalds ;; 3891da177e4SLinus Torvalds mov ar.bspstore=r2 // establish the new RSE stack 3901da177e4SLinus Torvalds ;; 3911da177e4SLinus Torvalds mov ar.rsc=0x3 // place RSE in eager mode 3921da177e4SLinus Torvalds 3931da177e4SLinus Torvalds(isBP) dep r28=-1,r28,61,3 // make address virtual 3941da177e4SLinus Torvalds(isBP) movl r2=ia64_boot_param 3951da177e4SLinus Torvalds ;; 3961da177e4SLinus Torvalds(isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader 3971da177e4SLinus Torvalds 3981da177e4SLinus Torvalds#ifdef CONFIG_SMP 3991da177e4SLinus Torvalds(isAP) br.call.sptk.many rp=start_secondary 4001da177e4SLinus Torvalds.ret0: 4011da177e4SLinus Torvalds(isAP) br.cond.sptk self 4021da177e4SLinus Torvalds#endif 4031da177e4SLinus Torvalds 4041da177e4SLinus Torvalds // This is executed by the bootstrap processor (bsp) only: 4051da177e4SLinus Torvalds 4061da177e4SLinus Torvalds br.call.sptk.many rp=start_kernel 4071da177e4SLinus Torvalds.ret2: addl r3=@ltoff(halt_msg),gp 4081da177e4SLinus Torvalds ;; 4091da177e4SLinus Torvalds alloc r2=ar.pfs,8,0,2,0 4101da177e4SLinus Torvalds ;; 4111da177e4SLinus Torvalds ld8 out0=[r3] 4121da177e4SLinus Torvalds br.call.sptk.many b0=console_print 4131da177e4SLinus Torvalds 4141da177e4SLinus Torvaldsself: hint @pause 4151da177e4SLinus Torvalds br.sptk.many self // endless loop 4161da177e4SLinus TorvaldsEND(_start) 4171da177e4SLinus Torvalds 4189d6f40b8STony Luck .text 4199d6f40b8STony Luck 4201da177e4SLinus TorvaldsGLOBAL_ENTRY(ia64_save_debug_regs) 4211da177e4SLinus Torvalds alloc r16=ar.pfs,1,0,0,0 4221da177e4SLinus Torvalds mov r20=ar.lc // preserve ar.lc 4231da177e4SLinus Torvalds mov ar.lc=IA64_NUM_DBG_REGS-1 4241da177e4SLinus Torvalds mov r18=0 4251da177e4SLinus Torvalds add r19=IA64_NUM_DBG_REGS*8,in0 4261da177e4SLinus Torvalds ;; 4271da177e4SLinus Torvalds1: mov r16=dbr[r18] 4281da177e4SLinus Torvalds#ifdef CONFIG_ITANIUM 4291da177e4SLinus Torvalds ;; 4301da177e4SLinus Torvalds srlz.d 4311da177e4SLinus Torvalds#endif 4321da177e4SLinus Torvalds mov r17=ibr[r18] 4331da177e4SLinus Torvalds add r18=1,r18 4341da177e4SLinus Torvalds ;; 4351da177e4SLinus Torvalds st8.nta [in0]=r16,8 4361da177e4SLinus Torvalds st8.nta [r19]=r17,8 4371da177e4SLinus Torvalds br.cloop.sptk.many 1b 4381da177e4SLinus Torvalds ;; 4391da177e4SLinus Torvalds mov ar.lc=r20 // restore ar.lc 4401da177e4SLinus Torvalds br.ret.sptk.many rp 4411da177e4SLinus TorvaldsEND(ia64_save_debug_regs) 4421da177e4SLinus Torvalds 4431da177e4SLinus TorvaldsGLOBAL_ENTRY(ia64_load_debug_regs) 4441da177e4SLinus Torvalds alloc r16=ar.pfs,1,0,0,0 4451da177e4SLinus Torvalds lfetch.nta [in0] 4461da177e4SLinus Torvalds mov r20=ar.lc // preserve ar.lc 4471da177e4SLinus Torvalds add r19=IA64_NUM_DBG_REGS*8,in0 4481da177e4SLinus Torvalds mov ar.lc=IA64_NUM_DBG_REGS-1 4491da177e4SLinus Torvalds mov r18=-1 4501da177e4SLinus Torvalds ;; 4511da177e4SLinus Torvalds1: ld8.nta r16=[in0],8 4521da177e4SLinus Torvalds ld8.nta r17=[r19],8 4531da177e4SLinus Torvalds add r18=1,r18 4541da177e4SLinus Torvalds ;; 4551da177e4SLinus Torvalds mov dbr[r18]=r16 4561da177e4SLinus Torvalds#ifdef CONFIG_ITANIUM 4571da177e4SLinus Torvalds ;; 4581da177e4SLinus Torvalds srlz.d // Errata 132 (NoFix status) 4591da177e4SLinus Torvalds#endif 4601da177e4SLinus Torvalds mov ibr[r18]=r17 4611da177e4SLinus Torvalds br.cloop.sptk.many 1b 4621da177e4SLinus Torvalds ;; 4631da177e4SLinus Torvalds mov ar.lc=r20 // restore ar.lc 4641da177e4SLinus Torvalds br.ret.sptk.many rp 4651da177e4SLinus TorvaldsEND(ia64_load_debug_regs) 4661da177e4SLinus Torvalds 4671da177e4SLinus TorvaldsGLOBAL_ENTRY(__ia64_save_fpu) 4681da177e4SLinus Torvalds alloc r2=ar.pfs,1,4,0,0 4691da177e4SLinus Torvalds adds loc0=96*16-16,in0 4701da177e4SLinus Torvalds adds loc1=96*16-16-128,in0 4711da177e4SLinus Torvalds ;; 4721da177e4SLinus Torvalds stf.spill.nta [loc0]=f127,-256 4731da177e4SLinus Torvalds stf.spill.nta [loc1]=f119,-256 4741da177e4SLinus Torvalds ;; 4751da177e4SLinus Torvalds stf.spill.nta [loc0]=f111,-256 4761da177e4SLinus Torvalds stf.spill.nta [loc1]=f103,-256 4771da177e4SLinus Torvalds ;; 4781da177e4SLinus Torvalds stf.spill.nta [loc0]=f95,-256 4791da177e4SLinus Torvalds stf.spill.nta [loc1]=f87,-256 4801da177e4SLinus Torvalds ;; 4811da177e4SLinus Torvalds stf.spill.nta [loc0]=f79,-256 4821da177e4SLinus Torvalds stf.spill.nta [loc1]=f71,-256 4831da177e4SLinus Torvalds ;; 4841da177e4SLinus Torvalds stf.spill.nta [loc0]=f63,-256 4851da177e4SLinus Torvalds stf.spill.nta [loc1]=f55,-256 4861da177e4SLinus Torvalds adds loc2=96*16-32,in0 4871da177e4SLinus Torvalds ;; 4881da177e4SLinus Torvalds stf.spill.nta [loc0]=f47,-256 4891da177e4SLinus Torvalds stf.spill.nta [loc1]=f39,-256 4901da177e4SLinus Torvalds adds loc3=96*16-32-128,in0 4911da177e4SLinus Torvalds ;; 4921da177e4SLinus Torvalds stf.spill.nta [loc2]=f126,-256 4931da177e4SLinus Torvalds stf.spill.nta [loc3]=f118,-256 4941da177e4SLinus Torvalds ;; 4951da177e4SLinus Torvalds stf.spill.nta [loc2]=f110,-256 4961da177e4SLinus Torvalds stf.spill.nta [loc3]=f102,-256 4971da177e4SLinus Torvalds ;; 4981da177e4SLinus Torvalds stf.spill.nta [loc2]=f94,-256 4991da177e4SLinus Torvalds stf.spill.nta [loc3]=f86,-256 5001da177e4SLinus Torvalds ;; 5011da177e4SLinus Torvalds stf.spill.nta [loc2]=f78,-256 5021da177e4SLinus Torvalds stf.spill.nta [loc3]=f70,-256 5031da177e4SLinus Torvalds ;; 5041da177e4SLinus Torvalds stf.spill.nta [loc2]=f62,-256 5051da177e4SLinus Torvalds stf.spill.nta [loc3]=f54,-256 5061da177e4SLinus Torvalds adds loc0=96*16-48,in0 5071da177e4SLinus Torvalds ;; 5081da177e4SLinus Torvalds stf.spill.nta [loc2]=f46,-256 5091da177e4SLinus Torvalds stf.spill.nta [loc3]=f38,-256 5101da177e4SLinus Torvalds adds loc1=96*16-48-128,in0 5111da177e4SLinus Torvalds ;; 5121da177e4SLinus Torvalds stf.spill.nta [loc0]=f125,-256 5131da177e4SLinus Torvalds stf.spill.nta [loc1]=f117,-256 5141da177e4SLinus Torvalds ;; 5151da177e4SLinus Torvalds stf.spill.nta [loc0]=f109,-256 5161da177e4SLinus Torvalds stf.spill.nta [loc1]=f101,-256 5171da177e4SLinus Torvalds ;; 5181da177e4SLinus Torvalds stf.spill.nta [loc0]=f93,-256 5191da177e4SLinus Torvalds stf.spill.nta [loc1]=f85,-256 5201da177e4SLinus Torvalds ;; 5211da177e4SLinus Torvalds stf.spill.nta [loc0]=f77,-256 5221da177e4SLinus Torvalds stf.spill.nta [loc1]=f69,-256 5231da177e4SLinus Torvalds ;; 5241da177e4SLinus Torvalds stf.spill.nta [loc0]=f61,-256 5251da177e4SLinus Torvalds stf.spill.nta [loc1]=f53,-256 5261da177e4SLinus Torvalds adds loc2=96*16-64,in0 5271da177e4SLinus Torvalds ;; 5281da177e4SLinus Torvalds stf.spill.nta [loc0]=f45,-256 5291da177e4SLinus Torvalds stf.spill.nta [loc1]=f37,-256 5301da177e4SLinus Torvalds adds loc3=96*16-64-128,in0 5311da177e4SLinus Torvalds ;; 5321da177e4SLinus Torvalds stf.spill.nta [loc2]=f124,-256 5331da177e4SLinus Torvalds stf.spill.nta [loc3]=f116,-256 5341da177e4SLinus Torvalds ;; 5351da177e4SLinus Torvalds stf.spill.nta [loc2]=f108,-256 5361da177e4SLinus Torvalds stf.spill.nta [loc3]=f100,-256 5371da177e4SLinus Torvalds ;; 5381da177e4SLinus Torvalds stf.spill.nta [loc2]=f92,-256 5391da177e4SLinus Torvalds stf.spill.nta [loc3]=f84,-256 5401da177e4SLinus Torvalds ;; 5411da177e4SLinus Torvalds stf.spill.nta [loc2]=f76,-256 5421da177e4SLinus Torvalds stf.spill.nta [loc3]=f68,-256 5431da177e4SLinus Torvalds ;; 5441da177e4SLinus Torvalds stf.spill.nta [loc2]=f60,-256 5451da177e4SLinus Torvalds stf.spill.nta [loc3]=f52,-256 5461da177e4SLinus Torvalds adds loc0=96*16-80,in0 5471da177e4SLinus Torvalds ;; 5481da177e4SLinus Torvalds stf.spill.nta [loc2]=f44,-256 5491da177e4SLinus Torvalds stf.spill.nta [loc3]=f36,-256 5501da177e4SLinus Torvalds adds loc1=96*16-80-128,in0 5511da177e4SLinus Torvalds ;; 5521da177e4SLinus Torvalds stf.spill.nta [loc0]=f123,-256 5531da177e4SLinus Torvalds stf.spill.nta [loc1]=f115,-256 5541da177e4SLinus Torvalds ;; 5551da177e4SLinus Torvalds stf.spill.nta [loc0]=f107,-256 5561da177e4SLinus Torvalds stf.spill.nta [loc1]=f99,-256 5571da177e4SLinus Torvalds ;; 5581da177e4SLinus Torvalds stf.spill.nta [loc0]=f91,-256 5591da177e4SLinus Torvalds stf.spill.nta [loc1]=f83,-256 5601da177e4SLinus Torvalds ;; 5611da177e4SLinus Torvalds stf.spill.nta [loc0]=f75,-256 5621da177e4SLinus Torvalds stf.spill.nta [loc1]=f67,-256 5631da177e4SLinus Torvalds ;; 5641da177e4SLinus Torvalds stf.spill.nta [loc0]=f59,-256 5651da177e4SLinus Torvalds stf.spill.nta [loc1]=f51,-256 5661da177e4SLinus Torvalds adds loc2=96*16-96,in0 5671da177e4SLinus Torvalds ;; 5681da177e4SLinus Torvalds stf.spill.nta [loc0]=f43,-256 5691da177e4SLinus Torvalds stf.spill.nta [loc1]=f35,-256 5701da177e4SLinus Torvalds adds loc3=96*16-96-128,in0 5711da177e4SLinus Torvalds ;; 5721da177e4SLinus Torvalds stf.spill.nta [loc2]=f122,-256 5731da177e4SLinus Torvalds stf.spill.nta [loc3]=f114,-256 5741da177e4SLinus Torvalds ;; 5751da177e4SLinus Torvalds stf.spill.nta [loc2]=f106,-256 5761da177e4SLinus Torvalds stf.spill.nta [loc3]=f98,-256 5771da177e4SLinus Torvalds ;; 5781da177e4SLinus Torvalds stf.spill.nta [loc2]=f90,-256 5791da177e4SLinus Torvalds stf.spill.nta [loc3]=f82,-256 5801da177e4SLinus Torvalds ;; 5811da177e4SLinus Torvalds stf.spill.nta [loc2]=f74,-256 5821da177e4SLinus Torvalds stf.spill.nta [loc3]=f66,-256 5831da177e4SLinus Torvalds ;; 5841da177e4SLinus Torvalds stf.spill.nta [loc2]=f58,-256 5851da177e4SLinus Torvalds stf.spill.nta [loc3]=f50,-256 5861da177e4SLinus Torvalds adds loc0=96*16-112,in0 5871da177e4SLinus Torvalds ;; 5881da177e4SLinus Torvalds stf.spill.nta [loc2]=f42,-256 5891da177e4SLinus Torvalds stf.spill.nta [loc3]=f34,-256 5901da177e4SLinus Torvalds adds loc1=96*16-112-128,in0 5911da177e4SLinus Torvalds ;; 5921da177e4SLinus Torvalds stf.spill.nta [loc0]=f121,-256 5931da177e4SLinus Torvalds stf.spill.nta [loc1]=f113,-256 5941da177e4SLinus Torvalds ;; 5951da177e4SLinus Torvalds stf.spill.nta [loc0]=f105,-256 5961da177e4SLinus Torvalds stf.spill.nta [loc1]=f97,-256 5971da177e4SLinus Torvalds ;; 5981da177e4SLinus Torvalds stf.spill.nta [loc0]=f89,-256 5991da177e4SLinus Torvalds stf.spill.nta [loc1]=f81,-256 6001da177e4SLinus Torvalds ;; 6011da177e4SLinus Torvalds stf.spill.nta [loc0]=f73,-256 6021da177e4SLinus Torvalds stf.spill.nta [loc1]=f65,-256 6031da177e4SLinus Torvalds ;; 6041da177e4SLinus Torvalds stf.spill.nta [loc0]=f57,-256 6051da177e4SLinus Torvalds stf.spill.nta [loc1]=f49,-256 6061da177e4SLinus Torvalds adds loc2=96*16-128,in0 6071da177e4SLinus Torvalds ;; 6081da177e4SLinus Torvalds stf.spill.nta [loc0]=f41,-256 6091da177e4SLinus Torvalds stf.spill.nta [loc1]=f33,-256 6101da177e4SLinus Torvalds adds loc3=96*16-128-128,in0 6111da177e4SLinus Torvalds ;; 6121da177e4SLinus Torvalds stf.spill.nta [loc2]=f120,-256 6131da177e4SLinus Torvalds stf.spill.nta [loc3]=f112,-256 6141da177e4SLinus Torvalds ;; 6151da177e4SLinus Torvalds stf.spill.nta [loc2]=f104,-256 6161da177e4SLinus Torvalds stf.spill.nta [loc3]=f96,-256 6171da177e4SLinus Torvalds ;; 6181da177e4SLinus Torvalds stf.spill.nta [loc2]=f88,-256 6191da177e4SLinus Torvalds stf.spill.nta [loc3]=f80,-256 6201da177e4SLinus Torvalds ;; 6211da177e4SLinus Torvalds stf.spill.nta [loc2]=f72,-256 6221da177e4SLinus Torvalds stf.spill.nta [loc3]=f64,-256 6231da177e4SLinus Torvalds ;; 6241da177e4SLinus Torvalds stf.spill.nta [loc2]=f56,-256 6251da177e4SLinus Torvalds stf.spill.nta [loc3]=f48,-256 6261da177e4SLinus Torvalds ;; 6271da177e4SLinus Torvalds stf.spill.nta [loc2]=f40 6281da177e4SLinus Torvalds stf.spill.nta [loc3]=f32 6291da177e4SLinus Torvalds br.ret.sptk.many rp 6301da177e4SLinus TorvaldsEND(__ia64_save_fpu) 6311da177e4SLinus Torvalds 6321da177e4SLinus TorvaldsGLOBAL_ENTRY(__ia64_load_fpu) 6331da177e4SLinus Torvalds alloc r2=ar.pfs,1,2,0,0 6341da177e4SLinus Torvalds adds r3=128,in0 6351da177e4SLinus Torvalds adds r14=256,in0 6361da177e4SLinus Torvalds adds r15=384,in0 6371da177e4SLinus Torvalds mov loc0=512 6381da177e4SLinus Torvalds mov loc1=-1024+16 6391da177e4SLinus Torvalds ;; 6401da177e4SLinus Torvalds ldf.fill.nta f32=[in0],loc0 6411da177e4SLinus Torvalds ldf.fill.nta f40=[ r3],loc0 6421da177e4SLinus Torvalds ldf.fill.nta f48=[r14],loc0 6431da177e4SLinus Torvalds ldf.fill.nta f56=[r15],loc0 6441da177e4SLinus Torvalds ;; 6451da177e4SLinus Torvalds ldf.fill.nta f64=[in0],loc0 6461da177e4SLinus Torvalds ldf.fill.nta f72=[ r3],loc0 6471da177e4SLinus Torvalds ldf.fill.nta f80=[r14],loc0 6481da177e4SLinus Torvalds ldf.fill.nta f88=[r15],loc0 6491da177e4SLinus Torvalds ;; 6501da177e4SLinus Torvalds ldf.fill.nta f96=[in0],loc1 6511da177e4SLinus Torvalds ldf.fill.nta f104=[ r3],loc1 6521da177e4SLinus Torvalds ldf.fill.nta f112=[r14],loc1 6531da177e4SLinus Torvalds ldf.fill.nta f120=[r15],loc1 6541da177e4SLinus Torvalds ;; 6551da177e4SLinus Torvalds ldf.fill.nta f33=[in0],loc0 6561da177e4SLinus Torvalds ldf.fill.nta f41=[ r3],loc0 6571da177e4SLinus Torvalds ldf.fill.nta f49=[r14],loc0 6581da177e4SLinus Torvalds ldf.fill.nta f57=[r15],loc0 6591da177e4SLinus Torvalds ;; 6601da177e4SLinus Torvalds ldf.fill.nta f65=[in0],loc0 6611da177e4SLinus Torvalds ldf.fill.nta f73=[ r3],loc0 6621da177e4SLinus Torvalds ldf.fill.nta f81=[r14],loc0 6631da177e4SLinus Torvalds ldf.fill.nta f89=[r15],loc0 6641da177e4SLinus Torvalds ;; 6651da177e4SLinus Torvalds ldf.fill.nta f97=[in0],loc1 6661da177e4SLinus Torvalds ldf.fill.nta f105=[ r3],loc1 6671da177e4SLinus Torvalds ldf.fill.nta f113=[r14],loc1 6681da177e4SLinus Torvalds ldf.fill.nta f121=[r15],loc1 6691da177e4SLinus Torvalds ;; 6701da177e4SLinus Torvalds ldf.fill.nta f34=[in0],loc0 6711da177e4SLinus Torvalds ldf.fill.nta f42=[ r3],loc0 6721da177e4SLinus Torvalds ldf.fill.nta f50=[r14],loc0 6731da177e4SLinus Torvalds ldf.fill.nta f58=[r15],loc0 6741da177e4SLinus Torvalds ;; 6751da177e4SLinus Torvalds ldf.fill.nta f66=[in0],loc0 6761da177e4SLinus Torvalds ldf.fill.nta f74=[ r3],loc0 6771da177e4SLinus Torvalds ldf.fill.nta f82=[r14],loc0 6781da177e4SLinus Torvalds ldf.fill.nta f90=[r15],loc0 6791da177e4SLinus Torvalds ;; 6801da177e4SLinus Torvalds ldf.fill.nta f98=[in0],loc1 6811da177e4SLinus Torvalds ldf.fill.nta f106=[ r3],loc1 6821da177e4SLinus Torvalds ldf.fill.nta f114=[r14],loc1 6831da177e4SLinus Torvalds ldf.fill.nta f122=[r15],loc1 6841da177e4SLinus Torvalds ;; 6851da177e4SLinus Torvalds ldf.fill.nta f35=[in0],loc0 6861da177e4SLinus Torvalds ldf.fill.nta f43=[ r3],loc0 6871da177e4SLinus Torvalds ldf.fill.nta f51=[r14],loc0 6881da177e4SLinus Torvalds ldf.fill.nta f59=[r15],loc0 6891da177e4SLinus Torvalds ;; 6901da177e4SLinus Torvalds ldf.fill.nta f67=[in0],loc0 6911da177e4SLinus Torvalds ldf.fill.nta f75=[ r3],loc0 6921da177e4SLinus Torvalds ldf.fill.nta f83=[r14],loc0 6931da177e4SLinus Torvalds ldf.fill.nta f91=[r15],loc0 6941da177e4SLinus Torvalds ;; 6951da177e4SLinus Torvalds ldf.fill.nta f99=[in0],loc1 6961da177e4SLinus Torvalds ldf.fill.nta f107=[ r3],loc1 6971da177e4SLinus Torvalds ldf.fill.nta f115=[r14],loc1 6981da177e4SLinus Torvalds ldf.fill.nta f123=[r15],loc1 6991da177e4SLinus Torvalds ;; 7001da177e4SLinus Torvalds ldf.fill.nta f36=[in0],loc0 7011da177e4SLinus Torvalds ldf.fill.nta f44=[ r3],loc0 7021da177e4SLinus Torvalds ldf.fill.nta f52=[r14],loc0 7031da177e4SLinus Torvalds ldf.fill.nta f60=[r15],loc0 7041da177e4SLinus Torvalds ;; 7051da177e4SLinus Torvalds ldf.fill.nta f68=[in0],loc0 7061da177e4SLinus Torvalds ldf.fill.nta f76=[ r3],loc0 7071da177e4SLinus Torvalds ldf.fill.nta f84=[r14],loc0 7081da177e4SLinus Torvalds ldf.fill.nta f92=[r15],loc0 7091da177e4SLinus Torvalds ;; 7101da177e4SLinus Torvalds ldf.fill.nta f100=[in0],loc1 7111da177e4SLinus Torvalds ldf.fill.nta f108=[ r3],loc1 7121da177e4SLinus Torvalds ldf.fill.nta f116=[r14],loc1 7131da177e4SLinus Torvalds ldf.fill.nta f124=[r15],loc1 7141da177e4SLinus Torvalds ;; 7151da177e4SLinus Torvalds ldf.fill.nta f37=[in0],loc0 7161da177e4SLinus Torvalds ldf.fill.nta f45=[ r3],loc0 7171da177e4SLinus Torvalds ldf.fill.nta f53=[r14],loc0 7181da177e4SLinus Torvalds ldf.fill.nta f61=[r15],loc0 7191da177e4SLinus Torvalds ;; 7201da177e4SLinus Torvalds ldf.fill.nta f69=[in0],loc0 7211da177e4SLinus Torvalds ldf.fill.nta f77=[ r3],loc0 7221da177e4SLinus Torvalds ldf.fill.nta f85=[r14],loc0 7231da177e4SLinus Torvalds ldf.fill.nta f93=[r15],loc0 7241da177e4SLinus Torvalds ;; 7251da177e4SLinus Torvalds ldf.fill.nta f101=[in0],loc1 7261da177e4SLinus Torvalds ldf.fill.nta f109=[ r3],loc1 7271da177e4SLinus Torvalds ldf.fill.nta f117=[r14],loc1 7281da177e4SLinus Torvalds ldf.fill.nta f125=[r15],loc1 7291da177e4SLinus Torvalds ;; 7301da177e4SLinus Torvalds ldf.fill.nta f38 =[in0],loc0 7311da177e4SLinus Torvalds ldf.fill.nta f46 =[ r3],loc0 7321da177e4SLinus Torvalds ldf.fill.nta f54 =[r14],loc0 7331da177e4SLinus Torvalds ldf.fill.nta f62 =[r15],loc0 7341da177e4SLinus Torvalds ;; 7351da177e4SLinus Torvalds ldf.fill.nta f70 =[in0],loc0 7361da177e4SLinus Torvalds ldf.fill.nta f78 =[ r3],loc0 7371da177e4SLinus Torvalds ldf.fill.nta f86 =[r14],loc0 7381da177e4SLinus Torvalds ldf.fill.nta f94 =[r15],loc0 7391da177e4SLinus Torvalds ;; 7401da177e4SLinus Torvalds ldf.fill.nta f102=[in0],loc1 7411da177e4SLinus Torvalds ldf.fill.nta f110=[ r3],loc1 7421da177e4SLinus Torvalds ldf.fill.nta f118=[r14],loc1 7431da177e4SLinus Torvalds ldf.fill.nta f126=[r15],loc1 7441da177e4SLinus Torvalds ;; 7451da177e4SLinus Torvalds ldf.fill.nta f39 =[in0],loc0 7461da177e4SLinus Torvalds ldf.fill.nta f47 =[ r3],loc0 7471da177e4SLinus Torvalds ldf.fill.nta f55 =[r14],loc0 7481da177e4SLinus Torvalds ldf.fill.nta f63 =[r15],loc0 7491da177e4SLinus Torvalds ;; 7501da177e4SLinus Torvalds ldf.fill.nta f71 =[in0],loc0 7511da177e4SLinus Torvalds ldf.fill.nta f79 =[ r3],loc0 7521da177e4SLinus Torvalds ldf.fill.nta f87 =[r14],loc0 7531da177e4SLinus Torvalds ldf.fill.nta f95 =[r15],loc0 7541da177e4SLinus Torvalds ;; 7551da177e4SLinus Torvalds ldf.fill.nta f103=[in0] 7561da177e4SLinus Torvalds ldf.fill.nta f111=[ r3] 7571da177e4SLinus Torvalds ldf.fill.nta f119=[r14] 7581da177e4SLinus Torvalds ldf.fill.nta f127=[r15] 7591da177e4SLinus Torvalds br.ret.sptk.many rp 7601da177e4SLinus TorvaldsEND(__ia64_load_fpu) 7611da177e4SLinus Torvalds 7621da177e4SLinus TorvaldsGLOBAL_ENTRY(__ia64_init_fpu) 7631da177e4SLinus Torvalds stf.spill [sp]=f0 // M3 7641da177e4SLinus Torvalds mov f32=f0 // F 7651da177e4SLinus Torvalds nop.b 0 7661da177e4SLinus Torvalds 7671da177e4SLinus Torvalds ldfps f33,f34=[sp] // M0 7681da177e4SLinus Torvalds ldfps f35,f36=[sp] // M1 7691da177e4SLinus Torvalds mov f37=f0 // F 7701da177e4SLinus Torvalds ;; 7711da177e4SLinus Torvalds 7721da177e4SLinus Torvalds setf.s f38=r0 // M2 7731da177e4SLinus Torvalds setf.s f39=r0 // M3 7741da177e4SLinus Torvalds mov f40=f0 // F 7751da177e4SLinus Torvalds 7761da177e4SLinus Torvalds ldfps f41,f42=[sp] // M0 7771da177e4SLinus Torvalds ldfps f43,f44=[sp] // M1 7781da177e4SLinus Torvalds mov f45=f0 // F 7791da177e4SLinus Torvalds 7801da177e4SLinus Torvalds setf.s f46=r0 // M2 7811da177e4SLinus Torvalds setf.s f47=r0 // M3 7821da177e4SLinus Torvalds mov f48=f0 // F 7831da177e4SLinus Torvalds 7841da177e4SLinus Torvalds ldfps f49,f50=[sp] // M0 7851da177e4SLinus Torvalds ldfps f51,f52=[sp] // M1 7861da177e4SLinus Torvalds mov f53=f0 // F 7871da177e4SLinus Torvalds 7881da177e4SLinus Torvalds setf.s f54=r0 // M2 7891da177e4SLinus Torvalds setf.s f55=r0 // M3 7901da177e4SLinus Torvalds mov f56=f0 // F 7911da177e4SLinus Torvalds 7921da177e4SLinus Torvalds ldfps f57,f58=[sp] // M0 7931da177e4SLinus Torvalds ldfps f59,f60=[sp] // M1 7941da177e4SLinus Torvalds mov f61=f0 // F 7951da177e4SLinus Torvalds 7961da177e4SLinus Torvalds setf.s f62=r0 // M2 7971da177e4SLinus Torvalds setf.s f63=r0 // M3 7981da177e4SLinus Torvalds mov f64=f0 // F 7991da177e4SLinus Torvalds 8001da177e4SLinus Torvalds ldfps f65,f66=[sp] // M0 8011da177e4SLinus Torvalds ldfps f67,f68=[sp] // M1 8021da177e4SLinus Torvalds mov f69=f0 // F 8031da177e4SLinus Torvalds 8041da177e4SLinus Torvalds setf.s f70=r0 // M2 8051da177e4SLinus Torvalds setf.s f71=r0 // M3 8061da177e4SLinus Torvalds mov f72=f0 // F 8071da177e4SLinus Torvalds 8081da177e4SLinus Torvalds ldfps f73,f74=[sp] // M0 8091da177e4SLinus Torvalds ldfps f75,f76=[sp] // M1 8101da177e4SLinus Torvalds mov f77=f0 // F 8111da177e4SLinus Torvalds 8121da177e4SLinus Torvalds setf.s f78=r0 // M2 8131da177e4SLinus Torvalds setf.s f79=r0 // M3 8141da177e4SLinus Torvalds mov f80=f0 // F 8151da177e4SLinus Torvalds 8161da177e4SLinus Torvalds ldfps f81,f82=[sp] // M0 8171da177e4SLinus Torvalds ldfps f83,f84=[sp] // M1 8181da177e4SLinus Torvalds mov f85=f0 // F 8191da177e4SLinus Torvalds 8201da177e4SLinus Torvalds setf.s f86=r0 // M2 8211da177e4SLinus Torvalds setf.s f87=r0 // M3 8221da177e4SLinus Torvalds mov f88=f0 // F 8231da177e4SLinus Torvalds 8241da177e4SLinus Torvalds /* 8251da177e4SLinus Torvalds * When the instructions are cached, it would be faster to initialize 8261da177e4SLinus Torvalds * the remaining registers with simply mov instructions (F-unit). 8271da177e4SLinus Torvalds * This gets the time down to ~29 cycles. However, this would use up 8281da177e4SLinus Torvalds * 33 bundles, whereas continuing with the above pattern yields 8291da177e4SLinus Torvalds * 10 bundles and ~30 cycles. 8301da177e4SLinus Torvalds */ 8311da177e4SLinus Torvalds 8321da177e4SLinus Torvalds ldfps f89,f90=[sp] // M0 8331da177e4SLinus Torvalds ldfps f91,f92=[sp] // M1 8341da177e4SLinus Torvalds mov f93=f0 // F 8351da177e4SLinus Torvalds 8361da177e4SLinus Torvalds setf.s f94=r0 // M2 8371da177e4SLinus Torvalds setf.s f95=r0 // M3 8381da177e4SLinus Torvalds mov f96=f0 // F 8391da177e4SLinus Torvalds 8401da177e4SLinus Torvalds ldfps f97,f98=[sp] // M0 8411da177e4SLinus Torvalds ldfps f99,f100=[sp] // M1 8421da177e4SLinus Torvalds mov f101=f0 // F 8431da177e4SLinus Torvalds 8441da177e4SLinus Torvalds setf.s f102=r0 // M2 8451da177e4SLinus Torvalds setf.s f103=r0 // M3 8461da177e4SLinus Torvalds mov f104=f0 // F 8471da177e4SLinus Torvalds 8481da177e4SLinus Torvalds ldfps f105,f106=[sp] // M0 8491da177e4SLinus Torvalds ldfps f107,f108=[sp] // M1 8501da177e4SLinus Torvalds mov f109=f0 // F 8511da177e4SLinus Torvalds 8521da177e4SLinus Torvalds setf.s f110=r0 // M2 8531da177e4SLinus Torvalds setf.s f111=r0 // M3 8541da177e4SLinus Torvalds mov f112=f0 // F 8551da177e4SLinus Torvalds 8561da177e4SLinus Torvalds ldfps f113,f114=[sp] // M0 8571da177e4SLinus Torvalds ldfps f115,f116=[sp] // M1 8581da177e4SLinus Torvalds mov f117=f0 // F 8591da177e4SLinus Torvalds 8601da177e4SLinus Torvalds setf.s f118=r0 // M2 8611da177e4SLinus Torvalds setf.s f119=r0 // M3 8621da177e4SLinus Torvalds mov f120=f0 // F 8631da177e4SLinus Torvalds 8641da177e4SLinus Torvalds ldfps f121,f122=[sp] // M0 8651da177e4SLinus Torvalds ldfps f123,f124=[sp] // M1 8661da177e4SLinus Torvalds mov f125=f0 // F 8671da177e4SLinus Torvalds 8681da177e4SLinus Torvalds setf.s f126=r0 // M2 8691da177e4SLinus Torvalds setf.s f127=r0 // M3 8701da177e4SLinus Torvalds br.ret.sptk.many rp // F 8711da177e4SLinus TorvaldsEND(__ia64_init_fpu) 8721da177e4SLinus Torvalds 8731da177e4SLinus Torvalds/* 8741da177e4SLinus Torvalds * Switch execution mode from virtual to physical 8751da177e4SLinus Torvalds * 8761da177e4SLinus Torvalds * Inputs: 8771da177e4SLinus Torvalds * r16 = new psr to establish 8781da177e4SLinus Torvalds * Output: 8791da177e4SLinus Torvalds * r19 = old virtual address of ar.bsp 8801da177e4SLinus Torvalds * r20 = old virtual address of sp 8811da177e4SLinus Torvalds * 8821da177e4SLinus Torvalds * Note: RSE must already be in enforced lazy mode 8831da177e4SLinus Torvalds */ 8841da177e4SLinus TorvaldsGLOBAL_ENTRY(ia64_switch_mode_phys) 8851da177e4SLinus Torvalds { 8861da177e4SLinus Torvalds rsm psr.i | psr.ic // disable interrupts and interrupt collection 8871da177e4SLinus Torvalds mov r15=ip 8881da177e4SLinus Torvalds } 8891da177e4SLinus Torvalds ;; 8901da177e4SLinus Torvalds { 8911da177e4SLinus Torvalds flushrs // must be first insn in group 8921da177e4SLinus Torvalds srlz.i 8931da177e4SLinus Torvalds } 8941da177e4SLinus Torvalds ;; 8951da177e4SLinus Torvalds mov cr.ipsr=r16 // set new PSR 8961da177e4SLinus Torvalds add r3=1f-ia64_switch_mode_phys,r15 8971da177e4SLinus Torvalds 8981da177e4SLinus Torvalds mov r19=ar.bsp 8991da177e4SLinus Torvalds mov r20=sp 9001da177e4SLinus Torvalds mov r14=rp // get return address into a general register 9011da177e4SLinus Torvalds ;; 9021da177e4SLinus Torvalds 9031da177e4SLinus Torvalds // going to physical mode, use tpa to translate virt->phys 9041da177e4SLinus Torvalds tpa r17=r19 9051da177e4SLinus Torvalds tpa r3=r3 9061da177e4SLinus Torvalds tpa sp=sp 9071da177e4SLinus Torvalds tpa r14=r14 9081da177e4SLinus Torvalds ;; 9091da177e4SLinus Torvalds 9101da177e4SLinus Torvalds mov r18=ar.rnat // save ar.rnat 9111da177e4SLinus Torvalds mov ar.bspstore=r17 // this steps on ar.rnat 9121da177e4SLinus Torvalds mov cr.iip=r3 9131da177e4SLinus Torvalds mov cr.ifs=r0 9141da177e4SLinus Torvalds ;; 9151da177e4SLinus Torvalds mov ar.rnat=r18 // restore ar.rnat 9161da177e4SLinus Torvalds rfi // must be last insn in group 9171da177e4SLinus Torvalds ;; 9181da177e4SLinus Torvalds1: mov rp=r14 9191da177e4SLinus Torvalds br.ret.sptk.many rp 9201da177e4SLinus TorvaldsEND(ia64_switch_mode_phys) 9211da177e4SLinus Torvalds 9221da177e4SLinus Torvalds/* 9231da177e4SLinus Torvalds * Switch execution mode from physical to virtual 9241da177e4SLinus Torvalds * 9251da177e4SLinus Torvalds * Inputs: 9261da177e4SLinus Torvalds * r16 = new psr to establish 9271da177e4SLinus Torvalds * r19 = new bspstore to establish 9281da177e4SLinus Torvalds * r20 = new sp to establish 9291da177e4SLinus Torvalds * 9301da177e4SLinus Torvalds * Note: RSE must already be in enforced lazy mode 9311da177e4SLinus Torvalds */ 9321da177e4SLinus TorvaldsGLOBAL_ENTRY(ia64_switch_mode_virt) 9331da177e4SLinus Torvalds { 9341da177e4SLinus Torvalds rsm psr.i | psr.ic // disable interrupts and interrupt collection 9351da177e4SLinus Torvalds mov r15=ip 9361da177e4SLinus Torvalds } 9371da177e4SLinus Torvalds ;; 9381da177e4SLinus Torvalds { 9391da177e4SLinus Torvalds flushrs // must be first insn in group 9401da177e4SLinus Torvalds srlz.i 9411da177e4SLinus Torvalds } 9421da177e4SLinus Torvalds ;; 9431da177e4SLinus Torvalds mov cr.ipsr=r16 // set new PSR 9441da177e4SLinus Torvalds add r3=1f-ia64_switch_mode_virt,r15 9451da177e4SLinus Torvalds 9461da177e4SLinus Torvalds mov r14=rp // get return address into a general register 9471da177e4SLinus Torvalds ;; 9481da177e4SLinus Torvalds 9491da177e4SLinus Torvalds // going to virtual 9501da177e4SLinus Torvalds // - for code addresses, set upper bits of addr to KERNEL_START 9511da177e4SLinus Torvalds // - for stack addresses, copy from input argument 9521da177e4SLinus Torvalds movl r18=KERNEL_START 9531da177e4SLinus Torvalds dep r3=0,r3,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT 9541da177e4SLinus Torvalds dep r14=0,r14,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT 9551da177e4SLinus Torvalds mov sp=r20 9561da177e4SLinus Torvalds ;; 9571da177e4SLinus Torvalds or r3=r3,r18 9581da177e4SLinus Torvalds or r14=r14,r18 9591da177e4SLinus Torvalds ;; 9601da177e4SLinus Torvalds 9611da177e4SLinus Torvalds mov r18=ar.rnat // save ar.rnat 9621da177e4SLinus Torvalds mov ar.bspstore=r19 // this steps on ar.rnat 9631da177e4SLinus Torvalds mov cr.iip=r3 9641da177e4SLinus Torvalds mov cr.ifs=r0 9651da177e4SLinus Torvalds ;; 9661da177e4SLinus Torvalds mov ar.rnat=r18 // restore ar.rnat 9671da177e4SLinus Torvalds rfi // must be last insn in group 9681da177e4SLinus Torvalds ;; 9691da177e4SLinus Torvalds1: mov rp=r14 9701da177e4SLinus Torvalds br.ret.sptk.many rp 9711da177e4SLinus TorvaldsEND(ia64_switch_mode_virt) 9721da177e4SLinus Torvalds 9731da177e4SLinus TorvaldsGLOBAL_ENTRY(ia64_delay_loop) 9741da177e4SLinus Torvalds .prologue 9751da177e4SLinus Torvalds{ nop 0 // work around GAS unwind info generation bug... 9761da177e4SLinus Torvalds .save ar.lc,r2 9771da177e4SLinus Torvalds mov r2=ar.lc 9781da177e4SLinus Torvalds .body 9791da177e4SLinus Torvalds ;; 9801da177e4SLinus Torvalds mov ar.lc=r32 9811da177e4SLinus Torvalds} 9821da177e4SLinus Torvalds ;; 9831da177e4SLinus Torvalds // force loop to be 32-byte aligned (GAS bug means we cannot use .align 9841da177e4SLinus Torvalds // inside function body without corrupting unwind info). 9851da177e4SLinus Torvalds{ nop 0 } 9861da177e4SLinus Torvalds1: br.cloop.sptk.few 1b 9871da177e4SLinus Torvalds ;; 9881da177e4SLinus Torvalds mov ar.lc=r2 9891da177e4SLinus Torvalds br.ret.sptk.many rp 9901da177e4SLinus TorvaldsEND(ia64_delay_loop) 9911da177e4SLinus Torvalds 9921da177e4SLinus Torvalds/* 9931da177e4SLinus Torvalds * Return a CPU-local timestamp in nano-seconds. This timestamp is 9941da177e4SLinus Torvalds * NOT synchronized across CPUs its return value must never be 9951da177e4SLinus Torvalds * compared against the values returned on another CPU. The usage in 9960a0fca9dSViresh Kumar * kernel/sched/core.c ensures that. 9971da177e4SLinus Torvalds * 9981da177e4SLinus Torvalds * The return-value of sched_clock() is NOT supposed to wrap-around. 9991da177e4SLinus Torvalds * If it did, it would cause some scheduling hiccups (at the worst). 10001da177e4SLinus Torvalds * Fortunately, with a 64-bit cycle-counter ticking at 100GHz, even 10011da177e4SLinus Torvalds * that would happen only once every 5+ years. 10021da177e4SLinus Torvalds * 10031da177e4SLinus Torvalds * The code below basically calculates: 10041da177e4SLinus Torvalds * 10051da177e4SLinus Torvalds * (ia64_get_itc() * local_cpu_data->nsec_per_cyc) >> IA64_NSEC_PER_CYC_SHIFT 10061da177e4SLinus Torvalds * 10071da177e4SLinus Torvalds * except that the multiplication and the shift are done with 128-bit 10081da177e4SLinus Torvalds * intermediate precision so that we can produce a full 64-bit result. 10091da177e4SLinus Torvalds */ 1010f927da17SIsaku YamahataGLOBAL_ENTRY(ia64_native_sched_clock) 1011877105ccSTejun Heo addl r8=THIS_CPU(ia64_cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0 10121da177e4SLinus Torvalds mov.m r9=ar.itc // fetch cycle-counter (35 cyc) 10131da177e4SLinus Torvalds ;; 10141da177e4SLinus Torvalds ldf8 f8=[r8] 10151da177e4SLinus Torvalds ;; 10161da177e4SLinus Torvalds setf.sig f9=r9 // certain to stall, so issue it _after_ ldf8... 10171da177e4SLinus Torvalds ;; 10181da177e4SLinus Torvalds xmpy.lu f10=f9,f8 // calculate low 64 bits of 128-bit product (4 cyc) 10191da177e4SLinus Torvalds xmpy.hu f11=f9,f8 // calculate high 64 bits of 128-bit product 10201da177e4SLinus Torvalds ;; 10211da177e4SLinus Torvalds getf.sig r8=f10 // (5 cyc) 10221da177e4SLinus Torvalds getf.sig r9=f11 10231da177e4SLinus Torvalds ;; 10241da177e4SLinus Torvalds shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT 10251da177e4SLinus Torvalds br.ret.sptk.many rp 1026f927da17SIsaku YamahataEND(ia64_native_sched_clock) 10271da177e4SLinus Torvalds 1028abf917cdSFrederic Weisbecker#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 1029e2339a4cSFrederic WeisbeckerGLOBAL_ENTRY(cycle_to_nsec) 1030b64f34cdSHidetoshi Seto alloc r16=ar.pfs,1,0,0,0 1031877105ccSTejun Heo addl r8=THIS_CPU(ia64_cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0 1032b64f34cdSHidetoshi Seto ;; 1033b64f34cdSHidetoshi Seto ldf8 f8=[r8] 1034b64f34cdSHidetoshi Seto ;; 1035b64f34cdSHidetoshi Seto setf.sig f9=r32 1036b64f34cdSHidetoshi Seto ;; 1037b64f34cdSHidetoshi Seto xmpy.lu f10=f9,f8 // calculate low 64 bits of 128-bit product (4 cyc) 1038b64f34cdSHidetoshi Seto xmpy.hu f11=f9,f8 // calculate high 64 bits of 128-bit product 1039b64f34cdSHidetoshi Seto ;; 1040b64f34cdSHidetoshi Seto getf.sig r8=f10 // (5 cyc) 1041b64f34cdSHidetoshi Seto getf.sig r9=f11 1042b64f34cdSHidetoshi Seto ;; 1043b64f34cdSHidetoshi Seto shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT 1044b64f34cdSHidetoshi Seto br.ret.sptk.many rp 1045e2339a4cSFrederic WeisbeckerEND(cycle_to_nsec) 1046abf917cdSFrederic Weisbecker#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ 1047b64f34cdSHidetoshi Seto 10481da177e4SLinus Torvalds#ifdef CONFIG_IA64_BRL_EMU 10491da177e4SLinus Torvalds 10501da177e4SLinus Torvalds/* 10511da177e4SLinus Torvalds * Assembly routines used by brl_emu.c to set preserved register state. 10521da177e4SLinus Torvalds */ 10531da177e4SLinus Torvalds 10541da177e4SLinus Torvalds#define SET_REG(reg) \ 10551da177e4SLinus Torvalds GLOBAL_ENTRY(ia64_set_##reg); \ 10561da177e4SLinus Torvalds alloc r16=ar.pfs,1,0,0,0; \ 10571da177e4SLinus Torvalds mov reg=r32; \ 10581da177e4SLinus Torvalds ;; \ 10591da177e4SLinus Torvalds br.ret.sptk.many rp; \ 10601da177e4SLinus Torvalds END(ia64_set_##reg) 10611da177e4SLinus Torvalds 10621da177e4SLinus TorvaldsSET_REG(b1); 10631da177e4SLinus TorvaldsSET_REG(b2); 10641da177e4SLinus TorvaldsSET_REG(b3); 10651da177e4SLinus TorvaldsSET_REG(b4); 10661da177e4SLinus TorvaldsSET_REG(b5); 10671da177e4SLinus Torvalds 10681da177e4SLinus Torvalds#endif /* CONFIG_IA64_BRL_EMU */ 10691da177e4SLinus Torvalds 10701da177e4SLinus Torvalds#ifdef CONFIG_SMP 10711da177e4SLinus Torvalds 1072b8d8b883SAshok Raj#ifdef CONFIG_HOTPLUG_CPU 1073b8d8b883SAshok RajGLOBAL_ENTRY(ia64_jump_to_sal) 1074b8d8b883SAshok Raj alloc r16=ar.pfs,1,0,0,0;; 1075b8d8b883SAshok Raj rsm psr.i | psr.ic 1076b8d8b883SAshok Raj{ 1077b8d8b883SAshok Raj flushrs 1078b8d8b883SAshok Raj srlz.i 1079b8d8b883SAshok Raj} 1080b8d8b883SAshok Raj tpa r25=in0 1081b8d8b883SAshok Raj movl r18=tlb_purge_done;; 1082b8d8b883SAshok Raj DATA_VA_TO_PA(r18);; 1083b8d8b883SAshok Raj mov b1=r18 // Return location 1084b8d8b883SAshok Raj movl r18=ia64_do_tlb_purge;; 1085b8d8b883SAshok Raj DATA_VA_TO_PA(r18);; 1086b8d8b883SAshok Raj mov b2=r18 // doing tlb_flush work 1087b8d8b883SAshok Raj mov ar.rsc=0 // Put RSE in enforced lazy, LE mode 1088b8d8b883SAshok Raj movl r17=1f;; 1089b8d8b883SAshok Raj DATA_VA_TO_PA(r17);; 1090b8d8b883SAshok Raj mov cr.iip=r17 1091b8d8b883SAshok Raj movl r16=SAL_PSR_BITS_TO_SET;; 1092b8d8b883SAshok Raj mov cr.ipsr=r16 1093b8d8b883SAshok Raj mov cr.ifs=r0;; 10944295ab34SHidetoshi Seto rfi;; // note: this unmask MCA/INIT (psr.mc) 1095b8d8b883SAshok Raj1: 1096b8d8b883SAshok Raj /* 1097b8d8b883SAshok Raj * Invalidate all TLB data/inst 1098b8d8b883SAshok Raj */ 1099b8d8b883SAshok Raj br.sptk.many b2;; // jump to tlb purge code 1100b8d8b883SAshok Raj 1101b8d8b883SAshok Rajtlb_purge_done: 1102b8d8b883SAshok Raj RESTORE_REGION_REGS(r25, r17,r18,r19);; 1103b8d8b883SAshok Raj RESTORE_REG(b0, r25, r17);; 1104b8d8b883SAshok Raj RESTORE_REG(b1, r25, r17);; 1105b8d8b883SAshok Raj RESTORE_REG(b2, r25, r17);; 1106b8d8b883SAshok Raj RESTORE_REG(b3, r25, r17);; 1107b8d8b883SAshok Raj RESTORE_REG(b4, r25, r17);; 1108b8d8b883SAshok Raj RESTORE_REG(b5, r25, r17);; 1109b8d8b883SAshok Raj ld8 r1=[r25],0x08;; 1110b8d8b883SAshok Raj ld8 r12=[r25],0x08;; 1111b8d8b883SAshok Raj ld8 r13=[r25],0x08;; 1112b8d8b883SAshok Raj RESTORE_REG(ar.fpsr, r25, r17);; 1113b8d8b883SAshok Raj RESTORE_REG(ar.pfs, r25, r17);; 1114b8d8b883SAshok Raj RESTORE_REG(ar.rnat, r25, r17);; 1115b8d8b883SAshok Raj RESTORE_REG(ar.unat, r25, r17);; 1116b8d8b883SAshok Raj RESTORE_REG(ar.bspstore, r25, r17);; 1117b8d8b883SAshok Raj RESTORE_REG(cr.dcr, r25, r17);; 1118b8d8b883SAshok Raj RESTORE_REG(cr.iva, r25, r17);; 1119b8d8b883SAshok Raj RESTORE_REG(cr.pta, r25, r17);; 112009106228SHidetoshi Seto srlz.d;; // required not to violate RAW dependency 1121b8d8b883SAshok Raj RESTORE_REG(cr.itv, r25, r17);; 1122b8d8b883SAshok Raj RESTORE_REG(cr.pmv, r25, r17);; 1123b8d8b883SAshok Raj RESTORE_REG(cr.cmcv, r25, r17);; 1124b8d8b883SAshok Raj RESTORE_REG(cr.lrr0, r25, r17);; 1125b8d8b883SAshok Raj RESTORE_REG(cr.lrr1, r25, r17);; 1126b8d8b883SAshok Raj ld8 r4=[r25],0x08;; 1127b8d8b883SAshok Raj ld8 r5=[r25],0x08;; 1128b8d8b883SAshok Raj ld8 r6=[r25],0x08;; 1129b8d8b883SAshok Raj ld8 r7=[r25],0x08;; 1130b8d8b883SAshok Raj ld8 r17=[r25],0x08;; 1131b8d8b883SAshok Raj mov pr=r17,-1;; 1132b8d8b883SAshok Raj RESTORE_REG(ar.lc, r25, r17);; 1133b8d8b883SAshok Raj /* 1134b8d8b883SAshok Raj * Now Restore floating point regs 1135b8d8b883SAshok Raj */ 1136b8d8b883SAshok Raj ldf.fill.nta f2=[r25],16;; 1137b8d8b883SAshok Raj ldf.fill.nta f3=[r25],16;; 1138b8d8b883SAshok Raj ldf.fill.nta f4=[r25],16;; 1139b8d8b883SAshok Raj ldf.fill.nta f5=[r25],16;; 1140b8d8b883SAshok Raj ldf.fill.nta f16=[r25],16;; 1141b8d8b883SAshok Raj ldf.fill.nta f17=[r25],16;; 1142b8d8b883SAshok Raj ldf.fill.nta f18=[r25],16;; 1143b8d8b883SAshok Raj ldf.fill.nta f19=[r25],16;; 1144b8d8b883SAshok Raj ldf.fill.nta f20=[r25],16;; 1145b8d8b883SAshok Raj ldf.fill.nta f21=[r25],16;; 1146b8d8b883SAshok Raj ldf.fill.nta f22=[r25],16;; 1147b8d8b883SAshok Raj ldf.fill.nta f23=[r25],16;; 1148b8d8b883SAshok Raj ldf.fill.nta f24=[r25],16;; 1149b8d8b883SAshok Raj ldf.fill.nta f25=[r25],16;; 1150b8d8b883SAshok Raj ldf.fill.nta f26=[r25],16;; 1151b8d8b883SAshok Raj ldf.fill.nta f27=[r25],16;; 1152b8d8b883SAshok Raj ldf.fill.nta f28=[r25],16;; 1153b8d8b883SAshok Raj ldf.fill.nta f29=[r25],16;; 1154b8d8b883SAshok Raj ldf.fill.nta f30=[r25],16;; 1155b8d8b883SAshok Raj ldf.fill.nta f31=[r25],16;; 1156b8d8b883SAshok Raj 1157b8d8b883SAshok Raj /* 1158b8d8b883SAshok Raj * Now that we have done all the register restores 1159b8d8b883SAshok Raj * we are now ready for the big DIVE to SAL Land 1160b8d8b883SAshok Raj */ 1161b8d8b883SAshok Raj ssm psr.ic;; 1162b8d8b883SAshok Raj srlz.d;; 1163b8d8b883SAshok Raj br.ret.sptk.many b0;; 1164b8d8b883SAshok RajEND(ia64_jump_to_sal) 1165b8d8b883SAshok Raj#endif /* CONFIG_HOTPLUG_CPU */ 1166b8d8b883SAshok Raj 11671da177e4SLinus Torvalds#endif /* CONFIG_SMP */ 1168