RISC-V: initialize pcpu slightly earlier

In certain scenarios, it is possible for PCPU data to be
accessed before it has been initialized (e.g. during printf
if the kernel was built with the TSLOG option).

Initialize the PCPU pointer for hart 0 at the beginning of
initriscv() rather than near the end.

Reviewed by:		markj
Approved by:		markj (mentor)
Differential Revision:	https://reviews.freebsd.org/D19726
This commit is contained in:
Mitchell Horne 2019-04-07 20:12:24 +00:00
parent 11b4d1935a
commit e196d237be
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=346021
2 changed files with 11 additions and 12 deletions

View File

@ -53,7 +53,6 @@
struct pcb;
struct pcpu;
extern struct pcpu *pcpup;
static inline struct pcpu *
get_pcpu(void)

View File

@ -120,8 +120,6 @@ int64_t idcache_line_size; /* The minimum cache line size */
extern int *end;
extern int *initstack_end;
struct pcpu *pcpup;
uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs);
uintptr_t
@ -627,6 +625,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
static void
init_proc0(vm_offset_t kstack)
{
struct pcpu *pcpup;
pcpup = &__pcpu[0];
@ -798,6 +797,7 @@ void
initriscv(struct riscv_bootparams *rvbp)
{
struct mem_region mem_regions[FDT_MEM_REGIONS];
struct pcpu *pcpup;
vm_offset_t rstart, rend;
vm_offset_t s, e;
int mem_regions_sz;
@ -806,6 +806,15 @@ initriscv(struct riscv_bootparams *rvbp)
caddr_t kmdp;
int i;
/* Set the pcpu data, this is needed by pmap_bootstrap */
pcpup = &__pcpu[0];
pcpu_init(pcpup, 0, sizeof(struct pcpu));
/* Set the pcpu pointer */
__asm __volatile("mv gp, %0" :: "r"(pcpup));
PCPU_SET(curthread, &thread0);
/* Set the module data location */
lastaddr = fake_preload_metadata(rvbp);
@ -849,15 +858,6 @@ initriscv(struct riscv_bootparams *rvbp)
}
#endif
/* Set the pcpu data, this is needed by pmap_bootstrap */
pcpup = &__pcpu[0];
pcpu_init(pcpup, 0, sizeof(struct pcpu));
/* Set the pcpu pointer */
__asm __volatile("mv gp, %0" :: "r"(pcpup));
PCPU_SET(curthread, &thread0);
/* Do basic tuning, hz etc */
init_param1();