Add support kloader(4) for PXA2X0.

This commit is contained in:
nonaka 2012-03-31 14:02:54 +00:00
parent 4970a4c570
commit 1e92636e2f
12 changed files with 485 additions and 177 deletions

View File

@ -1,7 +1,7 @@
#
# kernel config file for system install
#
# $NetBSD: INSTALL_WZERO3,v 1.1 2010/04/17 13:36:21 nonaka Exp $
# $NetBSD: INSTALL_WZERO3,v 1.2 2012/03/31 14:02:54 nonaka Exp $
#
include "arch/hpcarm/conf/WZERO3"
@ -11,3 +11,5 @@ options MEMORY_DISK_HOOKS
options MEMORY_DISK_IS_ROOT # force root on memory disk
options MEMORY_DISK_SERVER=0 # no userspace memory disk support
options MEMORY_DISK_ROOT_SIZE=8704 # size of memory disk, in blocks
no options KLOADER

View File

@ -1,4 +1,4 @@
# $NetBSD: NETBOOKPRO,v 1.4 2012/03/10 21:51:52 joerg Exp $
# $NetBSD: NETBOOKPRO,v 1.5 2012/03/31 14:02:54 nonaka Exp $
#
# NETBOOKPRO -- Psion Teklogix NETBOOK PRO
#
@ -8,11 +8,16 @@ include "arch/hpcarm/conf/files.netbookpro"
#options INCLUDE_CONFIG_FILE # embed config file in kernel binary
#ident "GENERIC-$Revision: 1.4 $"
#ident "GENERIC-$Revision: 1.5 $"
# estimated number of users
maxusers 32
# in-kernel bootloader, see kloader(4)
options KLOADER
#options KLOADER_KERNEL_PATH="\"/netbsd\""
#options KLOADER_DEBUG
# Standard system options
#options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT

View File

@ -1,4 +1,4 @@
# $NetBSD: WZERO3,v 1.24 2012/03/10 21:51:52 joerg Exp $
# $NetBSD: WZERO3,v 1.25 2012/03/31 14:02:54 nonaka Exp $
#
# WZERO3 -- Sharp Windows Mobile 5 based PDA
#
@ -8,11 +8,16 @@ include "arch/hpcarm/conf/files.wzero3"
#options INCLUDE_CONFIG_FILE # embed config file in kernel binary
#ident "GENERIC-$Revision: 1.24 $"
#ident "GENERIC-$Revision: 1.25 $"
# estimated number of users
maxusers 32
# in-kernel bootloader, see kloader(4)
options KLOADER
#options KLOADER_KERNEL_PATH="\"/netbsd\""
#options KLOADER_DEBUG
# Standard system options
#options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT

View File

@ -1,4 +1,4 @@
# $NetBSD: files.hpcarm,v 1.65 2010/04/17 13:36:21 nonaka Exp $
# $NetBSD: files.hpcarm,v 1.66 2012/03/31 14:02:54 nonaka Exp $
#
# hpcarm specific configuration info
#
@ -27,6 +27,13 @@ file arch/hpcarm/hpcarm/autoconf.c
# HPCARM specific files
file arch/hpcarm/hpcarm/hpc_machdep.c
# kloader
defflag opt_kloader.h KLOADER
defparam opt_kloader.h KLOADER_KERNEL_PATH
defflag debug_kloader.h KLOADER_DEBUG
file dev/kloader.c kloader
file arch/hpcarm/hpcarm/kloader_machdep.c kloader
#
# H/PC Platform common files.
#

View File

@ -1,9 +1,10 @@
# $NetBSD: files.pxa2x0,v 1.4 2011/06/21 15:23:57 kiyohara Exp $
# $NetBSD: files.pxa2x0,v 1.5 2012/03/31 14:02:54 nonaka Exp $
#
# PXA2x0 specific configuration info
#
file arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c
file arch/hpcarm/hpcarm/kloader_pxa2x0.S kloader
# Include hpcarm/XScale config definitions.
include "arch/arm/xscale/files.pxa2x0"

View File

