summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2021-04-30 08:54:16 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2021-04-30 08:54:16 +0000
commit1ab803e010b1ddb6aad9c6cef33b73761d2912ca (patch)
tree68472e356205c7df070d8ca3b8ecfdcd8afe73c8 /sys/arch
parent4e420a0e5ee29d169f39bfeac39dec2fc94025f6 (diff)
reduce diff to current arm64
ok mlarkin@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/riscv64/include/cpu.h6
-rw-r--r--sys/arch/riscv64/riscv64/autoconf.c46
-rw-r--r--sys/arch/riscv64/riscv64/machdep.c116
3 files changed, 76 insertions, 92 deletions
diff --git a/sys/arch/riscv64/include/cpu.h b/sys/arch/riscv64/include/cpu.h
index 330a0a92555..cdcfe692f0f 100644
--- a/sys/arch/riscv64/include/cpu.h
+++ b/sys/arch/riscv64/include/cpu.h
@@ -23,10 +23,12 @@
*/
/* CTL_MACHDEP definitions. */
-/* None for now */
-#define CPU_MAXID 0 /* number of valid machdep ids */
+#define CPU_COMPATIBLE 1 /* compatible property */
+#define CPU_MAXID 2 /* number of valid machdep ids */
#define CTL_MACHDEP_NAMES { \
+ { 0, 0 }, \
+ { "compatible", CTLTYPE_STRING }, \
}
#ifdef _KERNEL
diff --git a/sys/arch/riscv64/riscv64/autoconf.c b/sys/arch/riscv64/riscv64/autoconf.c
index 2689565da8d..aedb9374705 100644
--- a/sys/arch/riscv64/riscv64/autoconf.c
+++ b/sys/arch/riscv64/riscv64/autoconf.c
@@ -15,26 +15,23 @@
*/
#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
#include <sys/device.h>
+#include <sys/disklabel.h>
#include <sys/reboot.h>
-#include <sys/socket.h>
#include <sys/hibernate.h>
+#include <sys/systm.h>
#include <uvm/uvm.h>
+#if defined(NFSCLIENT)
#include <net/if.h>
#include <net/if_types.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
+#endif
#include <machine/bootconfig.h>
extern void dumpconf(void);
-void parsepmonbp(void);
-
-struct device *bootdv = NULL;
-enum devclass bootdev_class = DV_DULL;
void
unmap_startup(void)
@@ -51,10 +48,10 @@ unmap_startup(void)
void
cpu_configure(void)
{
- (void)splhigh();
+ splhigh();
softintr_init();
- (void)config_rootfound("mainbus", NULL);
+ config_rootfound("mainbus", NULL);
unmap_startup();
@@ -65,26 +62,12 @@ cpu_configure(void)
void
diskconf(void)
{
- size_t len;
- char *p;
- dev_t tmpdev;
+#if defined(NFSCLIENT)
extern uint8_t *bootmac;
-
- if (*boot_file != '\0')
- printf("bootfile: %s\n", boot_file);
-
-#if RAMDISK_HOOKS
- bootdv = parsedisk("rd", 2, 0, &tmpdev);
-#endif /* RAMDISK_HOOKS */
- if (bootdv == NULL) {
-
- // boot_file is of the format <device>:/bsd we want the device part
- if ((p = strchr(boot_file, ':')) != NULL)
- len = p - boot_file;
- else
- len = strlen(boot_file);
- bootdv = parsedisk(boot_file, len, 0, &tmpdev);
- }
+ dev_t tmpdev = NODEV;
+#endif
+ struct device *bootdv = NULL;
+ int part = 0;
#if defined(NFSCLIENT)
if (bootmac) {
@@ -102,12 +85,7 @@ diskconf(void)
}
#endif
- if (bootdv != NULL)
- printf("boot device: %s\n", bootdv->dv_xname);
- else
- printf("boot device: lookup %s failed \n", boot_file);
-
- setroot(bootdv, 0, RB_USERREQ);
+ setroot(bootdv, part, RB_USERREQ);
dumpconf();
#ifdef HIBERNATE
diff --git a/sys/arch/riscv64/riscv64/machdep.c b/sys/arch/riscv64/riscv64/machdep.c
index 398a52b2fc3..834631f275e 100644
--- a/sys/arch/riscv64/riscv64/machdep.c
+++ b/sys/arch/riscv64/riscv64/machdep.c
@@ -15,9 +15,8 @@
*/
#include <sys/param.h>
-#include <sys/timetc.h>
-#include <sys/sched.h>
#include <sys/systm.h>
+#include <sys/sched.h>
#include <sys/proc.h>
#include <sys/sysctl.h>
#include <sys/reboot.h>
@@ -31,13 +30,13 @@
#include <sys/buf.h>
#include <sys/termios.h>
#include <sys/sensors.h>
+#include <sys/malloc.h>
#include <sys/syscallargs.h>
#include <sys/stdarg.h>
#include <net/if.h>
#include <uvm/uvm.h>
#include <dev/cons.h>
-#include <dev/clock_subr.h>
#include <dev/ofw/fdt.h>
#include <dev/ofw/openfirm.h>
#include <machine/param.h>
@@ -56,13 +55,13 @@
#include <dev/softraidvar.h>
#endif
+extern vaddr_t virtual_avail;
+extern uint64_t esym;
+
char *boot_args = NULL;
-char *boot_file = "";
uint8_t *bootmac = NULL;
-extern uint64_t esym;
-
int stdout_node;
int stdout_speed;
@@ -88,7 +87,6 @@ struct uvm_constraint_range *uvm_md_constraints[] = { NULL };
/* the following is used externally (sysctl_hw) */
char machine[] = MACHINE; /* from <machine/param.h> */
-extern todr_chip_handle_t todr_handle;
int safepri = 0;
@@ -189,12 +187,12 @@ struct consdev constab[] = {
};
void
-cpu_idle_enter()
+cpu_idle_enter(void)
{
}
void
-cpu_idle_cycle()
+cpu_idle_cycle(void)
{
// Enable interrupts
enable_interrupts();
@@ -203,15 +201,15 @@ cpu_idle_cycle()
}
void
-cpu_idle_leave()
+cpu_idle_leave(void)
{
}
+/* Dummy trapframe for proc0. */
+struct trapframe proc0tf;
-// XXX what? - not really used
-struct trapframe proc0tf;
void
-cpu_startup()
+cpu_startup(void)
{
u_int loop;
paddr_t minaddr;
@@ -243,7 +241,7 @@ cpu_startup()
printf("%s", version);
printf("real mem = %lu (%luMB)\n", ptoa(physmem),
- ptoa(physmem)/1024/1024);
+ ptoa(physmem) / 1024 / 1024);
/*
* Allocate a submap for exec arguments. This map effectively
@@ -251,8 +249,7 @@ cpu_startup()
*/
minaddr = vm_map_min(kernel_map);
exec_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
- 16*NCARGS, VM_MAP_PAGEABLE, FALSE, NULL);
-
+ 16 * NCARGS, VM_MAP_PAGEABLE, FALSE, NULL);
/*
* Allocate a submap for physio
@@ -266,7 +263,7 @@ cpu_startup()
bufinit();
printf("avail mem = %lu (%luMB)\n", ptoa(uvmexp.free),
- ptoa(uvmexp.free)/1024/1024);
+ ptoa(uvmexp.free) / 1024 / 1024);
curpcb = &proc0.p_addr->u_pcb;
curpcb->pcb_flags = 0;
@@ -281,16 +278,33 @@ cpu_startup()
}
}
+/*
+ * machine dependent system variables.
+ */
+
int
cpu_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
size_t newlen, struct proc *p)
{
+ char *compatible;
+ int node, len, error;
+
/* all sysctl names at this level are terminal */
if (namelen != 1)
return (ENOTDIR); /* overloaded */
switch (name[0]) {
- // none supported currently
+ case CPU_COMPATIBLE:
+ node = OF_finddevice("/");
+ len = OF_getproplen(node, "compatible");
+ if (len <= 0)
+ return (EOPNOTSUPP);
+ compatible = malloc(len, M_TEMP, M_WAITOK | M_ZERO);
+ OF_getprop(node, "compatible", compatible, len);
+ compatible[len - 1] = 0;
+ error = sysctl_rdstring(oldp, oldlenp, newp, compatible);
+ free(compatible, M_TEMP, len);
+ return error;
default:
return (EOPNOTSUPP);
}
@@ -397,13 +411,12 @@ need_resched(struct cpu_info *ci)
}
-/// XXX ?
/*
* Size of memory segments, before any memory is stolen.
*/
phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
int mem_cluster_cnt;
-/// XXX ?
+
/*
* cpu_dumpsize: calculate size of machine-dependent kernel core dump headers.
*/
@@ -434,7 +447,7 @@ cache_setup(void)
}
u_long
-cpu_dump_mempagecnt()
+cpu_dump_mempagecnt(void)
{
return 0;
}
@@ -505,7 +518,7 @@ uint32_t mmap_size;
uint32_t mmap_desc_size;
uint32_t mmap_desc_ver;
-void collect_kernel_args(char *);
+void collect_kernel_args(const char *);
void process_kernel_args(void);
void
@@ -541,13 +554,15 @@ initriscv(struct riscv_bootparams *rbp)
if (node != NULL) {
char *prop;
int len;
- // static uint8_t lladdr[6]; //not yet used
+ static uint8_t lladdr[6];
len = fdt_node_property(node, "bootargs", &prop);
if (len > 0)
collect_kernel_args(prop);
-#if 0 //CMPE: yet not using these properties
+ len = fdt_node_property(node, "openbsd,boothowto", &prop);
+ if (len == sizeof(boothowto))
+ boothowto = bemtoh32((uint32_t *)prop);
len = fdt_node_property(node, "openbsd,bootduid", &prop);
if (len == sizeof(bootduid))
@@ -575,6 +590,7 @@ initriscv(struct riscv_bootparams *rbp)
if (len > 0)
explicit_bzero(prop, len);
+#if 0 //CMPE: yet not using these properties
len = fdt_node_property(node, "openbsd,uefi-mmap-start", &prop);
if (len == sizeof(mmap_start))
mmap_start = bemtoh64((uint64_t *)prop);
@@ -587,6 +603,7 @@ initriscv(struct riscv_bootparams *rbp)
len = fdt_node_property(node, "openbsd,uefi-mmap-desc-ver", &prop);
if (len == sizeof(mmap_desc_ver))
mmap_desc_ver = bemtoh32((uint32_t *)prop);
+
len = fdt_node_property(node, "openbsd,uefi-system-table", &prop);
if (len == sizeof(system_table))
system_table = bemtoh64((uint64_t *)prop);
@@ -653,7 +670,6 @@ initriscv(struct riscv_bootparams *rbp)
vstart = pmap_bootstrap(kvo, rbp->kern_l1pt,
kernbase, esym, fdt_start, fdt_end, memstart, memend);
- // XX correctly sized?
proc0paddr = (struct user *)rbp->kern_stack;
msgbufaddr = (caddr_t)vstart;
@@ -708,7 +724,6 @@ initriscv(struct riscv_bootparams *rbp)
map_func_save = riscv64_bs_tag._space_map;
riscv64_bs_tag._space_map = pmap_bootstrap_bs_map;
- // cninit
consinit();
#ifdef DEBUG_AUTOCONF
@@ -717,7 +732,6 @@ initriscv(struct riscv_bootparams *rbp)
riscv64_bs_tag._space_map = map_func_save;
- /* XXX */
pmap_avail_fixup();
uvmexp.pagesize = PAGE_SIZE;
@@ -733,7 +747,8 @@ initriscv(struct riscv_bootparams *rbp)
int i;
/*
- * Load all memory marked as EfiConventionalMemory.
+ * Load all memory marked as EfiConventionalMemory,
+ * EfiBootServicesCode or EfiBootServicesData.
* Don't bother with blocks smaller than 64KB. The
* initial 64MB memory block should be marked as
* EfiLoaderData so it won't be added again here.
@@ -743,7 +758,9 @@ initriscv(struct riscv_bootparams *rbp)
desc->Type, desc->PhysicalStart,
desc->VirtualStart, desc->NumberOfPages,
desc->Attribute);
- if (desc->Type == EfiConventionalMemory &&
+ if ((desc->Type == EfiConventionalMemory ||
+ desc->Type == EfiBootServicesCode ||
+ desc->Type == EfiBootServicesData) &&
desc->NumberOfPages >= 16) {
uvm_page_physload(atop(desc->PhysicalStart),
atop(desc->PhysicalStart) +
@@ -804,6 +821,7 @@ initriscv(struct riscv_bootparams *rbp)
*/
pmap_growkernel(VM_MIN_KERNEL_ADDRESS + 1024 * 1024 * 1024 +
physmem * sizeof(struct vm_page));
+
#ifdef DDB
db_machine_init();
@@ -813,6 +831,7 @@ initriscv(struct riscv_bootparams *rbp)
if (boothowto & RB_KDB)
db_enter();
#endif
+
softintr_init();
splraise(IPL_IPI);
}
@@ -820,7 +839,7 @@ initriscv(struct riscv_bootparams *rbp)
char bootargs[256];
void
-collect_kernel_args(char *args)
+collect_kernel_args(const char *args)
{
/* Make a local copy of the bootargs */
strlcpy(bootargs, args, sizeof(bootargs));
@@ -831,27 +850,21 @@ process_kernel_args(void)
{
char *cp = bootargs;
- if (cp[0] == '\0') {
- boothowto = RB_AUTOBOOT;
+ if (*cp == 0)
return;
- }
-
- boothowto = 0;
- boot_file = bootargs;
/* Skip the kernel image filename */
while (*cp != ' ' && *cp != 0)
- ++cp;
+ cp++;
if (*cp != 0)
*cp++ = 0;
while (*cp == ' ')
- ++cp;
+ cp++;
boot_args = cp;
- printf("bootfile: %s\n", boot_file);
printf("bootargs: %s\n", boot_args);
/* Setup pointer to boot flags */
@@ -859,34 +872,30 @@ process_kernel_args(void)
if (*cp++ == '\0')
return;
- for (;*++cp;) {
- int fl;
-
- fl = 0;
+ while (*cp != 0) {
switch(*cp) {
case 'a':
- fl |= RB_ASKNAME;
+ boothowto |= RB_ASKNAME;
break;
case 'c':
- fl |= RB_CONFIG;
+ boothowto |= RB_CONFIG;
break;
case 'd':
- fl |= RB_KDB;
+ boothowto |= RB_KDB;
break;
case 's':
- fl |= RB_SINGLE;
+ boothowto |= RB_SINGLE;
break;
default:
printf("unknown option `%c'\n", *cp);
break;
}
- boothowto |= fl;
+ cp++;
}
}
/*
- * allow bootstrap to steal KVA after machdep has given it back to pmap.
- * XXX - need a mechanism to prevent this from being used too early or late.
+ * Allow bootstrap to steal KVA after machdep has given it back to pmap.
*/
int
pmap_bootstrap_bs_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size,
@@ -895,12 +904,7 @@ pmap_bootstrap_bs_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size,
u_long startpa, pa, endpa;
vaddr_t va;
- extern vaddr_t virtual_avail, virtual_end;
-
- va = virtual_avail; // steal memory from virtual avail.
-
- if (va == 0)
- panic("pmap_bootstrap_bs_map, no virtual avail");
+ va = virtual_avail; /* steal memory from virtual avail. */
startpa = trunc_page(bpa);
endpa = round_page((bpa + size));