fastboot.h revision 835b9930bd7bb9c7d0ed6d788e7314ffd3f3177d
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_FASTBOOT_H
#define _SYS_FASTBOOT_H
/*
* Platform dependent instruction sequences for fast reboot
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ASM
#include <sys/types.h>
#include <sys/mach_mmu.h>
#include <sys/md5.h>
#endif /* _ASM */
#define FASTBOOT_NAME_UNIX 0
#define FASTBOOT_NAME_BOOTARCHIVE 1
#define FASTBOOT_MAX_FILES_MAP 2 /* max number of files that needs mapping */
#define FASTBOOT_MAX_FILES_TOTAL 3 /* max number of files */
#define FASTBOOT_MAX_MD5_HASH (FASTBOOT_MAX_FILES_MAP + 1)
#define FASTBOOT_SWTCH_PA 0x5000 /* low memory */
#define FASTBOOT_STACK_OFFSET 0xe00 /* where the stack starts */
#define FASTBOOT_MAGIC ('F' << 24 | 'A' << 16 | 'S' << 8 | 'T')
#define FASTBOOT_UNIX 0
#define FASTBOOT_BOOTARCHIVE 1
#define FASTBOOT_SWTCH 2
/*
* Default sizes for varies information we have to save across boot for
* fast reboot. If the actual size is bigger than what we saved, abort
* fast reboot.
*/
#define FASTBOOT_SAVED_MMAP_COUNT 32
#define FASTBOOT_SAVED_DRIVES_MAX 8
#define FASTBOOT_SAVED_DRIVES_PORT_MAX 128
#define FASTBOOT_SAVED_DRIVES_SIZE \
((offsetof(struct mb_drive_info, drive_ports) + \
FASTBOOT_SAVED_DRIVES_PORT_MAX * sizeof (uint16_t)) * \
FASTBOOT_SAVED_DRIVES_MAX)
#define FASTBOOT_SAVED_CMDLINE_LEN MMU_PAGESIZE
/*
* dboot entry address comes from
* usr/src/uts/i86pc/conf/Mapfile and Mapfile.64.
*/
#define DBOOT_ENTRY_ADDRESS 0xc00000
/*
* Fake starting virtual address for creating mapping for the new kernel
* and boot_archive.
*/
#define FASTBOOT_FAKE_VA (2ULL << 30)
#define FASTBOOT_TERMINATE 0xdeadbee0 /* Terminating PTEs */
#ifndef _ASM
#define MAX_ELF32_LOAD_SECTIONS 3
/*
* Data structure for specifying each section in a 32-bit ELF file.
*/
typedef struct fastboot_section
{
uint32_t fb_sec_offset; /* offset */
uint32_t fb_sec_paddr; /* physical address */
uint32_t fb_sec_size; /* size */
uint32_t fb_sec_bss_size; /* section bss size */
} fastboot_section_t;
/*
* Data structure for describing each file that needs to be relocated from high
* memory to low memory for fast reboot. Currently these files are unix, the
* boot_archive, and the relocation function itself.
*/
typedef struct _fastboot_file {
uintptr_t fb_va; /* virtual address */
x86pte_t *fb_pte_list_va; /* VA for PTE list */
paddr_t fb_pte_list_pa; /* PA for PTE list */
size_t fb_pte_list_size; /* size of PTE list */
uintptr_t fb_dest_pa; /* destination PA */
size_t fb_size; /* file size */
uintptr_t fb_next_pa;
fastboot_section_t fb_sections[MAX_ELF32_LOAD_SECTIONS];
int fb_sectcnt; /* actual number of sections */
} fastboot_file_t;
/*
* Data structure containing all the information the switching routine needs
* for fast rebooting to the new kernel.
*
* NOTE: There is limited stack space (0x200 bytes) in the switcher to
* copy in the data structure. Fields that are not absolutely necessary for
* the switcher should be added after the fi_valid field.
*/
typedef struct _fastboot_info {
uint32_t fi_magic; /* magic for fast reboot */
fastboot_file_t fi_files[FASTBOOT_MAX_FILES_TOTAL];
int fi_has_pae;
uintptr_t fi_pagetable_va;
paddr_t fi_pagetable_pa;
paddr_t fi_last_table_pa;
paddr_t fi_new_mbi_pa; /* new multiboot info PA */
int fi_valid; /* is the new kernel valid */
uintptr_t fi_next_table_va;
paddr_t fi_next_table_pa;
uint_t *fi_shift_amt;
uint_t fi_ptes_per_table;
uint_t fi_lpagesize;
int fi_top_level; /* top level of page tables */
size_t fi_pagetable_size; /* size allocated for pt */
uintptr_t fi_new_mbi_va; /* new multiboot info VA */
size_t fi_mbi_size; /* size allocated for mbi */
uchar_t fi_md5_hash[FASTBOOT_MAX_MD5_HASH][MD5_DIGEST_LENGTH];
} fastboot_info_t;
/*
* Fast reboot core functions
*/
extern void fast_reboot(); /* Entry point for fb_switch */
extern void fastboot_load_kernel(char *); /* Load a new kernel */
extern int fastboot_cksum_verify(fastboot_info_t *);
/*
* Fast reboot tunables
*/
/* If set, the system is capable of fast reboot */
extern int fastreboot_capable;
/*
* If set, force fast reboot even if the system has
* drivers without quiesce(9E) implementation.
*/
extern int force_fastreboot;
/* If set, fast reboot after panic. */
extern volatile int fastreboot_onpanic;
extern char fastreboot_onpanic_cmdline[FASTBOOT_SAVED_CMDLINE_LEN];
/* Variables for avoiding panic/reboot loop */
extern clock_t fastreboot_onpanic_uptime;
extern clock_t lbolt_at_boot, panic_lbolt;
#endif /* _ASM */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_FASTBOOT_H */