@ -1,4 +1,4 @@
/* $NetBSD: hpc_machdep.c,v 1.99 2010/11/14 03:17:50 uebayasi Exp $ */
/* $NetBSD: hpc_machdep.c,v 1.100 2012/03/31 14:02:54 nonaka Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@ -40,12 +40,20 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: hpc_machdep.c,v 1.99 2010/11/14 03:17:50 uebayasi Exp $");
__KERNEL_RCSID(0, "$NetBSD: hpc_machdep.c,v 1.100 2012/03/31 14:02:54 nonaka Exp $");
#include "opt_cputypes.h"
#include "opt_kloader.h"
#ifndef KLOADER_KERNEL_PATH
#define KLOADER_KERNEL_PATH "/netbsd"
#endif
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/reboot.h>
#include <sys/boot_flag.h>
#include <sys/mount.h>
#include <sys/pmf.h>
#include <sys/reboot.h>
#include <uvm/uvm.h>
@ -53,12 +61,20 @@ __KERNEL_RCSID(0, "$NetBSD: hpc_machdep.c,v 1.99 2010/11/14 03:17:50 uebayasi Ex
#include <machine/bootconfig.h>
#include <machine/bootinfo.h>
#include <machine/platid.h>
#include <machine/pmap.h>
#ifdef KLOADER
#include <machine/kloader.h>
#endif
#include <dev/cons.h>
#include <dev/hpc/apm/apmvar.h>
BootConfig bootconfig; /* Boot config storage */
#ifdef KLOADER
struct kloader_bootinfo kbootinfo;
static char kernel_path[] = KLOADER_KERNEL_PATH;
#endif
struct bootinfo *bootinfo, bootinfo_storage;
char booted_kernel_storage[80];
char *booted_kernel = booted_kernel_storage;
@ -92,6 +108,14 @@ void *__sleep_ctx;
void (*__cpu_reset)(void) = cpu_reset;
u_int initarm(int, char **, struct bootinfo *);
#if defined(CPU_SA1100) || defined(CPU_SA1110)
u_int init_sa11x0(int, char **, struct bootinfo *);
#endif
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
u_int init_pxa2x0(int, char **, struct bootinfo *);
#endif
#ifdef BOOT_DUMP
void dumppages(char *, int);
#endif
@ -105,6 +129,7 @@ void dumppages(char *, int);
void
cpu_reboot(int howto, char *bootstr)
{
/*
* If we are still cold then hit the air brakes
* and crash to earth fast.
@ -128,6 +153,16 @@ cpu_reboot(int howto, char *bootstr)
/* Disable console buffering. */
cnpollc(1);
#ifdef KLOADER
if ((howto & RB_HALT) == 0) {
if (howto & RB_STRING) {
kloader_reboot_setup(bootstr);
} else {
kloader_reboot_setup(kernel_path);
}
}
#endif
/*
* If RB_NOSYNC was not specified sync the discs.
* Note: Unless cold is set to 1 here, syslogd will die during
@ -157,6 +192,11 @@ cpu_reboot(int howto, char *bootstr)
printf("The operating system has halted.\n");
printf("Please press any key to reboot.\n\n");
cngetc();
#ifdef KLOADER
} else {
kloader_reboot();
/* NOTREACHED */
#endif
}
printf("rebooting...\n");
@ -177,6 +217,95 @@ machine_standby(void)
{
}
/*
* Initial entry point on startup. This gets called before main() is
* entered.
* It should be responsible for setting up everything that must be
* in place when main is called.
* This includes:
* Taking a copy of the boot configuration structure.
*/
u_int
initarm(int argc, char **argv, struct bootinfo *bi)
{
__sleep_func = NULL;
__sleep_ctx = NULL;
/* parse kernel args */
boothowto = 0;
boot_file[0] = '\0';
if (argc > 0 && argv != NULL) {
strncpy(booted_kernel_storage, argv[0],
sizeof(booted_kernel_storage));
for (int i = 1; i < argc; i++) {
char *cp = argv[i];
switch (*cp) {
case 'b':
/* boot device: -b=sd0 etc. */
cp = cp + 2;
if (strcmp(cp, MOUNT_NFS) == 0)
rootfstype = MOUNT_NFS;
else
strncpy(boot_file, cp,
sizeof(boot_file));
break;
default:
BOOT_FLAG(*cp, boothowto);
break;
}
}
}
/* copy bootinfo into known kernel space */
if (bi != NULL)
bootinfo_storage = *bi;
bootinfo = &bootinfo_storage;
#ifdef BOOTINFO_FB_WIDTH
bootinfo->fb_line_bytes = BOOTINFO_FB_LINE_BYTES;
bootinfo->fb_width = BOOTINFO_FB_WIDTH;
bootinfo->fb_height = BOOTINFO_FB_HEIGHT;
bootinfo->fb_type = BOOTINFO_FB_TYPE;
#endif
if (bootinfo->magic == BOOTINFO_MAGIC) {
platid.dw.dw0 = bootinfo->platid_cpu;
platid.dw.dw1 = bootinfo->platid_machine;
#ifndef RTC_OFFSET
/*
* rtc_offset from bootinfo.timezone set by hpcboot.exe
*/
if (rtc_offset == 0 &&
(bootinfo->timezone > (-12 * 60) &&
bootinfo->timezone <= (12 * 60)))
rtc_offset = bootinfo->timezone;
#endif
}
#ifdef KLOADER
/* copy boot parameter for kloader */
kloader_bootinfo_set(&kbootinfo, argc, argv, bi, false);
#endif
/*
* Heads up ... Setup the CPU / MMU / TLB functions.
*/
set_cpufuncs();
IRQdisable;
#if defined(CPU_SA1100) || defined(CPU_SA1110)
return init_sa11x0(argc, argv, bi);
#elif defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
return init_pxa2x0(argc, argv, bi);
#else
#error No CPU support
#endif
}
#ifdef BOOT_DUMP
static void
dumppages(char *start, int nbytes)

