Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Apr 2003 01:03:52 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 28418 for review
Message-ID:  <200304070803.h3783qLo052185@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=28418

Change 28418 by peter@peter_overcee on 2003/04/07 01:03:02

	checkpoint.  set %cs descriptor properly.  L=1,D=1 is reserved
	and causes a fault if I try and use it. (doh!)
	upset jake and set proc0uarea and proc0kstack
	dump gdt contents for debugging
	deal with "elf64 kernel" vs "elf kernel"

Affected files ...

.. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#43 edit

Differences ...

==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#43 (text+ko) ====

@@ -590,7 +590,7 @@
 	0,			/* segment descriptor priority level */
 	1,			/* segment descriptor present */
 	1,			/* long */
-	1,			/* default 32 vs 16 bit size */
+	0,			/* default 32 vs 16 bit size */
 	1  			/* limit granularity (byte/page units)*/ },
 /* GDATA_SEL	2 Data Descriptor for kernel */
 {	0x0,			/* segment base address  */
@@ -1064,6 +1064,11 @@
 	p0kpa = allocpages(KSTACK_PAGES);
 	printf("p0kpa = 0x%lx\n", p0kpa);
 
+	proc0uarea = (struct user *)(p0upa + KERNBASE);
+	printf("proc0uarea = 0x%lx\n", proc0uarea);
+	proc0kstack = p0kpa + KERNBASE;
+	printf("proc0kstack = 0x%lx\n", proc0kstack);
+
 	/* Fill in the underlying page table pages */
 	/* Read-only from zero to physfree */
 	/* XXX not actually used, underneath 2M pages */
@@ -1111,18 +1116,11 @@
 
 	first = physfree;
 printf("It is hammer_time!\n");
-printf("first = 0x%lx\n", first);
 
 	create_pagetables();
 
-printf("got to the end; activating page tables...\n");
-
 	load_cr3(IdlePML4);
 
-printf("it worked!\n");
-printf("yippee!\n");
-for(;;);
-
 	proc0.p_uarea = proc0uarea;
 	thread0.td_kstack = proc0kstack;
 	thread0.td_pcb = (struct pcb *)
@@ -1137,24 +1135,19 @@
 
 	preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
 	preload_bootstrap_relocate(KERNBASE);
-	kmdp = preload_search_by_type("elf kernel");
+	kmdp = preload_search_by_type("elf64 kernel");
+	if (kmdp == NULL)
+		kmdp = preload_search_by_type("elf kernel");
 	boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
-	kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
+	kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
 
 	/* Init basic tunables, hz etc */
 	init_param1();
 
+printf("gdt time, ugh\n");
 	/*
-	 * make gdt memory segments, the code segment goes up to end of the
-	 * page with etext in it, the data segment goes to the end of
-	 * the address space
-	 */
-	/*
-	 * XXX text protection is temporarily (?) disabled.  The limit was
-	 * i386_btop(round_page(etext)) - 1.
+	 * make gdt memory segments
 	 */
-	gdt_segs[GCODE_SEL].ssd_limit = -1;
-	gdt_segs[GDATA_SEL].ssd_limit = -1;
 	gdt_segs[GPROC0_SEL].ssd_base = (uintptr_t)&common_tss.tss;
 
 	for (x = 0; x < NGDT; x++) {
@@ -1163,13 +1156,25 @@
 	}
 	ssdtosyssd(&gdt_segs[GPROC0_SEL], (struct system_segment_descriptor *)&gdt[GPROC0_SEL]);
 
+for (x = 0; x < NGDT; x++)
+printf("gdt slot %d: 0x%016lx\n", x, *(long *)&gdt[x]);
+
 	r_gdt.rd_limit = NGDT * sizeof(gdt[0]) - 1;
 	r_gdt.rd_base =  (long) gdt;
+printf("doing lgdt....\n");
 	lgdt(&r_gdt);
+printf("lgdt done\n");
+	pc = &__pcpu;	
+
+printf("setting MSR_FSBASE and GSBASE to %p\n", pc);
+	wrmsr(MSR_FSBASE, (u_int64_t)pc);
+	wrmsr(MSR_GSBASE, (u_int64_t)pc);
 
-	pc = &__pcpu;	
+printf("pcpu init\n");
 	pcpu_init(pc, 0, sizeof(struct pcpu));
+printf("PCPU_SET(prvspace, pc)\n");
 	PCPU_SET(prvspace, pc);
+printf("PCPU_SET(curthread, &thread0)\n");
 	PCPU_SET(curthread, &thread0);
 
 	/*
@@ -1180,9 +1185,11 @@
 	 *	     must be able to get the icu lock, so it can't be
 	 *	     under witness.
 	 */
+printf("mutex init\n");
 	mutex_init();
 	mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_RECURSE);
 	mtx_init(&icu_lock, "icu", NULL, MTX_SPIN | MTX_NOWITNESS);
+for(;;);
 
 	/* exceptions */
 	for (x = 0; x < NIDT; x++)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304070803.h3783qLo052185>