usr/src/uts/sun4/os/startup.c
author andrei
Fri, 17 Feb 2006 17:24:21 -0800
changeset 1455 b43f098fa50c
parent 1253 0df630a41817
child 1492 8877aa3d25de
permissions -rw-r--r--
6378953 allocation of interrupt threads could be more common
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
     5
 * Common Development and Distribution License (the "License").
1455
b43f098fa50c 6378953 allocation of interrupt threads could be more common
andrei
parents: 1253
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
    23
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/machsystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/archsystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/vm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/cpu.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/atomic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/reboot.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/kdi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/bootconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/memlist_plat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/memlist_impl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/prom_plat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/prom_isa.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/autoconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/intreg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/ivintr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/fpu/fpusystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/iommutsb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <vm/vm_dep.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <vm/seg_dev.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <vm/seg_kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <vm/seg_kpm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <vm/seg_map.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <vm/seg_kp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/sysconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <vm/hat_sfmmu.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/kobj.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/sun4asi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/clconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <sys/platform_module.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/panic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/cpu_sgnblk_defs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <sys/clock.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <sys/promif.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/prom_debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <sys/traptrace.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <sys/memnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <sys/mem_cage.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
extern void setup_trap_table(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
extern void cpu_intrq_setup(struct cpu *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
extern void cpu_intrq_register(struct cpu *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
extern void contig_mem_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
extern void mach_dump_buffer_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
extern void mach_descrip_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
extern void mach_memscrub(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
extern void mach_fpras(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
extern void mach_cpu_halt_idle(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
extern void mach_hw_copy_limit(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
extern void load_tod_module(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#pragma weak load_tod_module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
extern int ndata_alloc_mmfsa(struct memlist *ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#pragma weak ndata_alloc_mmfsa
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
extern void parse_idprom(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
extern void add_vx_handler(char *, int, void (*)(cell_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
extern void mem_config_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
extern void memseg_remap_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 * External Data:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
extern int vac_size;	/* cache size in bytes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
extern uint_t vac_mask;	/* VAC alignment consistency mask */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
extern uint_t vac_colors;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 * Global Data Definitions:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 * XXX - Don't port this to new architectures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 * A 3rd party volume manager driver (vxdm) depends on the symbol romp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 * 'romp' has no use with a prom with an IEEE 1275 client interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
 * The driver doesn't use the value, but it depends on the symbol.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
void *romp;		/* veritas driver won't load without romp 4154976 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 * Declare these as initialized data so we can patch them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
pgcnt_t physmem = 0;	/* memory size in pages, patch if you want less */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
pgcnt_t segkpsize =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
    btop(SEGKPDEFSIZE);	/* size of segkp segment in pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
uint_t segmap_percent = 12; /* Size of segmap segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
int use_cache = 1;		/* cache not reliable (605 bugs) with MP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
int vac_copyback = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
char *cache_mode = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
int use_mix = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
int prom_debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
struct bootops *bootops = 0;	/* passed in from boot in %o2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
caddr_t boot_tba;		/* %tba at boot - used by kmdb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
uint_t	tba_taken_over = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
caddr_t s_text;			/* start of kernel text segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
caddr_t e_text;			/* end of kernel text segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
caddr_t s_data;			/* start of kernel data segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
caddr_t e_data;			/* end of kernel data segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
caddr_t modtext;		/* beginning of module text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
size_t	modtext_sz;		/* size of module text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
caddr_t moddata;		/* beginning of module data reserve */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
caddr_t e_moddata;		/* end of module data reserve */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
 * End of first block of contiguous kernel in 32-bit virtual address space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
caddr_t		econtig32;	/* end of first blk of contiguous kernel */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
caddr_t		ncbase;		/* beginning of non-cached segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
caddr_t		ncend;		/* end of non-cached segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
caddr_t		sdata;		/* beginning of data segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
caddr_t		extra_etva;	/* beginning of unused nucleus text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
pgcnt_t		extra_etpg;	/* number of pages of unused nucleus text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
size_t	ndata_remain_sz;	/* bytes from end of data to 4MB boundary */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
caddr_t	nalloc_base;		/* beginning of nucleus allocation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
caddr_t nalloc_end;		/* end of nucleus allocatable memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
caddr_t valloc_base;		/* beginning of kvalloc segment	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
caddr_t kmem64_base;		/* base of kernel mem segment in 64-bit space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
caddr_t kmem64_end;		/* end of kernel mem segment in 64-bit space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
uintptr_t shm_alignment = 0;	/* VAC address consistency modulus */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
struct memlist *phys_install;	/* Total installed physical memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
struct memlist *phys_avail;	/* Available (unreserved) physical memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
struct memlist *virt_avail;	/* Available (unmapped?) virtual memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
struct memlist ndata;		/* memlist of nucleus allocatable memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
int memexp_flag;		/* memory expansion card flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
uint64_t ecache_flushaddr;	/* physical address used for flushing E$ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
pgcnt_t obp_pages;		/* Physical pages used by OBP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
 * VM data structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
long page_hashsz;		/* Size of page hash table (power of two) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
struct page *pp_base;		/* Base of system page struct array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
size_t pp_sz;			/* Size in bytes of page struct array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
struct page **page_hash;	/* Page hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
struct seg ktextseg;		/* Segment used for kernel executable image */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
struct seg kvalloc;		/* Segment used for "valloc" mapping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
struct seg kpseg;		/* Segment used for pageable kernel virt mem */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
struct seg ktexthole;		/* Segment used for nucleus text hole */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
struct seg kmapseg;		/* Segment used for generic kernel mappings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
struct seg kpmseg;		/* Segment used for physical mapping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
struct seg kdebugseg;		/* Segment used for the kernel debugger */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
uintptr_t kpm_pp_base;		/* Base of system kpm_page array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
size_t	kpm_pp_sz;		/* Size of system kpm_page array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
pgcnt_t	kpm_npages;		/* How many kpm pages are managed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
struct seg *segkp = &kpseg;	/* Pageable kernel virtual memory segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
struct seg *segkmap = &kmapseg;	/* Kernel generic mapping segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
struct seg *segkpm = &kpmseg;	/* 64bit kernel physical mapping segment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * debugger pages (if allocated)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
struct vnode kdebugvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 * Segment for relocated kernel structures in 64-bit large RAM kernels
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
struct seg kmem64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
struct memseg *memseg_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
size_t memseg_sz;		/* Used to translate a va to page */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
struct vnode unused_pages_vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 * VM data structures allocated early during boot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
size_t pagehash_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
uint64_t memlist_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
char tbr_wr_addr_inited = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
 * Static Routines:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
static void memlist_add(uint64_t, uint64_t, struct memlist **,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	struct memlist **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
static void kphysm_init(page_t *, struct memseg *, pgcnt_t, uintptr_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	pgcnt_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
static void kvm_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
static void startup_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
static void startup_memlist(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
static void startup_modules(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
static void startup_bop_gone(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
static void startup_vm(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
static void startup_end(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
static void setup_cage_params(void);
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
   226
static void startup_create_io_node(void);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
static pgcnt_t npages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
static struct memlist *memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
void *memlist_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
static pgcnt_t bop_alloc_pages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
static caddr_t hblk_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
uint_t hblk_alloc_dynamic = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
uint_t hblk1_min = H1MIN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
uint_t hblk8_min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 * Hooks for unsupported platforms and down-rev firmware
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
int iam_positron(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
#pragma weak iam_positron
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
static void do_prom_version_check(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
static void kpm_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
static void kpm_npages_setup(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
static void kpm_memseg_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
 * After receiving a thermal interrupt, this is the number of seconds
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
 * to delay before shutting off the system, assuming
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
 * shutdown fails.  Use /etc/system to change the delay if this isn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
 * large enough.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
int thermal_powerdown_delay = 1200;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
 * Used to hold off page relocations into the cage until OBP has completed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
 * its boot-time handoff of its resources to the kernel.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
int page_relocate_ready = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 * Enable some debugging messages concerning memory usage...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
#ifdef  DEBUGGING_MEM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
static int debugging_mem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
printmemlist(char *title, struct memlist *list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	if (!debugging_mem)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	printf("%s\n", title);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	while (list) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		prom_printf("\taddr = 0x%x %8x, size = 0x%x %8x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		    (uint32_t)(list->address >> 32), (uint32_t)list->address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		    (uint32_t)(list->size >> 32), (uint32_t)(list->size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		list = list->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
printmemseg(struct memseg *memseg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	if (!debugging_mem)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	printf("memseg\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	while (memseg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		prom_printf("\tpage = 0x%p, epage = 0x%p, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		    "pfn = 0x%x, epfn = 0x%x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		    memseg->pages, memseg->epages,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		    memseg->pages_base, memseg->pages_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		memseg = memseg->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
#define	debug_pause(str)	halt((str))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
#define	MPRINTF(str)		if (debugging_mem) prom_printf((str))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
#define	MPRINTF1(str, a)	if (debugging_mem) prom_printf((str), (a))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
#define	MPRINTF2(str, a, b)	if (debugging_mem) prom_printf((str), (a), (b))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
#define	MPRINTF3(str, a, b, c) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	if (debugging_mem) prom_printf((str), (a), (b), (c))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
#else	/* DEBUGGING_MEM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
#define	MPRINTF(str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
#define	MPRINTF1(str, a)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
#define	MPRINTF2(str, a, b)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
#define	MPRINTF3(str, a, b, c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
#endif	/* DEBUGGING_MEM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
/* Simple message to indicate that the bootops pointer has been zeroed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
static int bootops_gone_on = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
#define	BOOTOPS_GONE() \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	if (bootops_gone_on) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		prom_printf("The bootops vec is zeroed now!\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
#define	BOOTOPS_GONE()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#endif /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
 * Monitor pages may not be where this says they are.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
 * and the debugger may not be there either.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
 * Note that 'pages' here are *physical* pages, which are 8k on sun4u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
 *                        Physical memory layout
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
 *                     (not necessarily contiguous)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
 *                       (THIS IS SOMEWHAT WRONG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
 *                       /-----------------------\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
 *                       |       monitor pages   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
 *             availmem -|-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 *                       |       page pool       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
 *                       |   configured tables   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
 *                       |       buffers         |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
 *            firstaddr -|-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
 *                       |   hat data structures |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
 *                       |    kernel data, bss   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
 *                       |    interrupt stack    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
 *                       |    kernel text (RO)   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
 *                       |    trap table (4k)    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
 *               page 1  |      panicbuf         |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
 *               page 0  |       reclaimed       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
 *                       |_______________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
 *                    Kernel's Virtual Memory Layout.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
 *                       /-----------------------\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
 * 0xFFFFFFFF.FFFFFFFF  -|                       |-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
 *                       |   OBP's virtual page  |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
 *                       |        tables         |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
 * 0xFFFFFFFC.00000000  -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
 * 0xFFFFFE00.00000000  -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
 *                       |                       |  Ultrasparc I/II support
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
 *                       |    segkpm segment     |  up to 2TB of physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
 *                       | (64-bit kernel ONLY)  |  memory, VAC has 2 colors
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
 * 0xFFFFFA00.00000000  -|-----------------------|- 2TB segkpm alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
 * 0xFFFFF810.00000000  -|-----------------------|- hole_end
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
 *                       |                       |      ^
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
 *                       |  UltraSPARC I/II call |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
 *                       | bug requires an extra |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 *                       | 4 GB of space between |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 *                       |   hole and used RAM   |	|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 *                       |                       |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
 * 0xFFFFF800.00000000  -|-----------------------|-     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
 *                       |                       |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 *                       | Virtual Address Hole  |   UltraSPARC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
 *                       |  on UltraSPARC I/II   |  I/II * ONLY *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
 *                       |                       |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
 * 0x00000800.00000000  -|-----------------------|-     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
 *                       |                       |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
 *                       |  UltraSPARC I/II call |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
 *                       | bug requires an extra |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
 *                       | 4 GB of space between |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
 *                       |   hole and used RAM   |      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
 *                       |                       |      v
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
 * 0x000007FF.00000000  -|-----------------------|- hole_start -----
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
 *                       :                       :		   ^
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
 *                       :                       :		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
 * 0x00000XXX.XXXXXXXX  -|-----------------------|- kmem64_end	   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
 *                       |                       |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
 *                       |   64-bit kernel ONLY  |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
 *                       |                       |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
 *                       |    kmem64 segment     |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
 *                       |                       |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
 *                       | (Relocated extra HME  |	     Approximately
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
 *                       |   block allocations,  |	    1 TB of virtual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
 *                       |   memnode freelists,  |	     address space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
 *                       |    HME hash buckets,  |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
 *                       | mml_table, kpmp_table,|		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
 *                       |  page_t array and     |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
 *                       |  hashblock pool to    |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
 *                       |   avoid hard-coded    |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
 *                       |     32-bit vaddr      |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
 *                       |     limitations)      |		   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
 *                       |                       |		   v
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
 * 0x00000700.00000000  -|-----------------------|- SYSLIMIT (kmem64_base)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
 *                       |  segkmem segment      | (SYSLIMIT - SYSBASE = 4TB)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
 * 0x00000300.00000000  -|-----------------------|- SYSBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 *                      -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 *                       |  segmap segment       |   SEGMAPSIZE (1/8th physmem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 *                       |                       |               256G MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
 * 0x000002a7.50000000  -|-----------------------|- SEGMAPBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
 *                      -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 *                       |       segkp           |    SEGKPSIZE (2GB)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
 * 0x000002a1.00000000  -|-----------------------|- SEGKPBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
 * 0x000002a0.00000000  -|-----------------------|- MEMSCRUBBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
 *                       |                       |       (SEGKPBASE - 0x400000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
 * 0x0000029F.FFE00000  -|-----------------------|- ARGSBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
 *                       |                       |       (MEMSCRUBBASE - NCARGS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
 * 0x0000029F.FFD80000  -|-----------------------|- PPMAPBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
 *                       |                       |       (ARGSBASE - PPMAPSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
 * 0x0000029F.FFD00000  -|-----------------------|- PPMAP_FAST_BASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
 * 0x0000029F.FF980000  -|-----------------------|- PIOMAPBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
 * 0x0000029F.FF580000  -|-----------------------|- NARG_BASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
 * 0x00000000.FFFFFFFF  -|-----------------------|- OFW_END_ADDR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 *                       |         OBP           |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 * 0x00000000.F0000000  -|-----------------------|- OFW_START_ADDR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
 *                       |         kmdb          |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
 * 0x00000000.EDD00000  -|-----------------------|- SEGDEBUGBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
 * 0x00000000.7c000000  -|-----------------------|- SYSLIMIT32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
 *                       |  segkmem32 segment    | (SYSLIMIT32 - SYSBASE32 =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
 *                       |                       |    ~64MB)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
 * 0x00000000.78002000  -|-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
 *                       |     panicbuf          |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
 * 0x00000000.78000000  -|-----------------------|- SYSBASE32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
 *                       |-----------------------|- econtig32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
 *                       |    vm structures      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
 * 0x00000000.01C00000   |-----------------------|- nalloc_end
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
 *                       |         TSBs          |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
 *                       |-----------------------|- end/nalloc_base
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
 *                       |   kernel data & bss   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
 * 0x00000000.01800000  -|-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
 *                       :   nucleus text hole   :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
 * 0x00000000.01400000  -|-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
 *                       |      module text      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
 *                       |-----------------------|- e_text/modtext
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
 *                       |      kernel text      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
 *                       |    trap table (48k)   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
 * 0x00000000.01000000  -|-----------------------|- KERNELBASE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
 *                       | reserved for trapstat |} TSTAT_TOTAL_SIZE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
 *                       |-----------------------|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
 *                       |        invalid        |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
 * 0x00000000.00000000  _|_______________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
 *                   32-bit User Virtual Memory Layout.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
 *                       /-----------------------\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
 *                       |        invalid        |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
 *          0xFFC00000  -|-----------------------|- USERLIMIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
 *                       |       user stack      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
 *                       |       user data       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
 *                      -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
 *                       |       user text       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
 *          0x00002000  -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
 *                       |       invalid         |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
 *          0x00000000  _|_______________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 *                   64-bit User Virtual Memory Layout.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
 *                       /-----------------------\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
 *                       |        invalid        |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
 *                       |                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
 *  0xFFFFFFFF.80000000 -|-----------------------|- USERLIMIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
 *                       |       user stack      |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
 *                       :                       :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
 *                       |       user data       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
 *                      -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
 *                       |       user text       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
 *  0x00000000.00100000 -|-----------------------|-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
 *                       |       invalid         |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
 *  0x00000000.00000000 _|_______________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
extern caddr_t ecache_init_scrub_flush_area(caddr_t alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
extern uint64_t ecache_flush_address(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
#pragma weak load_platform_modules
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
#pragma weak starcat_startup_memlist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
#pragma weak ecache_init_scrub_flush_area
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
#pragma weak ecache_flush_address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 * By default the DR Cage is enabled for maximum OS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 * MPSS performance.  Users needing to disable the cage mechanism
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
 * can set this variable to zero via /etc/system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
 * Disabling the cage on systems supporting Dynamic Reconfiguration (DR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
 * will result in loss of DR functionality.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
 * Platforms wishing to disable kernel Cage by default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 * should do so in their set_platform_defaults() routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
int	kernel_cage_enable = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
setup_cage_params(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	void (*func)(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	func = (void (*)(void))kobj_getsymvalue("set_platform_cage_params", 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	if (func != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		(*func)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	if (kernel_cage_enable == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	kcage_range_lock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	if (kcage_range_init(phys_avail, 1) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		kcage_init(total_pages / 256);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	kcage_range_unlock();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	if (kcage_on) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		cmn_err(CE_NOTE, "!Kernel Cage is ENABLED");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		cmn_err(CE_NOTE, "!Kernel Cage is DISABLED");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
 * Machine-dependent startup code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
startup(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	startup_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	if (&startup_platform)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		startup_platform();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	startup_memlist();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	startup_modules();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	setup_cage_params();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	startup_bop_gone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	startup_vm();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	startup_end();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
struct regs sync_reg_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
uint64_t sync_tt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
sync_handler(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	struct  trap_info 	ti;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	 * Prevent trying to talk to the other CPUs since they are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	 * sitting in the prom and won't reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	for (i = 0; i < NCPU; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		if ((i != CPU->cpu_id) && CPU_XCALL_READY(i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
			cpu[i]->cpu_flags &= ~CPU_READY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
			cpu[i]->cpu_flags |= CPU_QUIESCED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
			CPUSET_DEL(cpu_ready_set, cpu[i]->cpu_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	 * We've managed to get here without going through the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	 * normal panic code path. Try and save some useful
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	 * information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	if (!panicstr && (curthread->t_panic_trap == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		ti.trap_type = sync_tt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
		ti.trap_regs = &sync_reg_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
		ti.trap_addr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		ti.trap_mmu_fsr = 0x0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		curthread->t_panic_trap = &ti;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	 * If we're re-entering the panic path, update the signature
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	 * block so that the SC knows we're in the second part of panic.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	if (panicstr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		CPU_SIGNATURE(OS_SIG, SIGST_EXIT, SIGSUBST_DUMP, -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	nopanicdebug = 1; /* do not perform debug_enter() prior to dump */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	panic("sync initiated");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
startup_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	 * We want to save the registers while we're still in OBP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	 * so that we know they haven't been fiddled with since.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	 * (In principle, OBP can't change them just because it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	 * makes a callback, but we'd rather not depend on that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	 * behavior.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	char		sync_str[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		"warning @ warning off : sync "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		"%%tl-c %%tstate h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
		"%%g1 h# %p x! %%g2 h# %p x! %%g3 h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		"%%g4 h# %p x! %%g5 h# %p x! %%g6 h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
		"%%g7 h# %p x! %%o0 h# %p x! %%o1 h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		"%%o2 h# %p x! %%o3 h# %p x! %%o4 h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
		"%%o5 h# %p x! %%o6 h# %p x! %%o7 h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		"%%tl-c %%tpc h# %p x! %%tl-c %%tnpc h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		"%%y h# %p l! %%tl-c %%tt h# %p x! "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		"sync ; warning !";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	 * 20 == num of %p substrings
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	 * 16 == max num of chars %p will expand to.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	char 		bp[sizeof (sync_str) + 16 * 20];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	(void) check_boot_version(BOP_GETVERSION(bootops));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	 * Initialize ptl1 stack for the 1st CPU.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	ptl1_init_cpu(&cpu0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	 * Initialize the address map for cache consistent mappings
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	 * to random pages; must be done after vac_size is set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	ppmapinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	 * Initialize the PROM callback handler.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	init_vx_handler();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	 * have prom call sync_callback() to handle the sync and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	 * save some useful information which will be stored in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	 * core file later.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	(void) sprintf((char *)bp, sync_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		(void *)&sync_reg_buf.r_tstate, (void *)&sync_reg_buf.r_g1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
		(void *)&sync_reg_buf.r_g2, (void *)&sync_reg_buf.r_g3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		(void *)&sync_reg_buf.r_g4, (void *)&sync_reg_buf.r_g5,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		(void *)&sync_reg_buf.r_g6, (void *)&sync_reg_buf.r_g7,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		(void *)&sync_reg_buf.r_o0, (void *)&sync_reg_buf.r_o1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		(void *)&sync_reg_buf.r_o2, (void *)&sync_reg_buf.r_o3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		(void *)&sync_reg_buf.r_o4, (void *)&sync_reg_buf.r_o5,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		(void *)&sync_reg_buf.r_o6, (void *)&sync_reg_buf.r_o7,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
		(void *)&sync_reg_buf.r_pc, (void *)&sync_reg_buf.r_npc,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
		(void *)&sync_reg_buf.r_y, (void *)&sync_tt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	prom_interpret(bp, 0, 0, 0, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	add_vx_handler("sync", 1, (void (*)(cell_t *))sync_handler);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
static u_longlong_t *boot_physinstalled, *boot_physavail, *boot_virtavail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
static size_t boot_physinstalled_len, boot_physavail_len, boot_virtavail_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
#define	IVSIZE	((MAXIVNUM + 1) * sizeof (struct intr_vector))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
 * As OBP takes up some RAM when the system boots, pages will already be "lost"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
 * to the system and reflected in npages by the time we see it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
 * We only want to allocate kernel structures in the 64-bit virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
 * space on systems with enough RAM to make the overhead of keeping track of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
 * an extra kernel memory segment worthwhile.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
 * Since OBP has already performed its memory allocations by this point, if we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
 * have more than MINMOVE_RAM_MB MB of RAM left free, go ahead and map
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
 * memory in the 64-bit virtual address space; otherwise keep allocations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
 * contiguous with we've mapped so far in the 32-bit virtual address space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
#define	MINMOVE_RAM_MB	((size_t)1900)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
#define	MB_TO_BYTES(mb)	((mb) * 1048576ul)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
pgcnt_t	tune_npages = (pgcnt_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	(MB_TO_BYTES(MINMOVE_RAM_MB)/ (size_t)MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
startup_memlist(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	size_t alloc_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	size_t ctrs_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
	caddr_t alloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	caddr_t ctrs_base, ctrs_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	caddr_t memspace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	caddr_t va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	int memblocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	struct memlist *cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	size_t syslimit = (size_t)SYSLIMIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	size_t sysbase = (size_t)SYSBASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	int alloc_alignsize = MMU_PAGESIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	extern void page_coloring_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	 * Initialize enough of the system to allow kmem_alloc to work by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	 * calling boot to allocate its memory until the time that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	 * kvm_init is completed.  The page structs are allocated after
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	 * rounding up end to the nearest page boundary; the memsegs are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	 * initialized and the space they use comes from the kernel heap.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	 * With appropriate initialization, they can be reallocated later
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	 * to a size appropriate for the machine's configuration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	 * At this point, memory is allocated for things that will never
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	 * need to be freed, this used to be "valloced".  This allows a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	 * savings as the pages don't need page structures to describe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	 * them because them will not be managed by the vm system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
	 * We're loaded by boot with the following configuration (as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	 * specified in the sun4u/conf/Mapfile):
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	 * 	text:		4 MB chunk aligned on a 4MB boundary
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	 * 	data & bss:	4 MB chunk aligned on a 4MB boundary
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
	 * These two chunks will eventually be mapped by 2 locked 4MB
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	 * ttes and will represent the nucleus of the kernel.  This gives
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	 * us some free space that is already allocated, some or all of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
	 * which is made available to kernel module text.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	 * The free space in the data-bss chunk is used for nucleus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	 * allocatable data structures and we reserve it using the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	 * nalloc_base and nalloc_end variables.  This space is currently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	 * being used for hat data structures required for tlb miss
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
	 * handling operations.  We align nalloc_base to a l2 cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	 * linesize because this is the line size the hardware uses to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	 * maintain cache coherency.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	 * 256K is carved out for module data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
	nalloc_base = (caddr_t)roundup((uintptr_t)e_data, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	moddata = nalloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	e_moddata = nalloc_base + MODDATA;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	nalloc_base = e_moddata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
	nalloc_end = (caddr_t)roundup((uintptr_t)nalloc_base, MMU_PAGESIZE4M);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	valloc_base = nalloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	 * Calculate the start of the data segment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	sdata = (caddr_t)((uintptr_t)e_data & MMU_PAGEMASK4M);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
	PRM_DEBUG(moddata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	PRM_DEBUG(nalloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	PRM_DEBUG(nalloc_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	PRM_DEBUG(sdata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	 * Remember any slop after e_text so we can give it to the modules.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	PRM_DEBUG(e_text);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	modtext = (caddr_t)roundup((uintptr_t)e_text, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	if (((uintptr_t)modtext & MMU_PAGEMASK4M) != (uintptr_t)s_text)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		panic("nucleus text overflow");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	modtext_sz = (caddr_t)roundup((uintptr_t)modtext, MMU_PAGESIZE4M) -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	    modtext;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	PRM_DEBUG(modtext);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	PRM_DEBUG(modtext_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	 * Remember what the physically available highest page is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	 * so that dumpsys works properly, and find out how much
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	 * memory is installed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	installed_top_size_memlist_array(boot_physinstalled,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	    boot_physinstalled_len, &physmax, &physinstalled);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	PRM_DEBUG(physinstalled);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	PRM_DEBUG(physmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	/* Fill out memory nodes config structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	startup_build_mem_nodes(boot_physinstalled, boot_physinstalled_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	 * Get the list of physically available memory to size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	 * the number of page structures needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	size_physavail(boot_physavail, boot_physavail_len, &npages, &memblocks);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	 * This first snap shot of npages can represent the pages used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	 * by OBP's text and data approximately. This is used in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	 * the calculation of the kernel size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
	obp_pages = physinstalled - npages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	 * On small-memory systems (<MODTEXT_SM_SIZE MB, currently 256MB), the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	 * in-nucleus module text is capped to MODTEXT_SM_CAP bytes (currently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
	 * 2MB) and any excess pages are put on physavail.  The assumption is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	 * that small-memory systems will need more pages more than they'll
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	 * need efficiently-mapped module texts.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	if ((physinstalled < mmu_btop(MODTEXT_SM_SIZE << 20)) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	    modtext_sz > MODTEXT_SM_CAP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
		extra_etpg = mmu_btop(modtext_sz - MODTEXT_SM_CAP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
		modtext_sz = MODTEXT_SM_CAP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		extra_etpg = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	PRM_DEBUG(extra_etpg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
	PRM_DEBUG(modtext_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	extra_etva = modtext + modtext_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	PRM_DEBUG(extra_etva);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	 * Account for any pages after e_text and e_data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	npages += extra_etpg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	npages += mmu_btopr(nalloc_end - nalloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
	PRM_DEBUG(npages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	 * npages is the maximum of available physical memory possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	 * (ie. it will never be more than this)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
	 * initialize the nucleus memory allocator.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	ndata_alloc_init(&ndata, (uintptr_t)nalloc_base, (uintptr_t)nalloc_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	 * Allocate mmu fault status area from the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
	if ((&ndata_alloc_mmfsa != NULL) && (ndata_alloc_mmfsa(&ndata) != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		cmn_err(CE_PANIC, "no more nucleus memory after mfsa alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	 * Allocate kernel TSBs from the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	if (ndata_alloc_tsbs(&ndata, npages) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
		cmn_err(CE_PANIC, "no more nucleus memory after tsbs alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	 * Allocate cpus structs from the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	if (ndata_alloc_cpus(&ndata) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		cmn_err(CE_PANIC, "no more nucleus memory after cpu alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	 * Allocate dmv dispatch table from the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	if (ndata_alloc_dmv(&ndata) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
		cmn_err(CE_PANIC, "no more nucleus memory after dmv alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	page_coloring_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	 * Allocate page_freelists bin headers for memnode 0 from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	 * nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	if (ndata_alloc_page_freelists(&ndata, 0) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		cmn_err(CE_PANIC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		    "no more nucleus memory after page free lists alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	if (kpm_enable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		kpm_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
		 * kpm page space -- Update kpm_npages and make the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
		 * same assumption about fragmenting as it is done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		 * for memseg_sz.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
		kpm_npages_setup(memblocks + 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	 * Allocate hat related structs from the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	if (ndata_alloc_hat(&ndata, npages, kpm_npages) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
		cmn_err(CE_PANIC, "no more nucleus memory after hat alloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	 * We want to do the BOP_ALLOCs before the real allocation of page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
	 * structs in order to not have to allocate page structs for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
	 * memory.  We need to calculate a virtual address because we want
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	 * the page structs to come before other allocations in virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	 * space.  This is so some (if not all) of page structs can actually
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	 * live in the nucleus.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	 * There are comments all over the SFMMU code warning of dire
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	 * consequences if the TSBs are moved out of 32-bit space.  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	 * is largely because the asm code uses "sethi %hi(addr)"-type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	 * instructions which will not provide the expected result if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	 * address is a 64-bit one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	alloc_base = (caddr_t)roundup((uintptr_t)nalloc_end, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
	alloc_base = sfmmu_ktsb_alloc(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
	alloc_base = (caddr_t)roundup((uintptr_t)alloc_base, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	 * Allocate IOMMU TSB array.  We do this here so that the physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	 * memory gets deducted from the PROM's physical memory list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	alloc_base = iommu_tsb_init(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
	PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	 * Starcat needs its special structures assigned in 32-bit virtual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	 * address space because its probing routines execute FCode, and FCode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	 * can't handle 64-bit virtual addresses...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	if (&starcat_startup_memlist) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
		alloc_base = starcat_startup_memlist(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
		alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	 * If we have enough memory, use 4M pages for alignment because it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	 * greatly reduces the number of TLB misses we take albeit at the cost
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	 * of possible RAM wastage (degenerate case of 4 MB - MMU_PAGESIZE per
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	 * allocation.) Still, the speedup on large memory systems (e.g. > 64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
	 * GB) is quite noticeable, so it is worth the effort to do if we can.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	 * Note, however, that this speedup will only occur if the boot PROM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
	 * uses the largest possible MMU page size possible to map memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
	 * requests that are properly aligned and sized (for example, a request
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
	 * for a multiple of 4MB of memory aligned to a 4MB boundary will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
	 * result in a mapping using a 4MB MMU page.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
	 * Even then, the large page mappings will only speed things up until
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	 * the startup process proceeds a bit further, as when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	 * sfmmu_map_prom_mappings() copies page mappings from the PROM to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	 * kernel it remaps everything but the TSBs using 8K pages anyway...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
	 * At some point in the future, sfmmu_map_prom_mappings() will be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
	 * rewritten to copy memory mappings to the kernel using the same MMU
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	 * page sizes the PROM used.  When that occurs, if the PROM did use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	 * large MMU pages to map memory, the alignment/sizing work we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	 * doing now should give us a nice extra performance boost, albeit at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	 * the cost of greater RAM usage...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	alloc_alignsize = ((npages >= tune_npages) ? MMU_PAGESIZE4M :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	    MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	PRM_DEBUG(tune_npages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
	PRM_DEBUG(alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
	 * Save off where the contiguous allocations to date have ended
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
	 * in econtig32.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
	econtig32 = alloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	PRM_DEBUG(econtig32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
	if (econtig32 > (caddr_t)KERNEL_LIMIT32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		cmn_err(CE_PANIC, "econtig32 too big");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	 * To avoid memory allocation collisions in the 32-bit virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	 * space, make allocations from this point forward in 64-bit virtual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
	 * address space starting at syslimit and working up.  Also use the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	 * alignment specified by alloc_alignsize, as we may be able to save
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	 * ourselves TLB misses by using larger page sizes if they're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	 * available.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
	 * All this is needed because on large memory systems, the default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	 * Solaris allocations will collide with SYSBASE32, which is hard
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
	 * coded to be at the virtual address 0x78000000.  Therefore, on 64-bit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	 * kernels, move the allocations to a location in the 64-bit virtual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	 * address space space, allowing those structures to grow without
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
	 * worry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	 * On current CPUs we'll run out of physical memory address bits before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	 * we need to worry about the allocations running into anything else in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	 * VM or the virtual address holes on US-I and II, as there's currently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	 * about 1 TB of addressable space before the US-I/II VA hole.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
	kmem64_base = (caddr_t)syslimit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
	PRM_DEBUG(kmem64_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
	alloc_base = (caddr_t)roundup((uintptr_t)kmem64_base, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
	 * If KHME and/or UHME hash buckets won't fit in the nucleus, allocate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
	 * them here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	if (khme_hash == NULL || uhme_hash == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
		 * alloc_hme_buckets() will align alloc_base properly before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
		 * assigning the hash buckets, so we don't need to do it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
		 * before the call...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
		alloc_base = alloc_hme_buckets(alloc_base, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
		PRM_DEBUG(khme_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
		PRM_DEBUG(uhme_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	 * Allocate the remaining page freelists.  NUMA systems can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	 * have lots of page freelists, one per node, which quickly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
	 * outgrow the amount of nucleus memory available.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	if (max_mem_nodes > 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
		int mnode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
		caddr_t alloc_start = alloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
		for (mnode = 1; mnode < max_mem_nodes; mnode++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
			alloc_base = alloc_page_freelists(mnode, alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
				ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
		if (alloc_base > alloc_start) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
			alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
				alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
			if ((caddr_t)BOP_ALLOC(bootops, alloc_start,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
				alloc_base - alloc_start,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
				alloc_alignsize) != alloc_start)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
				cmn_err(CE_PANIC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
					"Unable to alloc page freelists\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
	if (!mml_table) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		size_t mmltable_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
		 * We need to allocate the mml_table here because there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
		 * was not enough space within the nucleus.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
		mmltable_sz = sizeof (kmutex_t) * mml_table_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
		alloc_sz = roundup(mmltable_sz, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
		alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
		    alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
		if ((mml_table = (kmutex_t *)BOP_ALLOC(bootops, alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		    alloc_sz, alloc_alignsize)) != (kmutex_t *)alloc_base)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
			panic("mml_table alloc failure");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
		alloc_base += alloc_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
		PRM_DEBUG(mml_table);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	if (kpm_enable && !(kpmp_table || kpmp_stable)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
		size_t kpmptable_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
		caddr_t table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
		 * We need to allocate either kpmp_table or kpmp_stable here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
		 * because there was not enough space within the nucleus.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
		kpmptable_sz = (kpm_smallpages == 0) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
				sizeof (kpm_hlk_t) * kpmp_table_sz :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
				sizeof (kpm_shlk_t) * kpmp_stable_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		alloc_sz = roundup(kpmptable_sz, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
		alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
		    alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
		table = BOP_ALLOC(bootops, alloc_base, alloc_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
				alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		if (table != alloc_base)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
			panic("kpmp_table or kpmp_stable alloc failure");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		if (kpm_smallpages == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
			kpmp_table = (kpm_hlk_t *)table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
			PRM_DEBUG(kpmp_table);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
			kpmp_stable = (kpm_shlk_t *)table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
			PRM_DEBUG(kpmp_stable);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
		alloc_base += alloc_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	if (&ecache_init_scrub_flush_area) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
		 * Pass alloc_base directly, as the routine itself is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
		 * responsible for any special alignment requirements...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
		alloc_base = ecache_init_scrub_flush_area(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
		PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	 * Take the most current snapshot we can by calling mem-update.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
	 * Reset npages and memblocks based on boot_physavail list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	size_physavail(boot_physavail, boot_physavail_len, &npages, &memblocks);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	PRM_DEBUG(npages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	 * Account for extra memory after e_text.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	npages += extra_etpg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	 * Calculate the largest free memory chunk in the nucleus data area.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	 * We need to figure out if page structs can fit in there or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	 * We also make sure enough page structs get created for any physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	 * memory we might be returning to the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	ndata_remain_sz = ndata_maxsize(&ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
	PRM_DEBUG(ndata_remain_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	pp_sz = sizeof (struct page) * npages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	 * Here's a nice bit of code based on somewhat recursive logic:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
	 * If the page array would fit within the nucleus, we want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	 * add npages to cover any extra memory we may be returning back
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
	 * to the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	 * HOWEVER, the page array is sized by calculating the size of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	 * (struct page * npages), as are the pagehash table, ctrs and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	 * memseg_list, so the very act of performing the calculation below may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	 * in fact make the array large enough that it no longer fits in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	 * nucleus, meaning there would now be a much larger area of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	 * nucleus free that should really be added to npages, which would
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
	 * make the page array that much larger, and so on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
	 * This also ignores the memory possibly used in the nucleus for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	 * the page hash, ctrs and memseg list and the fact that whether they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	 * fit there or not varies with the npages calculation below, but we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
	 * don't even factor them into the equation at this point; perhaps we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
	 * should or perhaps we should just take the approach that the few
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	 * extra pages we could add via this calculation REALLY aren't worth
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
	 * the hassle...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
	if (ndata_remain_sz > pp_sz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
		size_t spare = ndata_spare(&ndata, pp_sz, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
		npages += mmu_btop(spare);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
		pp_sz = npages * sizeof (struct page);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
		pp_base = ndata_alloc(&ndata, pp_sz, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	 * If physmem is patched to be non-zero, use it instead of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
	 * the monitor value unless physmem is larger than the total
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
	 * amount of memory on hand.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	if (physmem == 0 || physmem > npages)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
		physmem = npages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
	 * If pp_base is NULL that means the routines above have determined
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
	 * the page array will not fit in the nucleus; we'll have to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
	 * BOP_ALLOC() ourselves some space for them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
	if (pp_base == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
		alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
		    alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
		alloc_sz = roundup(pp_sz, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
		if ((pp_base = (struct page *)BOP_ALLOC(bootops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
		    alloc_base, alloc_sz, alloc_alignsize)) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
		    (struct page *)alloc_base)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
			panic("page alloc failure");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
		alloc_base += alloc_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
	 * The page structure hash table size is a power of 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
	 * such that the average hash chain length is PAGE_HASHAVELEN.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
	page_hashsz = npages / PAGE_HASHAVELEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
	page_hashsz = 1 << highbit((ulong_t)page_hashsz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
	pagehash_sz = sizeof (struct page *) * page_hashsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
	 * We want to TRY to fit the page structure hash table,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	 * the page size free list counters, the memseg list and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	 * and the kpm page space in the nucleus if possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
	 * alloc_sz counts how much memory needs to be allocated by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	 * BOP_ALLOC().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	page_hash = ndata_alloc(&ndata, pagehash_sz, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	alloc_sz = (page_hash == NULL ? pagehash_sz : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	 * Size up per page size free list counters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
	ctrs_sz = page_ctrs_sz();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
	ctrs_base = ndata_alloc(&ndata, ctrs_sz, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
	if (ctrs_base == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
		alloc_sz = roundup(alloc_sz, ecache_alignsize) + ctrs_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
	 * The memseg list is for the chunks of physical memory that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
	 * will be managed by the vm system.  The number calculated is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
	 * a guess as boot may fragment it more when memory allocations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
	 * are made before kphysm_init().  Currently, there are two
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	 * allocations before then, so we assume each causes fragmen-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	 * tation, and add a couple more for good measure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
	memseg_sz = sizeof (struct memseg) * (memblocks + 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
	memseg_base = ndata_alloc(&ndata, memseg_sz, ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
	if (memseg_base == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
		alloc_sz = roundup(alloc_sz, ecache_alignsize) + memseg_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	if (kpm_enable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
		 * kpm page space -- Update kpm_npages and make the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
		 * same assumption about fragmenting as it is done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
		 * for memseg_sz above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
		kpm_npages_setup(memblocks + 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
		kpm_pp_sz = (kpm_smallpages == 0) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
				kpm_npages * sizeof (kpm_page_t):
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
				kpm_npages * sizeof (kpm_spage_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
		kpm_pp_base = (uintptr_t)ndata_alloc(&ndata, kpm_pp_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
		    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
		if (kpm_pp_base == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
			alloc_sz = roundup(alloc_sz, ecache_alignsize) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
			    kpm_pp_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
	if (alloc_sz > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
		uintptr_t bop_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
		 * We need extra memory allocated through BOP_ALLOC.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
		alloc_base = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
		    alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
		alloc_sz = roundup(alloc_sz, alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
		if ((bop_base = (uintptr_t)BOP_ALLOC(bootops, alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
		    alloc_sz, alloc_alignsize)) != (uintptr_t)alloc_base)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
			panic("system page struct alloc failure");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
		alloc_base += alloc_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
		if (page_hash == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
			page_hash = (struct page **)bop_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
			bop_base = roundup(bop_base + pagehash_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
			    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
		if (ctrs_base == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
			ctrs_base = (caddr_t)bop_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
			bop_base = roundup(bop_base + ctrs_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
			    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
		if (memseg_base == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
			memseg_base = (struct memseg *)bop_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
			bop_base = roundup(bop_base + memseg_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
			    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
		if (kpm_enable && kpm_pp_base == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
			kpm_pp_base = (uintptr_t)bop_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
			bop_base = roundup(bop_base + kpm_pp_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
			    ecache_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
		ASSERT(bop_base <= (uintptr_t)alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	 * Initialize per page size free list counters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	ctrs_end = page_ctrs_alloc(ctrs_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	ASSERT(ctrs_base + ctrs_sz >= ctrs_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	PRM_DEBUG(page_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	PRM_DEBUG(memseg_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	PRM_DEBUG(kpm_pp_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	PRM_DEBUG(kpm_pp_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	PRM_DEBUG(pp_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	PRM_DEBUG(pp_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
#ifdef	TRAPTRACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	 * Allocate trap trace buffer last so as not to affect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	 * the 4M alignments of the allocations above on V9 SPARCs...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	alloc_base = trap_trace_alloc(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	PRM_DEBUG(alloc_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
#endif	/* TRAPTRACE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	if (kmem64_base) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
		 * Set the end of the kmem64 segment for V9 SPARCs, if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
		 * appropriate...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
		kmem64_end = (caddr_t)roundup((uintptr_t)alloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		    alloc_alignsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
		PRM_DEBUG(kmem64_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
		PRM_DEBUG(kmem64_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	 * Allocate space for the interrupt vector table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	memspace = (caddr_t)BOP_ALLOC(bootops, (caddr_t)intr_vector,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	    IVSIZE, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	if (memspace != (caddr_t)intr_vector)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
		panic("interrupt table allocation failure");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	 * The memory lists from boot are allocated from the heap arena
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
	 * so that later they can be freed and/or reallocated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
	if (BOP_GETPROP(bootops, "extent", &memlist_sz) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		panic("could not retrieve property \"extent\"");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
	 * Between now and when we finish copying in the memory lists,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
	 * allocations happen so the space gets fragmented and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
	 * lists longer.  Leave enough space for lists twice as long
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
	 * as what boot says it has now; roundup to a pagesize.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	 * Also add space for the final phys-avail copy in the fixup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	 * routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	va = (caddr_t)(sysbase + PAGESIZE + PANICBUFSIZE +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	    roundup(IVSIZE, MMU_PAGESIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	memlist_sz *= 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	memlist_sz = roundup(memlist_sz, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	memspace = (caddr_t)BOP_ALLOC(bootops, va, memlist_sz, BO_NO_ALIGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	if (memspace == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		halt("Boot allocation failed.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	memlist = (struct memlist *)memspace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	memlist_end = (char *)memspace + memlist_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	PRM_DEBUG(memlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
	PRM_DEBUG(memlist_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
	PRM_DEBUG(sysbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	PRM_DEBUG(syslimit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	kernelheap_init((void *)sysbase, (void *)syslimit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
	    (caddr_t)sysbase + PAGESIZE, NULL, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	 * Take the most current snapshot we can by calling mem-update.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	 * Remove the space used by BOP_ALLOC from the kernel heap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
	 * plus the area actually used by the OBP (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	 * ignoring virtual addresses in virt_avail, above syslimit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	virt_avail = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	copy_memlist(boot_virtavail, boot_virtavail_len, &memlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
	for (cur = virt_avail; cur->next; cur = cur->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
		uint64_t range_base, range_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		if ((range_base = cur->address + cur->size) < (uint64_t)sysbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		if (range_base >= (uint64_t)syslimit)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		 * Limit the range to end at syslimit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
		range_size = MIN(cur->next->address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
		    (uint64_t)syslimit) - range_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
		(void) vmem_xalloc(heap_arena, (size_t)range_size, PAGESIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
		    0, 0, (void *)range_base, (void *)(range_base + range_size),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
		    VM_NOSLEEP | VM_BESTFIT | VM_PANIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	phys_avail = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	(void) copy_physavail(boot_physavail, boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	    &memlist, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	 * Add any extra memory after e_text to the phys_avail list, as long
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	 * as there's at least a page to add.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	if (extra_etpg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
		memlist_add(va_to_pa(extra_etva), mmu_ptob(extra_etpg),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
		    &memlist, &phys_avail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	 * Add any extra memory after e_data to the phys_avail list as long
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	 * as there's at least a page to add.  Usually, there isn't any,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	 * since extra HME blocks typically get allocated there first before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
	 * using RAM elsewhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	if ((nalloc_base = ndata_extra_base(&ndata, MMU_PAGESIZE)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
		nalloc_base = nalloc_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
	ndata_remain_sz = nalloc_end - nalloc_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	if (ndata_remain_sz >= MMU_PAGESIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
		memlist_add(va_to_pa(nalloc_base),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
		    (uint64_t)ndata_remain_sz, &memlist, &phys_avail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
	PRM_DEBUG(memlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
	PRM_DEBUG(memlist_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	PRM_DEBUG(memspace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	if ((caddr_t)memlist > (memspace + memlist_sz))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
		panic("memlist overflow");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	PRM_DEBUG(pp_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	PRM_DEBUG(memseg_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	PRM_DEBUG(npages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	 * Initialize the page structures from the memory lists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
	kphysm_init(pp_base, memseg_base, npages, kpm_pp_base, kpm_npages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	availrmem_initial = availrmem = freemem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
	PRM_DEBUG(availrmem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	 * Some of the locks depend on page_hashsz being set!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
	 * kmem_init() depends on this; so, keep it here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	page_lock_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
	 * Initialize kernel memory allocator.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	kmem_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	 * Initialize bp_mapin().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	bp_init(shm_alignment, HAT_STRICTORDER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
	 * Reserve space for panicbuf and intr_vector from the 32-bit heap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	(void) vmem_xalloc(heap32_arena, PANICBUFSIZE, PAGESIZE, 0, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
	    panicbuf, panicbuf + PANICBUFSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	    VM_NOSLEEP | VM_BESTFIT | VM_PANIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
	(void) vmem_xalloc(heap32_arena, IVSIZE, PAGESIZE, 0, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
	    intr_vector, (caddr_t)intr_vector + IVSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
	    VM_NOSLEEP | VM_BESTFIT | VM_PANIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	mem_config_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
startup_modules(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
	int proplen, nhblk1, nhblk8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	size_t  nhblksz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
	pgcnt_t hblk_pages, pages_per_hblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
	size_t hme8blk_sz, hme1blk_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
	 * Log any optional messages from the boot program
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
	proplen = (size_t)BOP_GETPROPLEN(bootops, "boot-message");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
	if (proplen > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
		char *msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
		size_t len = (size_t)proplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
		msg = kmem_zalloc(len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		(void) BOP_GETPROP(bootops, "boot-message", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		cmn_err(CE_CONT, "?%s\n", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		kmem_free(msg, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
	 * Let the platforms have a chance to change default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
	 * values before reading system file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
	if (&set_platform_defaults)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
		set_platform_defaults();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
	 * Calculate default settings of system parameters based upon
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
	 * maxusers, yet allow to be overridden via the /etc/system file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
	param_calc(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	mod_setup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
	 * If this is a positron, complain and halt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
	if (&iam_positron && iam_positron()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
		cmn_err(CE_WARN, "This hardware platform is not supported"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
		    " by this release of Solaris.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
		prom_enter_mon();	/* Type 'go' to resume */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
		cmn_err(CE_WARN, "Booting an unsupported platform.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
		cmn_err(CE_WARN, "Booting with down-rev firmware.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
#else /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
		halt(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
#endif /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
	 * If we are running firmware that isn't 64-bit ready
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
	 * then complain and halt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
	do_prom_version_check();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
	 * Initialize system parameters
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
	param_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
	 * maxmem is the amount of physical memory we're playing with.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	maxmem = physmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
	/* Set segkp limits. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	ncbase = (caddr_t)SEGDEBUGBASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	ncend = (caddr_t)SEGDEBUGBASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
	 * Initialize the hat layer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
	hat_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
	 * Initialize segment management stuff.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
	seg_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
	 * Create the va>tte handler, so the prom can understand
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
	 * kernel translations.  The handler is installed later, just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	 * as we are about to take over the trap table from the prom.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
	create_va_to_tte();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
	 * Load the forthdebugger (optional)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	forthdebug_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	 * Create OBP node for console input callbacks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	 * if it is needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	 */
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  1630
	startup_create_io_node();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	if (modloadonly("fs", "specfs") == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
		halt("Can't load specfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
	if (modloadonly("fs", "devfs") == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		halt("Can't load devfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	if (modloadonly("misc", "swapgeneric") == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
		halt("Can't load swapgeneric");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
	dispinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
	 * Infer meanings to the members of the idprom buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
	parse_idprom();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	/* Read cluster configuration data. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
	clconf_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
	setup_ddi();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
	 * Lets take this opportunity to load the root device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
	if (loadrootmodules() != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
		debug_enter("Can't load the root filesystem");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
	 * Load tod driver module for the tod part found on this system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
	 * Recompute the cpu frequency/delays based on tod as tod part
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
	 * tends to keep time more accurately.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
	if (&load_tod_module)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
		load_tod_module();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
	 * Allow platforms to load modules which might
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
	 * be needed after bootops are gone.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
	if (&load_platform_modules)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
		load_platform_modules();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	setcpudelay();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	bop_alloc_pages = size_virtalloc(boot_virtavail, boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
	 * Calculation and allocation of hmeblks needed to remap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	 * the memory allocated by PROM till now:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	 * (1)  calculate how much virtual memory has been bop_alloc'ed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
	 * (2)  roundup this memory to span of hme8blk, i.e. 64KB
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
	 * (3)  calculate number of hme8blk's needed to remap this memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
	 * (4)  calculate amount of memory that's consumed by these hme8blk's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
	 * (5)  add memory calculated in steps (2) and (4) above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
	 * (6)  roundup this memory to span of hme8blk, i.e. 64KB
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
	 * (7)  calculate number of hme8blk's needed to remap this memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
	 * (8)  calculate amount of memory that's consumed by these hme8blk's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
	 * (9)  allocate additional hme1blk's to hold large mappings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
	 *	H8TOH1 determines this.  The current SWAG gives enough hblk1's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
	 *	to remap everything with 4M mappings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
	 * (10) account for partially used hblk8's due to non-64K aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
	 *	PROM mapping entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
	 * (11) add memory calculated in steps (8), (9), and (10) above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
	 * (12) kmem_zalloc the memory calculated in (11); since segkmem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
	 *	is not ready yet, this gets bop_alloc'ed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
	 * (13) there will be very few bop_alloc's after this point before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
	 *	trap table takes over
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
	/* sfmmu_init_nucleus_hblks expects properly aligned data structures. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
	hme8blk_sz = roundup(HME8BLK_SZ, sizeof (int64_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	hme1blk_sz = roundup(HME1BLK_SZ, sizeof (int64_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
	pages_per_hblk = btop(HMEBLK_SPAN(TTE8K));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
	bop_alloc_pages = roundup(bop_alloc_pages, pages_per_hblk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
	nhblk8 = bop_alloc_pages / pages_per_hblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
	nhblk1 = roundup(nhblk8, H8TOH1) / H8TOH1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
	hblk_pages = btopr(nhblk8 * hme8blk_sz + nhblk1 * hme1blk_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
	bop_alloc_pages += hblk_pages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
	bop_alloc_pages = roundup(bop_alloc_pages, pages_per_hblk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
	nhblk8 = bop_alloc_pages / pages_per_hblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
	nhblk1 = roundup(nhblk8, H8TOH1) / H8TOH1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
	if (nhblk1 < hblk1_min)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		nhblk1 = hblk1_min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
	if (nhblk8 < hblk8_min)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		nhblk8 = hblk8_min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
	 * Since hblk8's can hold up to 64k of mappings aligned on a 64k
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
	 * boundary, the number of hblk8's needed to map the entries in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
	 * boot_virtavail list needs to be adjusted to take this into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
	 * consideration.  Thus, we need to add additional hblk8's since it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
	 * is possible that an hblk8 will not have all 8 slots used due to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
	 * alignment constraints.  Since there were boot_virtavail_len entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
	 * in that list, we need to add that many hblk8's to the number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
	 * already calculated to make sure we don't underestimate.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
	nhblk8 += boot_virtavail_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
	nhblksz = nhblk8 * hme8blk_sz + nhblk1 * hme1blk_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
	/* Allocate in pagesize chunks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
	nhblksz = roundup(nhblksz, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	hblk_base = kmem_zalloc(nhblksz, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	sfmmu_init_nucleus_hblks(hblk_base, nhblksz, nhblk8, nhblk1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
startup_bop_gone(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
	extern int bop_io_quiesced;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
	 * Call back into boot and release boots resources.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
	BOP_QUIESCE_IO(bootops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	bop_io_quiesced = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
	 * Copy physinstalled list into kernel space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
	phys_install = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
	copy_memlist(boot_physinstalled, boot_physinstalled_len, &memlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
	 * setup physically contiguous area twice as large as the ecache.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
	 * this is used while doing displacement flush of ecaches
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
	if (&ecache_flush_address) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
		ecache_flushaddr = ecache_flush_address();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
		if (ecache_flushaddr == (uint64_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
			cmn_err(CE_PANIC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
			    "startup: no memory to set ecache_flushaddr");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
	 * Virtual available next.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
	ASSERT(virt_avail != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
	memlist_free_list(virt_avail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	virt_avail = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	copy_memlist(boot_virtavail, boot_virtavail_len, &memlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
	 * Last chance to ask our booter questions ..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
 * startup_fixup_physavail - called from mach_sfmmu.c after the final
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
 * allocations have been performed.  We can't call it in startup_bop_gone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
 * since later operations can cause obp to allocate more memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
startup_fixup_physavail(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	struct memlist *cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
	 * take the most current snapshot we can by calling mem-update
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
	copy_boot_memlists(&boot_physinstalled, &boot_physinstalled_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
	    &boot_physavail, &boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
	    &boot_virtavail, &boot_virtavail_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
	 * Copy phys_avail list, again.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
	 * Both the kernel/boot and the prom have been allocating
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	 * from the original list we copied earlier.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	cur = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	(void) copy_physavail(boot_physavail, boot_physavail_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
	    &memlist, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
	 * Add any extra memory after e_text we added to the phys_avail list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
	 * back to the old list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
	if (extra_etpg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
		memlist_add(va_to_pa(extra_etva), mmu_ptob(extra_etpg),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
		    &memlist, &cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
	if (ndata_remain_sz >= MMU_PAGESIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		memlist_add(va_to_pa(nalloc_base),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
		    (uint64_t)ndata_remain_sz, &memlist, &cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	 * There isn't any bounds checking on the memlist area
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	 * so ensure it hasn't overgrown.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	if ((caddr_t)memlist > (caddr_t)memlist_end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
		cmn_err(CE_PANIC, "startup: memlist size exceeded");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	 * The kernel removes the pages that were allocated for it from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	 * the freelist, but we now have to find any -extra- pages that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
	 * the prom has allocated for it's own book-keeping, and remove
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
	 * them from the freelist too. sigh.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
	fix_prom_pages(phys_avail, cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
	ASSERT(phys_avail != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	memlist_free_list(phys_avail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
	phys_avail = cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
	 * We're done with boot.  Just after this point in time, boot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
	 * gets unmapped, so we can no longer rely on its services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	 * Zero the bootops to indicate this fact.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
	bootops = (struct bootops *)NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
	BOOTOPS_GONE();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
startup_vm(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	size_t	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	struct segmap_crargs a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	struct segkpm_crargs b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
	uint64_t avmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	caddr_t va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
	pgcnt_t	max_phys_segkp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
	int	mnode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
423
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1866
	extern int exec_lpg_disable, use_brk_lpg, use_stk_lpg, use_zmap_lpg;
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1867
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
	 * get prom's mappings, create hments for them and switch
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
	 * to the kernel context.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	hat_kern_setup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
	 * Take over trap table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
	setup_trap_table();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	 * Install the va>tte handler, so that the prom can handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	 * misses and understand the kernel table layout in case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
	 * we need call into the prom.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	install_va_to_tte();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
	 * Set a flag to indicate that the tba has been taken over.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	tba_taken_over = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
	/* initialize MMU primary context register */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
	mmu_init_kcontext();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
	 * The boot cpu can now take interrupts, x-calls, x-traps
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
	CPUSET_ADD(cpu_ready_set, CPU->cpu_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
	CPU->cpu_flags |= (CPU_READY | CPU_ENABLE | CPU_EXISTS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	 * Set a flag to tell write_scb_int() that it can access V_TBR_WR_ADDR.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	tbr_wr_addr_inited = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	 * Initialize VM system, and map kernel address space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	kvm_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	 * XXX4U: previously, we initialized and turned on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	 * the caches at this point. But of course we have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	 * nothing to do, as the prom has already done this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	 * for us -- main memory must be E$able at all times.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
	 * If the following is true, someone has patched
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	 * phsymem to be less than the number of pages that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
	 * the system actually has.  Remove pages until system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
	 * memory is limited to the requested amount.  Since we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
	 * have allocated page structures for all pages, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
	 * correct the amount of memory we want to remove
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
	 * by the size of the memory used to hold page structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
	 * for the non-used pages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
	if (physmem < npages) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
		pgcnt_t diff, off;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
		struct page *pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
		struct seg kseg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
		cmn_err(CE_WARN, "limiting physmem to %ld pages", physmem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
		off = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
		diff = npages - physmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
		diff -= mmu_btopr(diff * sizeof (struct page));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
		kseg.s_as = &kas;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
		while (diff--) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
			pp = page_create_va(&unused_pages_vp, (offset_t)off,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
			    MMU_PAGESIZE, PG_WAIT | PG_EXCL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
			    &kseg, (caddr_t)off);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
			if (pp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
				cmn_err(CE_PANIC, "limited physmem too much!");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
			page_io_unlock(pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
			page_downgrade(pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
			availrmem--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
			off += MMU_PAGESIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	 * When printing memory, show the total as physmem less
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
	 * that stolen by a debugger.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
	cmn_err(CE_CONT, "?mem = %ldK (0x%lx000)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
	    (ulong_t)(physinstalled) << (PAGESHIFT - 10),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
	    (ulong_t)(physinstalled) << (PAGESHIFT - 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
	avmem = (uint64_t)freemem << PAGESHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
	cmn_err(CE_CONT, "?avail mem = %lld\n", (unsigned long long)avmem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
423
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1962
	/* For small memory systems disable automatic large pages. */
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1963
	if (physmem < auto_lpg_min_physmem) {
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1964
		exec_lpg_disable = 1;
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1965
		use_brk_lpg = 0;
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1966
		use_stk_lpg = 0;
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1967
		use_zmap_lpg = 0;
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1968
	}
6cbc492798ce 6294795 The behavior of malloc is different between solaris 10 and nevada
davemq
parents: 0
diff changeset
  1969
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
	 * Perform platform specific freelist processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	if (&plat_freelist_process) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
		for (mnode = 0; mnode < max_mem_nodes; mnode++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
			if (mem_node_config[mnode].exists)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
				plat_freelist_process(mnode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
	 * Initialize the segkp segment type.  We position it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
	 * after the configured tables and buffers (whose end
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
	 * is given by econtig) and before V_WKBASE_ADDR.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
	 * Also in this area is segkmap (size SEGMAPSIZE).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	/* XXX - cache alignment? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	va = (caddr_t)SEGKPBASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	ASSERT(((uintptr_t)va & PAGEOFFSET) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
	max_phys_segkp = (physmem * 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
	if (segkpsize < btop(SEGKPMINSIZE) || segkpsize > btop(SEGKPMAXSIZE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
		segkpsize = btop(SEGKPDEFSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
		cmn_err(CE_WARN, "Illegal value for segkpsize. "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
		    "segkpsize has been reset to %ld pages", segkpsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
	i = ptob(MIN(segkpsize, max_phys_segkp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
	rw_enter(&kas.a_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	if (seg_attach(&kas, va, i, segkp) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
		cmn_err(CE_PANIC, "startup: cannot attach segkp");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
	if (segkp_create(segkp) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
		cmn_err(CE_PANIC, "startup: segkp_create failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
	rw_exit(&kas.a_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
	 * kpm segment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
	segmap_kpm = kpm_enable &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
		segmap_kpm && PAGESIZE == MAXBSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
	if (kpm_enable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
		rw_enter(&kas.a_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
		 * The segkpm virtual range range is larger than the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
		 * actual physical memory size and also covers gaps in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
		 * the physical address range for the following reasons:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
		 * . keep conversion between segkpm and physical addresses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
		 *   simple, cheap and unambiguous.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
		 * . avoid extension/shrink of the the segkpm in case of DR.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
		 * . avoid complexity for handling of virtual addressed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
		 *   caches, segkpm and the regular mapping scheme must be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
		 *   kept in sync wrt. the virtual color of mapped pages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
		 * Any accesses to virtual segkpm ranges not backed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
		 * physical memory will fall through the memseg pfn hash
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
		 * and will be handled in segkpm_fault.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
		 * Additional kpm_size spaces needed for vac alias prevention.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
		if (seg_attach(&kas, kpm_vbase, kpm_size * vac_colors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
		    segkpm) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
			cmn_err(CE_PANIC, "cannot attach segkpm");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		b.prot = PROT_READ | PROT_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
		b.nvcolors = shm_alignment >> MMU_PAGESHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
		if (segkpm_create(segkpm, (caddr_t)&b) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
			panic("segkpm_create segkpm");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
		rw_exit(&kas.a_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
	 * Now create generic mapping segment.  This mapping
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
	 * goes SEGMAPSIZE beyond SEGMAPBASE.  But if the total
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
	 * virtual address is greater than the amount of free
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
	 * memory that is available, then we trim back the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
	 * segment size to that amount
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
	va = (caddr_t)SEGMAPBASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
	 * 1201049: segkmap base address must be MAXBSIZE aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
	ASSERT(((uintptr_t)va & MAXBOFFSET) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
	 * Set size of segmap to percentage of freemem at boot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
	 * but stay within the allowable range
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
	 * Note we take percentage  before converting from pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
	 * to bytes to avoid an overflow on 32-bit kernels.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
	i = mmu_ptob((freemem * segmap_percent) / 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
	if (i < MINMAPSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
		i = MINMAPSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	if (i > MIN(SEGMAPSIZE, mmu_ptob(freemem)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
		i = MIN(SEGMAPSIZE, mmu_ptob(freemem));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
	i &= MAXBMASK;	/* 1201049: segkmap size must be MAXBSIZE aligned */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
	rw_enter(&kas.a_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	if (seg_attach(&kas, va, i, segkmap) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
		cmn_err(CE_PANIC, "cannot attach segkmap");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
	a.prot = PROT_READ | PROT_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
	a.shmsize = shm_alignment;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
	a.nfreelist = 0;	/* use segmap driver defaults */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
	if (segmap_create(segkmap, (caddr_t)&a) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
		panic("segmap_create segkmap");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
	rw_exit(&kas.a_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
	segdev_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
startup_end(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
	if ((caddr_t)memlist > (caddr_t)memlist_end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
		panic("memlist overflow 2");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
	memlist_free_block((caddr_t)memlist,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	    ((caddr_t)memlist_end - (caddr_t)memlist));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
	memlist = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
	/* enable page_relocation since OBP is now done */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
	page_relocate_ready = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
	 * Perform tasks that get done after most of the VM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
	 * initialization has been done but before the clock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
	 * and other devices get started.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
	kern_setup1();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	 * Intialize the VM arenas for allocating physically
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
	 * contiguus memory chunk for interrupt queues snd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
	 * allocate/register boot cpu's queues, if any and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
	 * allocate dump buffer for sun4v systems to store
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
	 * extra crash information during crash dump
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
	contig_mem_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
	mach_descrip_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
	cpu_intrq_setup(CPU);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
	cpu_intrq_register(CPU);
1077
1bb046ea2eb1 usr/src/cmd/mdb/sun4u/modules/unix/unix.c
svemuri
parents: 789
diff changeset
  2119
	mach_htraptrace_init();
1bb046ea2eb1 usr/src/cmd/mdb/sun4u/modules/unix/unix.c
svemuri
parents: 789
diff changeset
  2120
	mach_htraptrace_setup(CPU->cpu_id);
1bb046ea2eb1 usr/src/cmd/mdb/sun4u/modules/unix/unix.c
svemuri
parents: 789
diff changeset
  2121
	mach_htraptrace_configure(CPU->cpu_id);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
	mach_dump_buffer_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
	 * Initialize interrupt related stuff
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
	 */
1455
b43f098fa50c 6378953 allocation of interrupt threads could be more common
andrei
parents: 1253
diff changeset
  2127
	cpu_intr_alloc(CPU, NINTR_THREADS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
	(void) splzs();			/* allow hi clock ints but not zs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
	 * Initialize errors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
	error_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
	 * Note that we may have already used kernel bcopy before this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
	 * point - but if you really care about this, adb the use_hw_*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
	 * variables to 0 before rebooting.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
	mach_hw_copy_limit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
	 * Install the "real" preemption guards before DDI services
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
	 * are available.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
	(void) prom_set_preprom(kern_preprom);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
	(void) prom_set_postprom(kern_postprom);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
	CPU->cpu_m.mutex_ready = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
	 * Initialize segnf (kernel support for non-faulting loads).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
	segnf_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
	 * Configure the root devinfo node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	configure();		/* set up devices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
	mach_cpu_halt_idle();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
post_startup(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
#ifdef	PTL1_PANIC_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
	extern void init_ptl1_thread(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
#endif	/* PTL1_PANIC_DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
	extern void abort_sequence_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	 * Set the system wide, processor-specific flags to be passed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	 * to userland via the aux vector for performance hints and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	 * instruction set extensions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
	bind_hwcap();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
	 * Startup memory scrubber (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
	mach_memscrub();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
	 * Allocate soft interrupt to handle abort sequence.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	abort_sequence_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	 * Configure the rest of the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
	 * Perform forceloading tasks for /etc/system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
	(void) mod_sysctl(SYS_FORCELOAD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
	 * ON4.0: Force /proc module in until clock interrupt handle fixed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
	 * ON4.0: This must be fixed or restated in /etc/systems.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
	(void) modload("fs", "procfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
	if (&load_platform_drivers)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
		load_platform_drivers();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
	/* load vis simulation module, if we are running w/fpu off */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
	if (!fpu_exists) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
		if (modload("misc", "vis") == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
			halt("Can't load vis");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
	mach_fpras();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	maxmem = freemem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
#ifdef	PTL1_PANIC_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
	init_ptl1_thread();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
#endif	/* PTL1_PANIC_DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
#ifdef	PTL1_PANIC_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
int		ptl1_panic_test = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
int		ptl1_panic_xc_one_test = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
int		ptl1_panic_xc_all_test = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
int		ptl1_panic_xt_one_test = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
int		ptl1_panic_xt_all_test = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
kthread_id_t	ptl1_thread_p = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
kcondvar_t	ptl1_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
kmutex_t	ptl1_mutex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
int		ptl1_recurse_count_threshold = 0x40;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
int		ptl1_recurse_trap_threshold = 0x3d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
extern void	ptl1_recurse(int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
extern void	ptl1_panic_xt(int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
 * Called once per second by timeout() to wake up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
 * the ptl1_panic thread to see if it should cause
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
 * a trap to the ptl1_panic() code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
ptl1_wakeup(void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	mutex_enter(&ptl1_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
	cv_signal(&ptl1_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
	mutex_exit(&ptl1_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
 * ptl1_panic cross call function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
 *     Needed because xc_one() and xc_some() can pass
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
 *	64 bit args but ptl1_recurse() expects ints.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
ptl1_panic_xc(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
	ptl1_recurse(ptl1_recurse_count_threshold,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	    ptl1_recurse_trap_threshold);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
 * The ptl1 thread waits for a global flag to be set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
 * and uses the recurse thresholds to set the stack depth
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
 * to cause a ptl1_panic() directly via a call to ptl1_recurse
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
 * or indirectly via the cross call and cross trap functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
 * This is useful testing stack overflows and normal
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
 * ptl1_panic() states with a know stack frame.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
 * ptl1_recurse() is an asm function in ptl1_panic.s that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
 * sets the {In, Local, Out, and Global} registers to a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
 * know state on the stack and just prior to causing a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
 * test ptl1_panic trap.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
ptl1_thread(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	mutex_enter(&ptl1_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
	while (ptl1_thread_p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
		cpuset_t	other_cpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
		int		cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
		int		my_cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
		int		target_cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
		int		target_found;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
		if (ptl1_panic_test) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
			ptl1_recurse(ptl1_recurse_count_threshold,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
			    ptl1_recurse_trap_threshold);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
		 * Find potential targets for x-call and x-trap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
		 * if any exist while preempt is disabled we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
		 * start a ptl1_panic if requested via a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
		 * globals.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
		kpreempt_disable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
		my_cpu_id = CPU->cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
		other_cpus = cpu_ready_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
		CPUSET_DEL(other_cpus, CPU->cpu_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
		target_found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		if (!CPUSET_ISNULL(other_cpus)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
			 * Pick the first one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
			for (cpu_id = 0; cpu_id < NCPU; cpu_id++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
				if (cpu_id == my_cpu_id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
				if (CPU_XCALL_READY(cpu_id)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
					target_cpu_id = cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
					target_found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
			ASSERT(target_found);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
			if (ptl1_panic_xc_one_test) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
				xc_one(target_cpu_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
				    (xcfunc_t *)ptl1_panic_xc, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
			if (ptl1_panic_xc_all_test) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
				xc_some(other_cpus,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
				    (xcfunc_t *)ptl1_panic_xc, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
			if (ptl1_panic_xt_one_test) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
				xt_one(target_cpu_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
				    (xcfunc_t *)ptl1_panic_xt, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
			if (ptl1_panic_xt_all_test) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
				xt_some(other_cpus,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
				    (xcfunc_t *)ptl1_panic_xt, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
		kpreempt_enable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
		(void) timeout(ptl1_wakeup, NULL, hz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
		(void) cv_wait(&ptl1_cv, &ptl1_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
	mutex_exit(&ptl1_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
 * Called during early startup to create the ptl1_thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
init_ptl1_thread(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
	ptl1_thread_p = thread_create(NULL, 0, ptl1_thread, NULL, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
	    &p0, TS_RUN, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
#endif	/* PTL1_PANIC_DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
 * Add to a memory list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
 * start = start of new memory segment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
 * len = length of new memory segment in bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
 * memlistp = pointer to array of available memory segment structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
 * curmemlistp = memory list to which to add segment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
memlist_add(uint64_t start, uint64_t len, struct memlist **memlistp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
	struct memlist **curmemlistp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
	struct memlist *new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
	new = *memlistp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
	new->address = start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	new->size = len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
	*memlistp = new + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
	memlist_insert(new, curmemlistp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
 * In the case of architectures that support dynamic addition of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
 * memory at run-time there are two cases where memsegs need to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
 * be initialized and added to the memseg list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
 * 1) memsegs that are constructed at startup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
 * 2) memsegs that are constructed at run-time on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
 *    hot-plug capable architectures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
 * This code was originally part of the function kphysm_init().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
memseg_list_add(struct memseg *memsegp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
	struct memseg **prev_memsegp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
	pgcnt_t num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
	/* insert in memseg list, decreasing number of pages order */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
	num = MSEG_NPAGES(memsegp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
	for (prev_memsegp = &memsegs; *prev_memsegp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
	    prev_memsegp = &((*prev_memsegp)->next)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
		if (num > MSEG_NPAGES(*prev_memsegp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
	memsegp->next = *prev_memsegp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
	*prev_memsegp = memsegp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
	if (kpm_enable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
		memsegp->nextpa = (memsegp->next) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
			va_to_pa(memsegp->next) : MSEG_NULLPTR_PA;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
		if (prev_memsegp != &memsegs) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
			struct memseg *msp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
			msp = (struct memseg *)((caddr_t)prev_memsegp -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
				offsetof(struct memseg, next));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
			msp->nextpa = va_to_pa(memsegp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
			memsegspa = va_to_pa(memsegs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
 * PSM add_physmem_cb(). US-II and newer processors have some
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
 * flavor of the prefetch capability implemented. We exploit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
 * this capability for optimum performance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
#define	PREFETCH_BYTES	64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
add_physmem_cb(page_t *pp, pfn_t pnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
	extern void	 prefetch_page_w(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
	pp->p_pagenum = pnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
	 * Prefetch one more page_t into E$. To prevent future
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	 * mishaps with the sizeof(page_t) changing on us, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
	 * catch this on debug kernels if we can't bring in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	 * entire hpage with 2 PREFETCH_BYTES reads. See
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
	 * also, sun4u/cpu/cpu_module.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
	/*LINTED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
	ASSERT(sizeof (page_t) <= 2*PREFETCH_BYTES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
	prefetch_page_w((char *)pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
 * kphysm_init() tackles the problem of initializing physical memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
 * The old startup made some assumptions about the kernel living in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
 * physically contiguous space which is no longer valid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
kphysm_init(page_t *pp, struct memseg *memsegp, pgcnt_t npages,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
	uintptr_t kpm_pp, pgcnt_t kpm_npages)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	struct memlist	*pmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
	struct memseg	*msp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
	pfn_t		 base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
	pgcnt_t		 num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
	pfn_t		 lastseg_pages_end = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
	pgcnt_t		 nelem_used = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
	ASSERT(page_hash != NULL && page_hashsz != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	msp = memsegp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
	for (pmem = phys_avail; pmem && npages; pmem = pmem->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
		 * Build the memsegs entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
		num = btop(pmem->size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
		if (num > npages)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
			num = npages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
		npages -= num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
		base = btop(pmem->address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
		msp->pages = pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
		msp->epages = pp + num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
		msp->pages_base = base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
		msp->pages_end = base + num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
		if (kpm_enable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
			pfn_t pbase_a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
			pfn_t pend_a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
			pfn_t prev_pend_a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
			pgcnt_t	nelem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
			msp->pagespa = va_to_pa(pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
			msp->epagespa = va_to_pa(pp + num);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
			pbase_a = kpmptop(ptokpmp(base));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
			pend_a = kpmptop(ptokpmp(base + num - 1)) + kpmpnpgs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
			nelem = ptokpmp(pend_a - pbase_a);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
			msp->kpm_nkpmpgs = nelem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
			msp->kpm_pbase = pbase_a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
			if (lastseg_pages_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
				 * Assume phys_avail is in ascending order
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
				 * of physical addresses.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
				ASSERT(base + num > lastseg_pages_end);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
				prev_pend_a = kpmptop(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
				    ptokpmp(lastseg_pages_end - 1)) + kpmpnpgs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
				if (prev_pend_a > pbase_a) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
					 * Overlap, more than one memseg may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
					 * point to the same kpm_page range.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
					if (kpm_smallpages == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
						msp->kpm_pages =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
						    (kpm_page_t *)kpm_pp - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
						kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
							((kpm_page_t *)kpm_pp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
							+ nelem - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
					} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
						msp->kpm_spages =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
						    (kpm_spage_t *)kpm_pp - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
						kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
							((kpm_spage_t *)kpm_pp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
							+ nelem - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
					nelem_used += nelem - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
					if (kpm_smallpages == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
						msp->kpm_pages =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
						    (kpm_page_t *)kpm_pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
						kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
							((kpm_page_t *)kpm_pp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
							+ nelem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
					} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
						msp->kpm_spages =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
						    (kpm_spage_t *)kpm_pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
						kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
							((kpm_spage_t *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
							kpm_pp + nelem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
					nelem_used += nelem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
				if (kpm_smallpages == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
					msp->kpm_pages = (kpm_page_t *)kpm_pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
					kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
						((kpm_page_t *)kpm_pp + nelem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
					msp->kpm_spages = (kpm_spage_t *)kpm_pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
					kpm_pp = (uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
						((kpm_spage_t *)kpm_pp + nelem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
				nelem_used = nelem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
			if (nelem_used > kpm_npages)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
				panic("kphysm_init: kpm_pp overflow\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
			msp->kpm_pagespa = va_to_pa(msp->kpm_pages);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
			lastseg_pages_end = msp->pages_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
		memseg_list_add(msp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
		 * add_physmem() initializes the PSM part of the page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
		 * struct by calling the PSM back with add_physmem_cb().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
		 * In addition it coalesces pages into larger pages as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
		 * it initializes them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
		add_physmem(pp, num, base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
		pp += num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
		msp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	build_pfn_hash();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
 * Kernel VM initialization.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
 * Assumptions about kernel address space ordering:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
 *	(1) gap (user space)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
 *	(2) kernel text
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
 *	(3) kernel data/bss
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
 *	(4) gap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
 *	(5) kernel data structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
 *	(6) gap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
 *	(7) debugger (optional)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
 *	(8) monitor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
 *	(9) gap (possibly null)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
 *	(10) dvma
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
 *	(11) devices
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
kvm_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
	 * Put the kernel segments in kernel address space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
	rw_enter(&kas.a_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
	as_avlinit(&kas);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
	(void) seg_attach(&kas, (caddr_t)KERNELBASE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	    (size_t)(e_moddata - KERNELBASE), &ktextseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
	(void) segkmem_create(&ktextseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
	(void) seg_attach(&kas, (caddr_t)(KERNELBASE + MMU_PAGESIZE4M),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
	    (size_t)(MMU_PAGESIZE4M), &ktexthole);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
	(void) segkmem_create(&ktexthole);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
	(void) seg_attach(&kas, (caddr_t)valloc_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	    (size_t)(econtig32 - valloc_base), &kvalloc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
	(void) segkmem_create(&kvalloc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
	if (kmem64_base) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	    (void) seg_attach(&kas, (caddr_t)kmem64_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
		(size_t)(kmem64_end - kmem64_base), &kmem64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
	    (void) segkmem_create(&kmem64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
	 * We're about to map out /boot.  This is the beginning of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
	 * system resource management transition. We can no longer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
	 * call into /boot for I/O or memory allocations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
	(void) seg_attach(&kas, kernelheap, ekernelheap - kernelheap, &kvseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
	(void) segkmem_create(&kvseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
	hblk_alloc_dynamic = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
	 * we need to preallocate pages for DR operations before enabling large
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	 * page kernel heap because of memseg_remap_init() hat_unload() hack.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
	memseg_remap_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
	/* at this point we are ready to use large page heap */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
	segkmem_heap_lp_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
	(void) seg_attach(&kas, (caddr_t)SYSBASE32, SYSLIMIT32 - SYSBASE32,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
	    &kvseg32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
	(void) segkmem_create(&kvseg32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
	 * Create a segment for the debugger.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
	(void) seg_attach(&kas, (caddr_t)SEGDEBUGBASE, (size_t)SEGDEBUGSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
	    &kdebugseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
	(void) segkmem_create(&kdebugseg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
	rw_exit(&kas.a_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
char obp_tte_str[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
	"h# %x constant MMU_PAGESHIFT "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
	"h# %x constant TTE8K "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
	"h# %x constant SFHME_SIZE "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
	"h# %x constant SFHME_TTE "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
	"h# %x constant HMEBLK_TAG "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
	"h# %x constant HMEBLK_NEXT "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
	"h# %x constant HMEBLK_MISC "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	"h# %x constant HMEBLK_HME1 "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	"h# %x constant NHMENTS "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	"h# %x constant HBLK_SZMASK "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	"h# %x constant HBLK_RANGE_SHIFT "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	"h# %x constant HMEBP_HBLK "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
	"h# %x constant HMEBUCKET_SIZE "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
	"h# %x constant HTAG_SFMMUPSZ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
	"h# %x constant HTAG_REHASHSZ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
	"h# %x constant mmu_hashcnt "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
	"h# %p constant uhme_hash "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
	"h# %p constant khme_hash "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
	"h# %x constant UHMEHASH_SZ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
	"h# %x constant KHMEHASH_SZ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
	"h# %p constant KHATID "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
	"h# %x constant CTX_SIZE "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
	"h# %x constant CTX_SFMMU "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
	"h# %p constant ctxs "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
	"h# %x constant ASI_MEM "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
	": PHYS-X@ ( phys -- data ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
	"   ASI_MEM spacex@ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
	": PHYS-W@ ( phys -- data ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	"   ASI_MEM spacew@ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
	": PHYS-L@ ( phys -- data ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
	"   ASI_MEM spaceL@ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
	": TTE_PAGE_SHIFT ( ttesz -- hmeshift ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	"   3 * MMU_PAGESHIFT + "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
	": TTE_IS_VALID ( ttep -- flag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
	"   PHYS-X@ 0< "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
	": HME_HASH_SHIFT ( ttesz -- hmeshift ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
	"   dup TTE8K =  if "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
	"      drop HBLK_RANGE_SHIFT "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
	"   else "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
	"      TTE_PAGE_SHIFT "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
	"   then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
	": HME_HASH_BSPAGE ( addr hmeshift -- bspage ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
	"   tuck >> swap MMU_PAGESHIFT - << "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
	": HME_HASH_FUNCTION ( sfmmup addr hmeshift -- hmebp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
	"   >> over xor swap                    ( hash sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	"   KHATID <>  if                       ( hash ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
	"      UHMEHASH_SZ and                  ( bucket ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	"      HMEBUCKET_SIZE * uhme_hash +     ( hmebp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
	"   else                                ( hash ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
	"      KHMEHASH_SZ and                  ( bucket ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
	"      HMEBUCKET_SIZE * khme_hash +     ( hmebp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	"   then                                ( hmebp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
	": HME_HASH_TABLE_SEARCH "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
	"       ( sfmmup hmebp hblktag --  sfmmup null | sfmmup hmeblkp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
	"   >r hmebp_hblk + phys-x@ begin ( sfmmup hmeblkp ) ( r: hblktag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
	"      dup if   		( sfmmup hmeblkp ) ( r: hblktag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
	"         dup hmeblk_tag + phys-x@ r@ = if ( sfmmup hmeblkp )	  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
	"	     dup hmeblk_tag + 8 + phys-x@ 2 pick = if		  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
	"		  true 	( sfmmup hmeblkp true ) ( r: hblktag )	  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
	"	     else						  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
	"	     	  hmeblk_next + phys-x@ false 			  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
	"			( sfmmup hmeblkp false ) ( r: hblktag )   "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
	"	     then  						  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
	"	  else							  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
	"	     hmeblk_next + phys-x@ false 			  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
	"			( sfmmup hmeblkp false ) ( r: hblktag )   "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
	"	  then 							  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
	"      else							  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
	"         true 							  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
	"      then  							  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
	"   until r> drop 						  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
	": CNUM_TO_SFMMUP ( cnum -- sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
	"   CTX_SIZE * ctxs + CTX_SFMMU + "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
	"x@ "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
	": HME_HASH_TAG ( sfmmup rehash addr -- hblktag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
	"   over HME_HASH_SHIFT HME_HASH_BSPAGE      ( sfmmup rehash bspage ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
	"   HTAG_REHASHSZ << or nip		     ( hblktag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
	": HBLK_TO_TTEP ( hmeblkp addr -- ttep ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
	"   over HMEBLK_MISC + PHYS-L@ HBLK_SZMASK and  ( hmeblkp addr ttesz ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
	"   TTE8K =  if                            ( hmeblkp addr ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
	"      MMU_PAGESHIFT >> NHMENTS 1- and     ( hmeblkp hme-index ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
	"   else                                   ( hmeblkp addr ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
	"      drop 0                              ( hmeblkp 0 ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
	"   then                                   ( hmeblkp hme-index ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
	"   SFHME_SIZE * + HMEBLK_HME1 +           ( hmep ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
	"   SFHME_TTE +                            ( ttep ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
	": unix-tte ( addr cnum -- false | tte-data true ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
	"      CNUM_TO_SFMMUP                 ( addr sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
	"      mmu_hashcnt 1+ 1  do           ( addr sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
	"         2dup swap i HME_HASH_SHIFT  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
					"( addr sfmmup sfmmup addr hmeshift ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
	"         HME_HASH_FUNCTION           ( addr sfmmup hmebp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
	"         over i 4 pick               "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
				"( addr sfmmup hmebp sfmmup rehash addr ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
	"         HME_HASH_TAG                ( addr sfmmup hmebp hblktag ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
	"         HME_HASH_TABLE_SEARCH       "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
					"( addr sfmmup { null | hmeblkp } ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
	"         ?dup  if                    ( addr sfmmup hmeblkp ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
	"            nip swap HBLK_TO_TTEP    ( ttep ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
	"            dup TTE_IS_VALID  if     ( valid-ttep ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
	"               PHYS-X@ true          ( tte-data true ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
	"            else                     ( invalid-tte ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
	"               drop false            ( false ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
	"            then                     ( false | tte-data true ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
	"            unloop exit              ( false | tte-data true ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
	"         then                        ( addr sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
	"      loop                           ( addr sfmmup ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
	"      2drop false                    ( false ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
create_va_to_tte(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
	char *bp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
	extern int khmehash_num, uhmehash_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
	extern struct hmehash_bucket *khme_hash, *uhme_hash;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
#define	OFFSET(type, field)	((uintptr_t)(&((type *)0)->field))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
	bp = (char *)kobj_zalloc(MMU_PAGESIZE, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
	 * Teach obp how to parse our sw ttes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
	(void) sprintf(bp, obp_tte_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
	    MMU_PAGESHIFT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
	    TTE8K,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
	    sizeof (struct sf_hment),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
	    OFFSET(struct sf_hment, hme_tte),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
	    OFFSET(struct hme_blk, hblk_tag),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
	    OFFSET(struct hme_blk, hblk_nextpa),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
	    OFFSET(struct hme_blk, hblk_misc),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
	    OFFSET(struct hme_blk, hblk_hme),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
	    NHMENTS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
	    HBLK_SZMASK,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
	    HBLK_RANGE_SHIFT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
	    OFFSET(struct hmehash_bucket, hmeh_nextpa),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
	    sizeof (struct hmehash_bucket),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
	    HTAG_SFMMUPSZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
	    HTAG_REHASHSZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
	    mmu_hashcnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
	    (caddr_t)va_to_pa((caddr_t)uhme_hash),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
	    (caddr_t)va_to_pa((caddr_t)khme_hash),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
	    UHMEHASH_SZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
	    KHMEHASH_SZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
	    KHATID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
	    sizeof (struct ctx),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
	    OFFSET(struct ctx, ctx_sfmmu),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
	    ctxs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
	    ASI_MEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
	prom_interpret(bp, 0, 0, 0, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
	kobj_free(bp, MMU_PAGESIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
install_va_to_tte(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
	 * advise prom that he can use unix-tte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
	prom_interpret("' unix-tte is va>tte-data", 0, 0, 0, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2838
/*
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2839
 * Because kmdb links prom_stdout_is_framebuffer into its own
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2840
 * module, we add "device-type=display" here for /os-io node, so that
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2841
 * prom_stdout_is_framebuffer still works corrrectly  after /os-io node
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2842
 * is registered into OBP.
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2843
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
static char *create_node =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
	"root-device "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
	"new-device "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
	"\" os-io\" device-name "
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2848
	"\" display\" device-type "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
	": cb-r/w  ( adr,len method$ -- #read/#written ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
	"   2>r swap 2 2r> ['] $callback  catch  if "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
	"      2drop 3drop 0 "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
	"   then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
	": read ( adr,len -- #read ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
	"       \" read\" ['] cb-r/w catch  if  2drop 2drop -2 exit then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
	"       ( retN ... ret1 N ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
	"       ?dup  if "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
	"               swap >r 1-  0  ?do  drop  loop  r> "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
	"       else "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
	"               -2 "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
	"       then l->n "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
	";    "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
	": write ( adr,len -- #written ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
	"       \" write\" ['] cb-r/w catch  if  2drop 2drop 0 exit  then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
	"       ( retN ... ret1 N ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
	"       ?dup  if "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
	"               swap >r 1-  0  ?do  drop  loop  r> "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
	"        else "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
	"               0 "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
	"       then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
	": poll-tty ( -- ) ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
	": install-abort  ( -- )  ['] poll-tty d# 10 alarm ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
	": remove-abort ( -- )  ['] poll-tty 0 alarm ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
	": cb-give/take ( $method -- ) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
	"       0 -rot ['] $callback catch  ?dup  if "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
	"               >r 2drop 2drop r> throw "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
	"       else "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
	"               0  ?do  drop  loop "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
	"       then "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
	"; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
	": give ( -- )  \" exit-input\" cb-give/take ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
	": take ( -- )  \" enter-input\" cb-give/take ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
	": open ( -- ok? )  true ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
	": close ( -- ) ; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
	"finish-device "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
	"device-end ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
/*
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2890
 * Create the OBP input/output node (FCode serial driver).
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2891
 * It is needed for both USB console keyboard and for
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2892
 * the kernel terminal emulator.  It is too early to check for a
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2893
 * kernel console compatible framebuffer now, so we create this
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2894
 * so that we're ready if we need to enable kernel terminal emulation.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
 *
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2896
 * When the USB software takes over the input device at the time
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2897
 * consconfig runs, OBP's stdin is redirected to this node.
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2898
 * Whenever the FORTH user interface is used after this switch,
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2899
 * the node will call back into the kernel for console input.
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2900
 * If a serial device such as ttya or a UART with a Type 5 keyboard
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2901
 * attached is used, OBP takes over the serial device when the system
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2902
 * goes to the debugger after the system is booted.  This sharing
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2903
 * of the relatively simple serial device is difficult but possible.
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2904
 * Sharing the USB host controller is impossible due its complexity.
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2905
 *
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2906
 * Similarly to USB keyboard input redirection, after consconfig_dacf
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2907
 * configures a kernel console framebuffer as the standard output
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2908
 * device, OBP's stdout is switched to to vector through the
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2909
 * /os-io node into the kernel terminal emulator.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
static void
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2912
startup_create_io_node(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
{
1253
0df630a41817 PSARC 2003/432 Coherent Console
lq150181
parents: 1077
diff changeset
  2914
	prom_interpret(create_node, 0, 0, 0, 0, 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
do_prom_version_check(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
	int i;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 423
diff changeset
  2922
	pnode_t node;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
	char buf[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
	static char drev[] = "Down-rev firmware detected%s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
		"\tPlease upgrade to the following minimum version:\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
		"\t\t%s\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
	i = prom_version_check(buf, sizeof (buf), &node);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
	if (i == PROM_VER64_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
	if (i == PROM_VER64_UPGRADE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
		cmn_err(CE_WARN, drev, "", buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
		prom_enter_mon();	/* Type 'go' to continue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
		cmn_err(CE_WARN, "Booting with down-rev firmware\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
		halt(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
	 * The other possibility is that this is a server running
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
	 * good firmware, but down-rev firmware was detected on at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
	 * least one other cpu board. We just complain if we see
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
	 * that.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
	cmn_err(CE_WARN, drev, " on one or more CPU boards", buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
kpm_init()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
	kpm_pgshft = (kpm_smallpages == 0) ? MMU_PAGESHIFT4M : MMU_PAGESHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
	kpm_pgsz = 1ull << kpm_pgshft;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
	kpm_pgoff = kpm_pgsz - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
	kpmp2pshft = kpm_pgshft - PAGESHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
	kpmpnpgs = 1 << kpmp2pshft;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
	ASSERT(((uintptr_t)kpm_vbase & (kpm_pgsz - 1)) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
kpm_npages_setup(int memblocks)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
	 * npages can be scattered in a maximum of 'memblocks'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
	kpm_npages = ptokpmpr(npages) + memblocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
 * Must be defined in platform dependent code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
extern caddr_t modtext;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
extern size_t modtext_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
extern caddr_t moddata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
#define	HEAPTEXT_ARENA(addr)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
	((uintptr_t)(addr) < KERNELBASE + 2 * MMU_PAGESIZE4M ? 0 : \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
	(((uintptr_t)(addr) - HEAPTEXT_BASE) / \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
	(HEAPTEXT_MAPPED + HEAPTEXT_UNMAPPED) + 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
#define	HEAPTEXT_OVERSIZED(addr)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
	((uintptr_t)(addr) >= HEAPTEXT_BASE + HEAPTEXT_SIZE - HEAPTEXT_OVERSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
vmem_t *texthole_source[HEAPTEXT_NARENAS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
vmem_t *texthole_arena[HEAPTEXT_NARENAS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
kmutex_t texthole_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
char kern_bootargs[OBP_MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
kobj_vmem_init(vmem_t **text_arena, vmem_t **data_arena)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
	uintptr_t addr, limit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
	addr = HEAPTEXT_BASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
	limit = addr + HEAPTEXT_SIZE - HEAPTEXT_OVERSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
	 * Before we initialize the text_arena, we want to punch holes in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
	 * underlying heaptext_arena.  This guarantees that for any text
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
	 * address we can find a text hole less than HEAPTEXT_MAPPED away.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
	for (; addr + HEAPTEXT_UNMAPPED <= limit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
	    addr += HEAPTEXT_MAPPED + HEAPTEXT_UNMAPPED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
		(void) vmem_xalloc(heaptext_arena, HEAPTEXT_UNMAPPED, PAGESIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
		    0, 0, (void *)addr, (void *)(addr + HEAPTEXT_UNMAPPED),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
		    VM_NOSLEEP | VM_BESTFIT | VM_PANIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
	 * Allocate one page at the oversize to break up the text region
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
	 * from the oversized region.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
	(void) vmem_xalloc(heaptext_arena, PAGESIZE, PAGESIZE, 0, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
	    (void *)limit, (void *)(limit + PAGESIZE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
	    VM_NOSLEEP | VM_BESTFIT | VM_PANIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
	*text_arena = vmem_create("module_text", modtext, modtext_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
	    sizeof (uintptr_t), segkmem_alloc, segkmem_free,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
	    heaptext_arena, 0, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
	*data_arena = vmem_create("module_data", moddata, MODDATA, 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
	    segkmem_alloc, segkmem_free, heap32_arena, 0, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
caddr_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
kobj_text_alloc(vmem_t *arena, size_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
	caddr_t rval, better;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
	 * First, try a sleeping allocation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
	rval = vmem_alloc(arena, size, VM_SLEEP | VM_BESTFIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
	if (size >= HEAPTEXT_MAPPED || !HEAPTEXT_OVERSIZED(rval))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
		return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
	 * We didn't get the area that we wanted.  We're going to try to do an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
	 * allocation with explicit constraints.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
	better = vmem_xalloc(arena, size, sizeof (uintptr_t), 0, 0, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
	    (void *)(HEAPTEXT_BASE + HEAPTEXT_SIZE - HEAPTEXT_OVERSIZE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
	    VM_NOSLEEP | VM_BESTFIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
	if (better != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
		 * That worked.  Free our first attempt and return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
		vmem_free(arena, rval, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
		return (better);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
	 * That didn't work; we'll have to return our first attempt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
caddr_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
kobj_texthole_alloc(caddr_t addr, size_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
	int arena = HEAPTEXT_ARENA(addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
	char c[30];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3070
	uintptr_t base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
	if (HEAPTEXT_OVERSIZED(addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
		 * If this is an oversized allocation, there is no text hole
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
		 * available for it; return NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
	mutex_enter(&texthole_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
	if (texthole_arena[arena] == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
		ASSERT(texthole_source[arena] == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3084
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3085
		if (arena == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
			texthole_source[0] = vmem_create("module_text_holesrc",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
			    (void *)(KERNELBASE + MMU_PAGESIZE4M),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
			    MMU_PAGESIZE4M, PAGESIZE, NULL, NULL, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
			    0, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
			base = HEAPTEXT_BASE +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
			    (arena - 1) * (HEAPTEXT_MAPPED + HEAPTEXT_UNMAPPED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
			(void) snprintf(c, sizeof (c),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
			    "heaptext_holesrc_%d", arena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
			texthole_source[arena] = vmem_create(c, (void *)base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
			    HEAPTEXT_UNMAPPED, PAGESIZE, NULL, NULL, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
			    0, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
		(void) snprintf(c, sizeof (c), "heaptext_hole_%d", arena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
		texthole_arena[arena] = vmem_create(c, NULL, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
		    sizeof (uint32_t), segkmem_alloc_permanent, segkmem_free,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
		    texthole_source[arena], 0, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
	mutex_exit(&texthole_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
	ASSERT(texthole_arena[arena] != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
	ASSERT(arena >= 0 && arena < HEAPTEXT_NARENAS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
	return (vmem_alloc(texthole_arena[arena], size,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
	    VM_BESTFIT | VM_NOSLEEP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
kobj_texthole_free(caddr_t addr, size_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
	int arena = HEAPTEXT_ARENA(addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
	ASSERT(arena >= 0 && arena < HEAPTEXT_NARENAS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
	ASSERT(texthole_arena[arena] != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3124
	vmem_free(texthole_arena[arena], addr, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
}