Home | History | Annotate | Line # | Download | only in prekern
prekern.h revision 1.8
      1 /*	$NetBSD: prekern.h,v 1.8 2017/11/10 08:52:57 maxv Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
      5  *
      6  * This code is derived from software contributed to The NetBSD Foundation
      7  * by Maxime Villard.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     28  * POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include <sys/cdefs.h>
     32 #include <sys/param.h>
     33 #include <sys/stdbool.h>
     34 #include <machine/pte.h>
     35 
     36 #include "pdir.h"
     37 #include "redef.h"
     38 
     39 #define MM_PROT_READ	0x00
     40 #define MM_PROT_WRITE	0x01
     41 #define MM_PROT_EXECUTE	0x02
     42 
     43 #define ASSERT(a) if (!(a)) fatal("ASSERT");
     44 typedef uint64_t paddr_t;
     45 typedef uint64_t vaddr_t;
     46 typedef uint64_t pt_entry_t;
     47 typedef uint64_t pd_entry_t;
     48 typedef uint64_t pte_prot_t;
     49 #define WHITE_ON_BLACK 0x07
     50 #define RED_ON_BLACK 0x04
     51 #define GREEN_ON_BLACK 0x02
     52 
     53 #define HEAD_WINDOW_BASE	(KERNBASE - NBPD_L3)
     54 #define HEAD_WINDOW_SIZE	NBPD_L3
     55 
     56 #define KASLR_WINDOW_BASE	KERNBASE		/* max - 2GB */
     57 #define KASLR_WINDOW_SIZE	(2LLU * (1 << 30))	/* 2GB */
     58 
     59 /* -------------------------------------------------------------------------- */
     60 
     61 static inline void
     62 memcpy(void *dst, void *src, size_t sz)
     63 {
     64 	char *bdst = dst, *bsrc = src;
     65 	while (sz > 0) {
     66 		*bdst = *bsrc;
     67 		bdst++, bsrc++, sz--;
     68 	}
     69 }
     70 
     71 static inline void
     72 memset(void *dst, char c, size_t sz)
     73 {
     74 	char *bdst = dst;
     75 	while (sz > 0) {
     76 		*bdst = c;
     77 		bdst++, sz--;
     78 	}
     79 }
     80 
     81 static inline int
     82 memcmp(const char *a, const char *b, size_t c)
     83 {
     84 	size_t i;
     85 	for (i = 0; i < c; i++) {
     86 		if (a[i] != b[i])
     87 			return 1;
     88 	}
     89 	return 0;
     90 }
     91 
     92 static inline int
     93 strcmp(char *a, char *b)
     94 {
     95 	size_t i;
     96 	for (i = 0; a[i] != '\0'; i++) {
     97 		if (a[i] != b[i])
     98 			return 1;
     99 	}
    100 	return 0;
    101 }
    102 
    103 /* -------------------------------------------------------------------------- */
    104 
    105 struct bootspace {
    106 	struct {
    107 		vaddr_t va;
    108 		paddr_t pa;
    109 		size_t sz;
    110 	} head;
    111 	struct {
    112 		vaddr_t va;
    113 		paddr_t pa;
    114 		size_t sz;
    115 	} text;
    116 	struct {
    117 		vaddr_t va;
    118 		paddr_t pa;
    119 		size_t sz;
    120 	} rodata;
    121 	struct {
    122 		vaddr_t va;
    123 		paddr_t pa;
    124 		size_t sz;
    125 	} data;
    126 	struct {
    127 		vaddr_t va;
    128 		paddr_t pa;
    129 		size_t sz;
    130 	} boot;
    131 	vaddr_t spareva;
    132 	vaddr_t pdir;
    133 	vaddr_t emodule;
    134 };
    135 
    136 /* console.c */
    137 void init_cons();
    138 void print_ext(int, char *);
    139 void print(char *);
    140 void print_state(bool, char *);
    141 void print_banner();
    142 
    143 /* elf.c */
    144 size_t elf_get_head_size(vaddr_t);
    145 void elf_build_head(vaddr_t);
    146 void elf_get_text(paddr_t *, size_t *);
    147 void elf_build_text(vaddr_t, paddr_t);
    148 void elf_get_rodata(paddr_t *, size_t *);
    149 void elf_build_rodata(vaddr_t, paddr_t);
    150 void elf_get_data(paddr_t *, size_t *);
    151 void elf_build_data(vaddr_t, paddr_t);
    152 void elf_build_boot(vaddr_t, paddr_t);
    153 vaddr_t elf_kernel_reloc();
    154 
    155 /* locore.S */
    156 void cpuid(uint32_t, uint32_t, uint32_t *);
    157 void lidt(void *);
    158 uint64_t rdtsc();
    159 int rdseed(uint64_t *);
    160 void jump_kernel();
    161 
    162 /* mm.c */
    163 void mm_init(paddr_t);
    164 paddr_t mm_vatopa(vaddr_t);
    165 void mm_bootspace_mprotect();
    166 void mm_map_kernel();
    167 
    168 /* prekern.c */
    169 void fatal(char *);
    170