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 _CPRBOOT_H 27 #define _CPRBOOT_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 /* 36 * defs for sun4u cprboot 37 */ 38 39 /* 40 * select virt ranges well past _end; 41 * these ranges are used for tmp tlb entries 42 * 43 * CB_SRC_VIRT source statefile buffer pages 44 * CB_DST_VIRT destination kernel pages 45 * CB_STACK_VIRT new stack 46 * CB_HIGH_VIRT ...and above for the bitmap and co. 47 */ 48 49 #define CB_SRC_VIRT 0x200000 50 #define CB_DST_VIRT 0x300000 51 #define CB_STACK_VIRT 0x400000 52 #define CB_HIGH_VIRT 0x500000 53 54 /* 55 * master cpu and slave cpu stack sizes 56 * their sum should be (n * MMU_PAGESIZE) 57 */ 58 #define CB_MSS 0x009000 59 #define CB_SSS 0x001000 60 #define CB_STACK_SIZE (CB_MSS + CB_SSS) 61 62 63 /* 64 * max number of tlb entries and tmp pages for 65 * src statefile buf pages and dst kernel pages 66 */ 67 #define CB_MAX_KPAGES mmu_btop(CPR_MAX_BLOCK) 68 #define CB_MAX_BPAGES (CB_MAX_KPAGES + 1) 69 70 #define ERR -1 71 72 73 #ifndef _ASM 74 75 #define CB_VPRINTF(args) \ 76 if (verbose) prom_printf args 77 78 #define CB_VENTRY(name) \ 79 CB_VPRINTF((ent_fmt, #name, entry)) 80 81 #define NULLP (char *)0 82 83 #define CPR_DBG(n) (cpr_debug & CPR_DEBUG##n) 84 85 86 /* 87 * info for handling statefile data 88 */ 89 struct statefile { 90 int fd; /* prom file handle */ 91 int kpages; /* total number of kernel pages */ 92 size_t size; /* file size, rounded for alloc */ 93 caddr_t buf; /* allocated file buffer */ 94 size_t buf_offset; /* byte offset from buf */ 95 uint_t *buf_map; /* map of buf phys page numbers */ 96 pfn_t low_ppn; /* lowest buf ppn */ 97 pfn_t high_ppn; /* highest buf ppn */ 98 int npages; /* nubmer of pages restored */ 99 int ngroups; /* number of page groups restored */ 100 int outside; /* kpage is outside of buf range */ 101 int precede; /* kpage preceeds buf offset */ 102 int move; /* number of buf pages moved */ 103 int recycle; /* free tmp page for reuse */ 104 }; 105 106 /* 107 * convert a statefile buffer byte-offset into a buffer ppn; 108 * buf_map starts out as an identity map, and gets updated as 109 * pages are moved; the original ppn can always be derived 110 * from the ORIG macro: 111 */ 112 #define SF_BUF_PPN(off) *(sfile.buf_map + mmu_btop(off)) 113 #define SF_ORIG_PPN(off) sfile.low_ppn + mmu_btop(off) 114 #define SF_SAME_PPN(off) (SF_BUF_PPN(off) == SF_ORIG_PPN(off)) 115 #define SF_DIFF_PPN(off) (SF_BUF_PPN(off) != SF_ORIG_PPN(off)) 116 117 #define SF_STAT_INC(field) sfile.field++ 118 119 120 /* 121 * next data in statefile buffer 122 */ 123 #define SF_DATA() sfile.buf + sfile.buf_offset 124 125 /* 126 * advance statefile buffer offset 127 */ 128 #define SF_ADV(len) sfile.buf_offset += len 129 130 /* 131 * struct data is written to the statefile without any alignment 132 * handling; for easy access, struct data gets copied to aligned 133 * space and the buf data pointer is advanced 134 */ 135 #define SF_DCOPY(space) \ 136 bcopy(SF_DATA(), &space, sizeof (space)); \ 137 SF_ADV(sizeof (space)) 138 139 140 /* 141 * structure of "available" property from /memory node 142 */ 143 struct prom_physavail { 144 physaddr_t base; /* start of phys range */ 145 size_t size; /* size of phys range */ 146 }; 147 148 struct avail_range { 149 pfn_t low; 150 pfn_t high; 151 pgcnt_t nfree; 152 }; 153 154 typedef struct prom_physavail pphav_t; 155 typedef struct avail_range arange_t; 156 157 158 /* 159 * prom properties and data 160 */ 161 struct cb_props { 162 caddr_t prop; 163 uint_t *datap; 164 }; 165 166 167 /* 168 * ../../common/support.c 169 */ 170 extern int cpr_reset_properties(void); 171 extern int cpr_locate_statefile(char *, char *); 172 extern void cpr_update_terminator(ctrm_t *, caddr_t); 173 174 /* 175 * cprboot.c 176 */ 177 extern struct statefile sfile; 178 extern char prog[]; 179 extern char rsvp[]; 180 extern char entry[]; 181 extern char ent_fmt[]; 182 extern int verbose; 183 extern uint_t cb_dents; 184 extern uint_t cb_msec; 185 186 /* 187 * machdep.c 188 */ 189 extern int cpr_test_mode; 190 extern csu_md_t mdinfo; 191 extern uint_t cpu_delay; 192 extern uint_t cb_mid; 193 extern uint_t cb_clock_freq; 194 extern int cb_check_machdep(void); 195 extern int cb_interpret(void); 196 extern int cb_ksetup(void); 197 extern int cb_mpsetup(void); 198 extern void slave_init(int); 199 200 /* 201 * pages.c 202 */ 203 extern int cb_restore_kpages(void); 204 extern int cb_terminator(void); 205 206 /* 207 * bitmap.c 208 */ 209 extern int cb_nbitmaps; 210 extern pfn_t find_apage(void); 211 extern int cb_set_bitmap(void); 212 extern int cb_get_newstack(void); 213 extern int cb_tracking_setup(void); 214 extern int cb_get_physavail(void); 215 extern int cb_relocate(void); 216 217 /* 218 * util.c 219 */ 220 extern int cpr_statefile_open(char *, char *); 221 extern int cpr_statefile_close(int); 222 extern int cpr_read(int, caddr_t, size_t); 223 extern void cb_spin(void); 224 extern pfn_t cpr_vatopfn(caddr_t); 225 extern int prom_remap(size_t, caddr_t, physaddr_t); 226 extern void install_remap(void); 227 extern int cb_alloc(size_t, uint_t, caddr_t *, physaddr_t *); 228 extern int cb_mountroot(void); 229 extern int cb_unmountroot(void); 230 extern int cb_get_props(void); 231 extern void cb_mapin(caddr_t, pfn_t, uint_t, uint_t, uint_t); 232 extern int cb_usb_setup(void); 233 extern void cb_enter_mon(void); 234 extern void cb_exit_to_mon(void); 235 extern int cpr_fs_close(int); 236 extern int cpr_fs_open(char *); 237 extern int cpr_fs_read(int, char *, int); 238 extern int cpr_fs_seek(int, offset_t); 239 extern int cpr_read(int, char *, size_t); 240 241 /* 242 * cb_srt0.s 243 */ 244 extern caddr_t _end[]; 245 extern void *estack; 246 extern void _start(void *, ...); 247 extern void exit_to_kernel(void *, csu_md_t *); 248 extern void bzero(void *, size_t); 249 extern void phys_xcopy(physaddr_t, physaddr_t, size_t); 250 extern void ptov_bcopy(physaddr_t, void *, size_t); 251 extern void get_dtlb_entry(int, caddr_t *, tte_t *); 252 extern void set_dtlb_entry(int, caddr_t, tte_t *); 253 extern void set_itlb_entry(int, caddr_t, tte_t *); 254 extern void cpu_launch(int); 255 extern void cb_usec_wait(int); 256 extern void membar_stld(void); 257 extern uint_t getmid(void); 258 259 #endif /* !_ASM */ 260 261 #ifdef __cplusplus 262 } 263 #endif 264 265 #endif /* _CPRBOOT_H */ 266