1/* $NetBSD: ssc.c,v 1.4 2020/01/14 16:23:07 scole Exp $ */ 2 3/*- 4 * Copyright (c) 2001 Doug Rabson 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> 30/* __FBSDID("$FreeBSD: src/sys/boot/ia64/libski/ssc.c,v 1.4 2003/09/08 09:11:32 obrien Exp $"); */ 31 32#include <lib/libsa/stand.h> 33#include <lib/libsa/loadfile.h> 34#include "bootstrap.h" 35#include "libski.h" 36 37/* 38 * Ugh... Work around a bug in the Linux version of ski for SSC_GET_RTC. The 39 * PSR.dt register is not preserved properly and causes further memory 40 * references to be done without translation. All we need to do is preserve 41 * PSR.dt across the SSC call. We do this by saving and restoring psr.l 42 * completely. 43 */ 44 45__attribute__((__noinline__)) 46u_int64_t 47ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) 48{ 49 register u_int64_t psr; 50 register u_int64_t ret0 __asm("r8"); 51 52 __asm __volatile("mov %0=psr;;" : "=r"(psr)); 53 __asm __volatile("mov r15=%1\n\t" 54 "break 0x80000;;" 55 : "=r"(ret0) 56 : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3)); 57 __asm __volatile("mov psr.l=%0;; srlz.d" :: "r"(psr)); 58 return ret0; 59} 60