version 1.43, 2018/10/14 14:31:05 |
version 1.44, 2018/10/18 09:01:54 |
Line 141 fdt_putchar(char c) |
|
Line 141 fdt_putchar(char c) |
|
const struct arm_platform *plat = arm_fdt_platform(); |
const struct arm_platform *plat = arm_fdt_platform(); |
if (plat && plat->ap_early_putchar) { |
if (plat && plat->ap_early_putchar) { |
plat->ap_early_putchar(c); |
plat->ap_early_putchar(c); |
} |
} else { |
else { |
uartputc(c); |
#define PLATFORM_EARLY_PUTCHAR ___CONCAT(EARLYCONS, _platform_early_putchar) |
|
void PLATFORM_EARLY_PUTCHAR(char); |
|
PLATFORM_EARLY_PUTCHAR(c); |
|
} |
} |
#endif |
#endif |
} |
} |
Line 209 fdt_get_memory(uint64_t *pstart, uint64_ |
|
Line 206 fdt_get_memory(uint64_t *pstart, uint64_ |
|
void |
void |
fdt_add_reserved_memory_range(uint64_t addr, uint64_t size) |
fdt_add_reserved_memory_range(uint64_t addr, uint64_t size) |
{ |
{ |
uint64_t start = trunc_page(addr); |
uint64_t start = addr; |
uint64_t end = round_page(addr + size); |
uint64_t end = addr + size; |
|
|
int error = extent_free(fdt_memory_ext, start, |
int error = extent_free(fdt_memory_ext, start, |
end - start, EX_NOWAIT); |
end - start, EX_NOWAIT); |
Line 227 fdt_add_reserved_memory_range(uint64_t a |
|
Line 224 fdt_add_reserved_memory_range(uint64_t a |
|
static void |
static void |
fdt_add_reserved_memory(uint64_t min_addr, uint64_t max_addr) |
fdt_add_reserved_memory(uint64_t min_addr, uint64_t max_addr) |
{ |
{ |
|
uint64_t lstart = 0, lend = 0; |
uint64_t addr, size; |
uint64_t addr, size; |
int index, error; |
int index, error; |
|
|
Line 234 fdt_add_reserved_memory(uint64_t min_add |
|
Line 232 fdt_add_reserved_memory(uint64_t min_add |
|
for (index = 0; index <= num; index++) { |
for (index = 0; index <= num; index++) { |
error = fdt_get_mem_rsv(fdtbus_get_data(), index, |
error = fdt_get_mem_rsv(fdtbus_get_data(), index, |
&addr, &size); |
&addr, &size); |
if (error != 0 || size == 0) |
if (error != 0) |
|
continue; |
|
if (lstart <= addr && addr <= lend) { |
|
size -= (lend - addr); |
|
addr = lend; |
|
} |
|
if (size == 0) |
continue; |
continue; |
if (addr + size <= min_addr) |
if (addr + size <= min_addr) |
continue; |
continue; |
Line 247 fdt_add_reserved_memory(uint64_t min_add |
|
Line 251 fdt_add_reserved_memory(uint64_t min_add |
|
if (addr + size > max_addr) |
if (addr + size > max_addr) |
size = max_addr - addr; |
size = max_addr - addr; |
fdt_add_reserved_memory_range(addr, size); |
fdt_add_reserved_memory_range(addr, size); |
|
lstart = addr; |
|
lend = addr + size; |
} |
} |
} |
} |
|
|
Line 401 initarm(void *arg) |
|
Line 407 initarm(void *arg) |
|
OF_getprop(chosen, "bootargs", bootargs, sizeof(bootargs)); |
OF_getprop(chosen, "bootargs", bootargs, sizeof(bootargs)); |
boot_args = bootargs; |
boot_args = bootargs; |
|
|
VPRINTF("devmap\n"); |
|
pmap_devmap_register(plat->ap_devmap()); |
|
#ifdef __aarch64__ |
|
pmap_devmap_bootstrap(plat->ap_devmap()); |
|
#endif |
|
|
|
/* Heads up ... Setup the CPU / MMU / TLB functions. */ |
/* Heads up ... Setup the CPU / MMU / TLB functions. */ |
VPRINTF("cpufunc\n"); |
VPRINTF("cpufunc\n"); |
if (set_cpufuncs()) |
if (set_cpufuncs()) |
panic("cpu not recognized!"); |
panic("cpu not recognized!"); |
|
|
|
/* |
|
* Memory is still identity/flat mapped this point so using ttbr for |
|
* l1pt VA is fine |
|
*/ |
|
|
|
VPRINTF("devmap\n"); |
|
extern char ARM_BOOTSTRAP_LxPT[]; |
|
pmap_devmap_bootstrap((vaddr_t)ARM_BOOTSTRAP_LxPT, plat->ap_devmap()); |
|
|
VPRINTF("bootstrap\n"); |
VPRINTF("bootstrap\n"); |
plat->ap_bootstrap(); |
plat->ap_bootstrap(); |
|
|
Line 419 initarm(void *arg) |
|
Line 428 initarm(void *arg) |
|
* If stdout-path is specified on the command line, override the |
* If stdout-path is specified on the command line, override the |
* value in /chosen/stdout-path before initializing console. |
* value in /chosen/stdout-path before initializing console. |
*/ |
*/ |
|
VPRINTF("stdout\n"); |
fdt_update_stdout_path(); |
fdt_update_stdout_path(); |
|
|
/* |
/* |
Line 457 initarm(void *arg) |
|
Line 467 initarm(void *arg) |
|
#endif |
#endif |
uint64_t memory_size = memory_end - memory_start; |
uint64_t memory_size = memory_end - memory_start; |
|
|
|
VPRINTF("%s: memory start %" PRIx64 " end %" PRIx64 " (len %" |
|
PRIx64 ")\n", __func__, memory_start, memory_end, memory_size); |
|
|
/* Parse ramdisk info */ |
/* Parse ramdisk info */ |
fdt_probe_initrd(&initrd_start, &initrd_end); |
fdt_probe_initrd(&initrd_start, &initrd_end); |
|
|
Line 464 initarm(void *arg) |
|
Line 477 initarm(void *arg) |
|
* Populate bootconfig structure for the benefit of |
* Populate bootconfig structure for the benefit of |
* dodumpsys |
* dodumpsys |
*/ |
*/ |
|
VPRINTF("%s: fdt_build_bootconfig\n", __func__); |
fdt_build_bootconfig(memory_start, memory_end); |
fdt_build_bootconfig(memory_start, memory_end); |
|
|
/* Perform PT build and VM init */ |
/* Perform PT build and VM init */ |
Line 478 initarm(void *arg) |
|
Line 492 initarm(void *arg) |
|
int nfdt_physmem = 0; |
int nfdt_physmem = 0; |
struct extent_region *er; |
struct extent_region *er; |
|
|
|
VPRINTF("Memory regions :\n"); |
LIST_FOREACH(er, &fdt_memory_ext->ex_regions, er_link) { |
LIST_FOREACH(er, &fdt_memory_ext->ex_regions, er_link) { |
VPRINTF(" %lx - %lx\n", er->er_start, er->er_end); |
VPRINTF(" %lx - %lx\n", er->er_start, er->er_end); |
struct boot_physmem *bp = &fdt_physmem[nfdt_physmem++]; |
struct boot_physmem *bp = &fdt_physmem[nfdt_physmem++]; |
|
|
KASSERT(nfdt_physmem <= MAX_PHYSMEM); |
KASSERT(nfdt_physmem <= MAX_PHYSMEM); |
bp->bp_start = atop(er->er_start); |
|
bp->bp_pages = atop(er->er_end - er->er_start); |
bp->bp_start = atop(round_page(er->er_start)); |
|
bp->bp_pages = atop(trunc_page(er->er_end + 1)) - bp->bp_start; |
bp->bp_freelist = VM_FREELIST_DEFAULT; |
bp->bp_freelist = VM_FREELIST_DEFAULT; |
|
|
#ifdef _LP64 |
#ifdef _LP64 |
Line 500 initarm(void *arg) |
|
Line 516 initarm(void *arg) |
|
#endif |
#endif |
} |
} |
|
|
return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, fdt_physmem, |
u_int sp = initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, fdt_physmem, |
nfdt_physmem); |
nfdt_physmem); |
|
|
|
VPRINTF("mpstart\n"); |
|
if (plat->ap_mpstart) |
|
plat->ap_mpstart(); |
|
|
|
/* |
|
* Now we have APs started the pages used for stacks and L1PT can |
|
* be given to uvm |
|
*/ |
|
extern char __start__init_memory[], __stop__init_memory[]; |
|
if (__start__init_memory != __stop__init_memory) { |
|
const paddr_t spa = KERN_VTOPHYS((vaddr_t)__start__init_memory); |
|
const paddr_t epa = KERN_VTOPHYS((vaddr_t)__stop__init_memory); |
|
const paddr_t spg = atop(spa); |
|
const paddr_t epg = atop(epa); |
|
|
|
uvm_page_physload(spg, epg, spg, epg, VM_FREELIST_DEFAULT); |
|
|
|
VPRINTF(" start %08lx end %08lx", ptoa(spa), ptoa(epa)); |
|
} |
|
|
|
return sp; |
} |
} |
|
|
static void |
static void |