View File

@ -0,0 +1,108 @@
/* $NetBSD: kloader_machdep.c,v 1.1 2012/03/31 14:02:54 nonaka Exp $ */
/*-
* Copyright (C) 2012 NONAKA Kimihiro <nonaka@netbsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kloader_machdep.c,v 1.1 2012/03/31 14:02:54 nonaka Exp $");
#include "debug_kloader.h"
#include "opt_cputypes.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <machine/kloader.h>
#include <machine/pmap.h>
#include <arm/cpufunc.h>
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
#include <arm/xscale/pxa2x0reg.h>
#endif
kloader_jumpfunc_t kloader_hpcarm_jump __attribute__((__noreturn__));
void kloader_hpcarm_reset(void);
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
kloader_bootfunc_t kloader_pxa2x0_boot __attribute__((__noreturn__));
#endif
struct kloader_ops kloader_hpcarm_ops = {
.jump = kloader_hpcarm_jump,
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
.boot = kloader_pxa2x0_boot,
#endif
.reset = kloader_hpcarm_reset,
};
void
kloader_reboot_setup(const char *filename)
{
__kloader_reboot_setup(&kloader_hpcarm_ops, filename);
}
void
kloader_hpcarm_reset(void)
{
extern void (*__cpu_reset)(void);
__cpu_reset();
/*NOTREACHED*/
}
void
kloader_hpcarm_jump(kloader_bootfunc_t func, vaddr_t sp,
struct kloader_bootinfo *kbi, struct kloader_page_tag *tag)
{
disable_interrupts(I32_bit|F32_bit);
cpu_idcache_wbinv_all();
/* jump to 2nd boot-loader */
(*func)(kbi, tag);
}
/*
* Physcal address to virtual address
*/
vaddr_t
kloader_phystov(paddr_t pa)
{
vaddr_t va;
int error;
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
va = KERNEL_BASE + pa - PXA2X0_SDRAM0_START;
#else
#error No support KLOADER with specific CPU type.
#endif
error = pmap_enter(pmap_kernel(), va, pa, VM_PROT_ALL, 0);
if (error) {
printf("%s: map failed: pa=0x%lx, va=0x%lx, error=%d\n",
__func__, pa, va, error);
}
return va;
}

View File

