1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26#ifndef _SYS_CPR_IMPL_H 27#define _SYS_CPR_IMPL_H 28 29#pragma ident "%Z%%M% %I% %E% SMI" 30 31#ifdef __cplusplus 32extern "C" { 33#endif 34 35 36#ifndef _ASM 37 38#include <sys/processor.h> 39#include <sys/machparam.h> 40#include <sys/obpdefs.h> 41#include <sys/vnode.h> 42#include <sys/pte.h> 43 44/* 45 * This file contains machine dependent information for CPR 46 */ 47#define CPR_MACHTYPE_4U 0x3475 /* '4u' */ 48 49/* 50 * Information about the pages allocated via prom_retain(). 51 * Increase the number of CPR_PROM_RETAIN_CNT if more 52 * prom_retain() are called. 53 */ 54#define CPR_PROM_RETAIN_CNT 1 55#define CPR_PANICBUF 0 /* prom_retain() for panicbuf */ 56 57 58/* 59 * For 2.7 and later releases, sun4u cprboot is an ELF64 binary and must 60 * handle both ILP32 and LP64 kernels; while long and ptr sizes are fixed 61 * at 64-bits for cprboot these sizes are mixed between ILP32/LP64 kernels. 62 * To simplify handling of statefile data, we define fixed-size types for 63 * all sun4u kernels. 64 */ 65typedef uint64_t cpr_ptr; 66typedef uint64_t cpr_ext; 67 68struct cpr_map_info { 69 cpr_ptr virt; 70 cpr_ext phys; 71 uint_t size; 72}; 73 74 75#define CPR_MAX_TLB 16 76 77struct sun4u_tlb { 78 tte_t tte; /* tte data */ 79 cpr_ptr va_tag; /* virt tag */ 80 int index; /* tlb index */ 81 int tmp; /* clear during resume */ 82}; 83 84typedef struct sun4u_tlb sutlb_t; 85 86 87/* 88 * processor info 89 */ 90struct sun4u_cpu_info { 91 pnode_t node; 92 processorid_t cpu_id; 93}; 94 95 96/* 97 * This structure defines the fixed-length machine dependent data for 98 * sun4u ILP32 and LP64 systems. It is followed in the state file by 99 * a variable length section of null-terminated prom forth words: 100 * 101 * cpr_obp_tte_str for translating kernel mappings, unix-tte 102 * 103 * The total length (fixed plus variable) of the machine-dependent 104 * section is stored in cpr_machdep_desc.md_size 105 * 106 * WARNING: make sure all CPR_MD_* below match this structure 107 */ 108struct cpr_sun4u_machdep { 109 uint32_t ksb; /* 0x00: kernel stack bias */ 110 uint16_t kpstate; /* 0x04: kernel pstate */ 111 uint16_t kwstate; /* 0x06: kernel wstate */ 112 cpr_ptr thrp; /* 0x08: current thread ptr */ 113 cpr_ptr func; /* 0x10: jumpback virt text addr */ 114 cpr_ext qsav_pc; /* 0x18: qsav pc */ 115 cpr_ext qsav_sp; /* 0x20: qsav sp */ 116 int mmu_ctx_pri; /* 0x28: primary context */ 117 int mmu_ctx_sec; /* 0x2c: secondary context */ 118 cpr_ptr tmp_stack; /* 0x30: base of data page */ 119 cpr_ext tmp_stacksize; /* 0x38: leading area of data page */ 120 int test_mode; /* 0x40 */ 121 int pad; /* 0x44 */ 122 sutlb_t dtte[CPR_MAX_TLB]; /* 0x48 */ 123 sutlb_t itte[CPR_MAX_TLB]; /* 0x1c8 */ 124 struct sun4u_cpu_info sci[NCPU]; /* 0x348 */ 125}; 126typedef struct cpr_sun4u_machdep csu_md_t; 127 128#endif /* _ASM */ 129 130 131/* 132 * XXX - these should be generated by a genassym, 133 * but that doesn't work well for shared psm/kernel use 134 */ 135#define CPR_MD_KSB 0x00 136#define CPR_MD_KPSTATE 0x04 137#define CPR_MD_KWSTATE 0x06 138#define CPR_MD_THRP 0x08 139#define CPR_MD_FUNC 0x10 140#define CPR_MD_QSAV_PC 0x18 141#define CPR_MD_QSAV_SP 0x20 142#define CPR_MD_PRI 0x28 143#define CPR_MD_SEC 0x2c 144 145 146#ifndef _ASM 147 148#define CPRBOOT "-F cprboot" 149 150#define PN_TO_ADDR(pn) ((u_longlong_t)(pn) << MMU_PAGESHIFT) 151#define ADDR_TO_PN(pa) ((pa) >> MMU_PAGESHIFT) 152 153#define prom_map_plat(addr, pa, size) \ 154 if (prom_map(addr, pa, size) == 0) { \ 155 prom_printf("PROM_MAP failed: paddr=0x%lx\n", pa); \ 156 return (-1); \ 157 } 158 159typedef u_longlong_t physaddr_t; 160 161extern void i_cpr_machdep_setup(void); 162extern void i_cpr_save_machdep_info(void); 163extern void i_cpr_enable_intr(void); 164extern void i_cpr_set_tbr(void); 165extern void i_cpr_stop_intr(void); 166extern void i_cpr_handle_xc(int); 167extern void i_cpr_resume_setup(void *, csu_md_t *); 168extern int i_cpr_write_machdep(vnode_t *); 169extern int i_cpr_prom_pages(int); 170extern int i_cpr_reuseinit(void); 171extern int i_cpr_reusefini(void); 172extern int i_cpr_check_cprinfo(void); 173extern int i_cpr_reusable_supported(void); 174 175#endif /* _ASM */ 176 177#ifdef __cplusplus 178} 179#endif 180 181#endif /* _SYS_CPR_IMPL_H */ 182