@ -0,0 +1,135 @@
/* $NetBSD: kloader_pxa2x0.S,v 1.1 2012/03/31 14:02:54 nonaka Exp $ */
/*-
* Copyright (C) 2012 NONAKA Kimihiro <nonaka@netbsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <machine/asm.h>
#include <arm/armreg.h>
/*
* CPWAIT -- Canonical method to wait for CP15 update.
* NOTE: Clobbers the specified temp reg.
* copied from arm/arm/cpufunc_asm_xscale.S
* XXX: better be in a common header file.
*/
#define CPWAIT_BRANCH \
sub pc, pc, #4
#define CPWAIT(tmp) \
mrc p15, 0, tmp, c2, c0, 0 /* arbitrary read of CP15 */ ;\
mov tmp, tmp /* wait for it to complete */ ;\
CPWAIT_BRANCH /* branch to next insn */
#define VATOPA(reg) \
bic reg, reg, #0xff000000 /* clear upper 8 bits */ ;\
orr reg, reg, #0xa0000000 /* OR in physical base address */
.text
.align 0
/*
* void
* kloader_pxa2x0_boot(struct kloader_bootinfo *kbi,
* struct kloader_page_tag *tag)
*
* r0: kbi, r1: tag
*/
.global _C_LABEL(kloader_pxa2x0_boot)
_C_LABEL(kloader_pxa2x0_boot):
mov lr, r0 /* lr: kbi */
VATOPA(lr)
/* We will go ahead and disable the MMU here. */
adr r8, .Lmmuoff
VATOPA(r8)
mrc p15, 0, r2, c1, c0, 0
bic r2, r2, #CPU_CONTROL_MMU_ENABLE
bic r2, r2, #CPU_CONTROL_DC_ENABLE
bic r2, r2, #CPU_CONTROL_IC_ENABLE
mcr p15, 0, r2, c1, c0, 0
nop
nop
nop
mov pc, r8 /* Heave-ho! */
.align 0
.Lmmuoff:
nop
nop
nop
/* Load kernel image */
mov r4, r1 /* tag */
1: mov r3, r4
cmp r3, #0 /* tag == NULL */
beq 3f
VATOPA(r3)
ldmia r3, {r4-r7} /* r4: next, r5: src, r6: dst, r7: sz */
VATOPA(r5)
VATOPA(r6)
add r8, r6, r7 /* r8: dst + sz */
2: ldr r9, [r5], #4 /* copy */
str r9, [r6], #4
cmp r8, r6
bne 2b
b 1b
3:
/* Set temporary stack pointer */
ldr sp, .Lstack_addr
/* Jump to kernel entry */
mov r3, lr /* r3: kbi */
ldr lr, [r3] /* kbi->entry */
VATOPA(lr)
ldr r0, [r3, #4] /* kbi->argc */
ldr r1, [r3, #8] /* kbi->argv */
add r2, r3, #12 /* &kbi->bootinfo */
/* Fixup argv[] */
cmp r1, #0 /* argv == NULL */
beq 5f
VATOPA(r1)
cmp r0, #0 /* argc == 0 */
beq 5f
mov r3, r0
mov r4, r1
4: ldr r5, [r4]
VATOPA(r5)
str r5, [r4], #4
subs r3, r3, #1
bgt 4b
5: /* Jump! */
mov pc, lr
99: b 99b
.Lstack_addr:
.word 0xa0004000

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.S,v 1.12 2010/04/17 13:36:21 nonaka Exp $ */
/* $NetBSD: locore.S,v 1.13 2012/03/31 14:02:54 nonaka Exp $ */
/*
* Copyright (C) 1994-1997 Mark Brinicombe
@ -122,13 +122,11 @@ ASENTRY_NP(start)
CPWAIT(r9)
/* Jump to kernel code in TRUE VA */
adr r9, .Lstart
ldmia r9, {r9, sp} /* and set stack pointer */
ldr r9, .Lhpc_start
mov pc, r9
.Lstart:
.Lhpc_start:
.word hpc_start
.word svcstk + INIT_ARM_STACK_SIZE
#define MMU_INIT(va,pa,n_sec,attr) \
.word (n_sec); \
@ -145,17 +143,22 @@ ASENTRY_NP(start)
MMU_INIT(0xa0000000, 0xa0000000, 256, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
/* map VA 0xc0000000..0xcfffffff to PA 0xa0000000..0xafffffff */
MMU_INIT(0xc0000000, 0xa0000000, 256, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
.word 0,0,0 /* end of table */
.bss
svcstk:
.space INIT_ARM_STACK_SIZE
.text
.align 0
ASENTRY_NP(hpc_start)
#endif
#endif /* CPU_XSCALE_PXA250 | CPU_XSCALE_PXA270 */
adr r5, .Lstart
ldmia r5, {r3, r4, sp} /* Set initial stack and */
sub r4, r4, r3 /* get zero init data */
mov r5, #0
.L1:
str r5, [r3], #4 /* Zero the bss */
subs r4, r4, #4
bgt .L1
mov fp, #0x00000000 /* trace back starts here */
bl _C_LABEL(initarm) /* Off we go */
@ -177,6 +180,15 @@ ASENTRY_NP(hpc_start)
/* Never gets here */
b .
.Lstart:
.word _edata
.word _end
.word svcstk + INIT_ARM_STACK_SIZE
.bss
svcstk:
.space INIT_ARM_STACK_SIZE
.text
.align 0

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0_hpc_machdep.c,v 1.14 2012/03/05 12:15:23 nonaka Exp $ */
/* $NetBSD: pxa2x0_hpc_machdep.c,v 1.15 2012/03/31 14:02:54 nonaka Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.14 2012/03/05 12:15:23 nonaka Exp $");
__KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.15 2012/03/31 14:02:54 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_dram_pages.h"
@ -56,7 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.14 2012/03/05 12:15:23 nona
#include <sys/msgbuf.h>
#include <sys/exec.h>
#include <sys/ksyms.h>
#include <sys/boot_flag.h>
#include <sys/conf.h> /* XXX for consinit related hacks */
#include <sys/device.h>
#include <sys/bus.h>
@ -94,12 +93,6 @@ __KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.14 2012/03/05 12:15:23 nona
#include <dev/hpc/apm/apmvar.h>
#include <dev/ic/comreg.h>
#include <sys/mount.h>
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
#include <nfs/nfs.h>
#include <nfs/nfsmount.h>
/* Kernel text starts 2MB in from the bottom of the kernel address space. */
#define KERNEL_TEXT_BASE (KERNEL_BASE + 0x00200000)
#ifndef KERNEL_VM_BASE
@ -125,9 +118,6 @@ u_int cpu_reset_address = 0;
#define UND_STACK_SIZE 1
extern BootConfig bootconfig; /* Boot config storage */
extern struct bootinfo *bootinfo, bootinfo_storage;
extern char booted_kernel_storage[80];
extern char *booted_kernel;
extern paddr_t physical_start;
extern paddr_t physical_freestart;
@ -141,9 +131,6 @@ extern pv_addr_t undstack;
extern pv_addr_t abtstack;
extern pv_addr_t kernelstack;
extern char *boot_args;
extern char boot_file[16];
extern vaddr_t msgbufphys;
extern u_int data_abort_handler_address;
@ -173,7 +160,7 @@ void prefetch_abort_handler(trapframe_t *);
void undefinedinstruction_bounce(trapframe_t *);
u_int cpu_get_control(void);
u_int initarm(int, char **, struct bootinfo *);
u_int init_pxa2x0(int, char **, struct bootinfo *);
/* Machine dependent initialize function */
extern void pxa2x0_machdep_init(void);
@ -270,17 +257,14 @@ read_ttb(void)
}
/*
* Initial entry point on startup. This gets called before main() is
* entered.
* It should be responsible for setting up everything that must be
* in place when main is called.
* This includes:
* Taking a copy of the boot configuration structure.
* Initializing the physical console so characters can be printed.
* Setting up page tables for the kernel.
*/
u_int
initarm(int argc, char **argv, struct bootinfo *bi)
init_pxa2x0(int argc, char **argv, struct bootinfo *bi)
{
#ifdef DIAGNOSTIC
extern vsize_t xscale_minidata_clean_size; /* used in KASSERT */
@ -290,68 +274,11 @@ initarm(int argc, char **argv, struct bootinfo *bi)
u_int l1pagetable;
vaddr_t freemempos;
vsize_t pt_size;
int loop, i;
int loop;
#if NKSYMS || defined(DDB) || defined(MODULAR)
Elf_Shdr *sh;
#endif
__sleep_func = NULL;
__sleep_ctx = NULL;
/* parse kernel args */
boothowto = 0;
boot_file[0] = '\0';
strncpy(booted_kernel_storage, argv[0], sizeof(booted_kernel_storage));
for (i = 1; i < argc; i++) {
char *cp = argv[i];
switch (*cp) {
case 'b':
/* boot device: -b=sd0 etc. */
cp = cp + 2;
if (strcmp(cp, MOUNT_NFS) == 0)
rootfstype = MOUNT_NFS;
else
strncpy(boot_file, cp, sizeof(boot_file));
break;
default:
BOOT_FLAG(*cp, boothowto);
break;
}
}
/* copy bootinfo into known kernel space */
bootinfo_storage = *bi;
bootinfo = &bootinfo_storage;
#ifdef BOOTINFO_FB_WIDTH
bootinfo->fb_line_bytes = BOOTINFO_FB_LINE_BYTES;
bootinfo->fb_width = BOOTINFO_FB_WIDTH;
bootinfo->fb_height = BOOTINFO_FB_HEIGHT;
bootinfo->fb_type = BOOTINFO_FB_TYPE;
#endif
if (bootinfo->magic == BOOTINFO_MAGIC) {
platid.dw.dw0 = bootinfo->platid_cpu;
platid.dw.dw1 = bootinfo->platid_machine;
}
#ifndef RTC_OFFSET
/*
* rtc_offset from bootinfo.timezone set by hpcboot.exe
*/
if (rtc_offset == 0 &&
(bootinfo->timezone > (-12 * 60) &&
bootinfo->timezone <= (12 * 60)))
rtc_offset = bootinfo->timezone;
#endif
/*
* Heads up ... Setup the CPU / MMU / TLB functions.
*/
set_cpufuncs();
IRQdisable;
pmap_devmap_bootstrap((vaddr_t)read_ttb(), pxa2x0_devmap);
pxa2x0_memctl_bootstrap(PXA2X0_MEMCTL_VBASE);
pxa2x0_intr_bootstrap(PXA2X0_INTCTL_VBASE);

View File

@ -1,4 +1,4 @@
/* $NetBSD: sa11x0_hpc_machdep.c,v 1.3 2011/07/19 15:37:39 dyoung Exp $ */
/* $NetBSD: sa11x0_hpc_machdep.c,v 1.4 2012/03/31 14:02:54 nonaka Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.3 2011/07/19 15:37:39 dyoung Exp $");
__KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.4 2012/03/31 14:02:54 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_dram_pages.h"
@ -56,7 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.3 2011/07/19 15:37:39 dyoun
#include <sys/msgbuf.h>
#include <sys/exec.h>
#include <sys/ksyms.h>
#include <sys/boot_flag.h>
#include <sys/conf.h> /* XXX for consinit related hacks */
#include <sys/device.h>
#include <sys/termios.h>
@ -94,12 +93,6 @@ __KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.3 2011/07/19 15:37:39 dyoun
#include <dev/hpc/apm/apmvar.h>
#include <dev/hpc/bicons.h>
#include <sys/mount.h>
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
#include <nfs/nfs.h>
#include <nfs/nfsmount.h>
/* Kernel text starts 256K in from the bottom of the kernel address space. */
#define KERNEL_TEXT_BASE (KERNEL_BASE + 0x00040000)
#define KERNEL_VM_BASE (KERNEL_BASE + 0x00C00000)
@ -118,9 +111,6 @@ u_int cpu_reset_address = 0;
#define UND_STACK_SIZE 1
extern BootConfig bootconfig; /* Boot config storage */
extern struct bootinfo *bootinfo, bootinfo_storage;
extern char booted_kernel_storage[80];
extern char *booted_kernel;
extern paddr_t physical_start;
extern paddr_t physical_freestart;
@ -134,9 +124,6 @@ extern pv_addr_t undstack;
extern pv_addr_t abtstack;
extern pv_addr_t kernelstack;
extern char *boot_args;
extern char boot_file[16];
extern vaddr_t msgbufphys;
extern u_int data_abort_handler_address;
@ -174,7 +161,7 @@ void prefetch_abort_handler(trapframe_t *);
void undefinedinstruction_bounce(trapframe_t *);
u_int cpu_get_control(void);
u_int initarm(int, char **, struct bootinfo *);
u_int init_sa11x0(int, char **, struct bootinfo *);
#ifdef BOOT_DUMP
void dumppages(char *, int);
@ -208,84 +195,24 @@ static const struct pmap_devmap sa11x0_devmap[] = {
};
/*
* Initial entry point on startup. This gets called before main() is
* entered.
* It should be responsible for setting up everything that must be
* in place when main is called.
* This includes:
* Taking a copy of the boot configuration structure.
* Initializing the physical console so characters can be printed.
* Setting up page tables for the kernel.
*/
u_int
initarm(int argc, char **argv, struct bootinfo *bi)
init_sa11x0(int argc, char **argv, struct bootinfo *bi)
{
u_int kerneldatasize, symbolsize;
u_int l1pagetable;
vaddr_t freemempos;
vsize_t pt_size;
int loop, i;
int loop;
#if NKSYMS || defined(DDB) || defined(MODULAR)
Elf_Shdr *sh;
#endif
__sleep_func = NULL;
__sleep_ctx = NULL;
/* parse kernel args */
boothowto = 0;
boot_file[0] = '\0';
strncpy(booted_kernel_storage, argv[0], sizeof(booted_kernel_storage));
for (i = 1; i < argc; i++) {
char *cp = argv[i];
switch (*cp) {
case 'b':
/* boot device: -b=sd0 etc. */
cp = cp + 2;
if (strcmp(cp, MOUNT_NFS) == 0)
rootfstype = MOUNT_NFS;
else
strncpy(boot_file, cp, sizeof(boot_file));
break;
default:
BOOT_FLAG(*cp, boothowto);
break;
}
}
/* copy bootinfo into known kernel space */
bootinfo_storage = *bi;
bootinfo = &bootinfo_storage;
#ifdef BOOTINFO_FB_WIDTH
bootinfo->fb_line_bytes = BOOTINFO_FB_LINE_BYTES;
bootinfo->fb_width = BOOTINFO_FB_WIDTH;
bootinfo->fb_height = BOOTINFO_FB_HEIGHT;
bootinfo->fb_type = BOOTINFO_FB_TYPE;
#endif
if (bootinfo->magic == BOOTINFO_MAGIC) {
platid.dw.dw0 = bootinfo->platid_cpu;
platid.dw.dw1 = bootinfo->platid_machine;
}
#ifndef RTC_OFFSET
/*
* rtc_offset from bootinfo.timezone set by hpcboot.exe
*/
if (rtc_offset == 0 &&
(bootinfo->timezone > (-12 * 60) &&
bootinfo->timezone <= (12 * 60)))
rtc_offset = bootinfo->timezone;
#endif
/*
* Heads up ... Setup the CPU / MMU / TLB functions.
*/
set_cpufuncs();
IRQdisable;
#ifdef DEBUG_BEFOREMMU
/*
* At this point, we cannot call real consinit().

View File

@ -0,0 +1,50 @@
/* $NetBSD: kloader.h,v 1.1 2012/03/31 14:02:54 nonaka Exp $ */
/*-
* Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _HPCARM_KLOADER_H_
#define _HPCARM_KLOADER_H_
#include <sys/lock.h>
#include <uvm/uvm.h>
#include <machine/pmap.h>
#define PG_VADDR(pg) kloader_phystov(VM_PAGE_TO_PHYS(pg))
vaddr_t kloader_phystov(paddr_t pa);
#include <dev/kloader.h>
#endif /* _HPCARM_KLOADER_H_ */