Continue fleshing out VKERNEL support. Initialize the per-cpu globaldata
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 26 Dec 2006 20:46:15 +0000 (20:46 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 26 Dec 2006 20:46:15 +0000 (20:46 +0000)
structure, provide access to the structure via %gs, and do some minor
cleanups.

sys/platform/vkernel/conf/files
sys/platform/vkernel/i386/global.s [new file with mode: 0644]
sys/platform/vkernel/include/globaldata.h
sys/platform/vkernel/platform/copyio.c [copied from sys/platform/vkernel/platform/machintr.c with 53% similarity]
sys/platform/vkernel/platform/globaldata.c [copied from sys/platform/vkernel/platform/machintr.c with 69% similarity]
sys/platform/vkernel/platform/init.c
sys/platform/vkernel/platform/machintr.c

index 16bc76d..08becd2 100644 (file)
@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $DragonFly: src/sys/platform/vkernel/conf/files,v 1.4 2006/12/05 23:14:53 dillon Exp $
+# $DragonFly: src/sys/platform/vkernel/conf/files,v 1.5 2006/12/26 20:46:09 dillon Exp $
 #
 bf_enc.o                       optional        ipsec ipsec_esp         \
        dependency      "$S/crypto/blowfish/arch/i386/bf_enc.S $S/crypto/blowfish/arch/i386/bf_enc_586.S $S/crypto/blowfish/arch/i386/bf_enc_686.S"             \
@@ -46,5 +46,8 @@ cpu/i386/misc/ktr.c                   optional        ktr
 #vkernel/vkernel/float.c               standard
 #
 # PLATFORM FILES
+machine/vkernel/i386/global.s          standard
 machine/vkernel/platform/init.c                standard
+machine/vkernel/platform/globaldata.c  standard
 machine/vkernel/platform/machintr.c    standard
+machine/vkernel/platform/copyio.c      standard
diff --git a/sys/platform/vkernel/i386/global.s b/sys/platform/vkernel/i386/global.s
new file mode 100644 (file)
index 0000000..057e282
--- /dev/null
@@ -0,0 +1,97 @@
+/*-
+ * Copyright (c) Peter Wemm <peter@netplex.com.au>
+ * 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 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 AUTHOR 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.
+ *
+ * $FreeBSD: src/sys/i386/i386/globals.s,v 1.13.2.1 2000/05/16 06:58:06 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/i386/global.s,v 1.1 2006/12/26 20:46:10 dillon Exp $
+ */
+
+#include <machine/asmacros.h>
+#include <machine/pmap.h>
+
+#include "assym.s"
+
+       /*
+        * Define the layout of the per-cpu address space.  This is
+        * "constructed" in locore.s on the BSP and in mp_machdep.c for
+        * each AP.  DO NOT REORDER THESE WITHOUT UPDATING THE REST!
+        *
+        * On UP the per-cpu address space is simply placed in the data
+        * segment.
+        */
+       .data
+
+       .globl  globaldata
+       .set    globaldata,0
+
+       /*
+        * Define layout of the global data.  On SMP this lives in
+        * the per-cpu address space, otherwise it's in the data segment.
+        */
+       .globl  gd_curthread, gd_npxthread, gd_reqflags, gd_common_tss
+       .set    gd_curthread,globaldata + GD_CURTHREAD
+       .set    gd_npxthread,globaldata + GD_NPXTHREAD
+       .set    gd_reqflags,globaldata + GD_REQFLAGS
+       .set    gd_common_tss,globaldata + GD_COMMON_TSS
+
+       .globl  gd_common_tssd, gd_tss_gdt
+       .set    gd_common_tssd,globaldata + GD_COMMON_TSSD
+       .set    gd_tss_gdt,globaldata + GD_TSS_GDT
+
+       .globl  gd_currentldt
+       .set    gd_currentldt,globaldata + GD_CURRENTLDT
+
+       .globl  gd_fpu_lock, gd_savefpu
+       .set    gd_fpu_lock, globaldata + GD_FPU_LOCK
+       .set    gd_savefpu, globaldata + GD_SAVEFPU
+
+       /*
+        * The BSP version of these get setup in locore.s and pmap.c, while
+        * the AP versions are setup in mp_machdep.c.
+        */
+       .globl  gd_cpuid, gd_other_cpus
+       .globl  gd_ss_eflags, gd_intr_nesting_level
+       .globl  gd_CMAP1, gd_CMAP2, gd_CMAP3, gd_PMAP1
+       .globl  gd_CADDR1, gd_CADDR2, gd_CADDR3, gd_PADDR1
+       .globl  gd_spending, gd_ipending, gd_fpending
+       .globl  gd_cnt, gd_private_tss
+
+       .set    gd_cpuid,globaldata + GD_CPUID
+       .set    gd_private_tss,globaldata + GD_PRIVATE_TSS
+       .set    gd_other_cpus,globaldata + GD_OTHER_CPUS
+       .set    gd_ss_eflags,globaldata + GD_SS_EFLAGS
+       .set    gd_intr_nesting_level,globaldata + GD_INTR_NESTING_LEVEL
+       .set    gd_CMAP1,globaldata + GD_PRV_CMAP1
+       .set    gd_CMAP2,globaldata + GD_PRV_CMAP2
+       .set    gd_CMAP3,globaldata + GD_PRV_CMAP3
+       .set    gd_PMAP1,globaldata + GD_PRV_PMAP1
+       .set    gd_CADDR1,globaldata + GD_PRV_CADDR1
+       .set    gd_CADDR2,globaldata + GD_PRV_CADDR2
+       .set    gd_CADDR3,globaldata + GD_PRV_CADDR3
+       .set    gd_PADDR1,globaldata + GD_PRV_PADDR1
+       .set    gd_fpending,globaldata + GD_FPENDING
+       .set    gd_ipending,globaldata + GD_IPENDING
+       .set    gd_spending,globaldata + GD_SPENDING
+       .set    gd_cnt,globaldata + GD_CNT
+
index c0fe764..15f6187 100644 (file)
@@ -28,7 +28,7 @@
  *     should not include this file.
  *
  * $FreeBSD: src/sys/i386/include/globaldata.h,v 1.11.2.1 2000/05/16 06:58:10 dillon Exp $
- * $DragonFly: src/sys/platform/vkernel/include/globaldata.h,v 1.1 2006/11/07 18:50:07 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/include/globaldata.h,v 1.2 2006/12/26 20:46:12 dillon Exp $
  */
 
 #ifndef _MACHINE_GLOBALDATA_H_
@@ -136,7 +136,7 @@ struct privatespace {
 
 #ifdef _KERNEL
 
-extern struct privatespace CPU_prvspace[];
+extern struct privatespace *CPU_prvspace;
 
 #endif
 
similarity index 53%
copy from sys/platform/vkernel/platform/machintr.c
copy to sys/platform/vkernel/platform/copyio.c
index ca6ff00..6ee4ba4 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/machintr.c,v 1.1 2006/12/05 23:14:54 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/copyio.c,v 1.1 2006/12/26 20:46:15 dillon Exp $
  */
 
 #include <sys/types.h>
-#include <sys/machintr.h>
-#include <stdio.h>
+#include <sys/systm.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <vm/vm_page.h>
+#include <assert.h>
 
-static void dummy_intrdis(int);
-static void dummy_intren(int);
-static int dummy_vectorctl(int, int, int);
-static int dummy_setvar(int, const void *);
-static int dummy_getvar(int, void *);
-static void dummy_finalize(void);
+/*
+ * Copies a NUL-terminated string from user space to kernel space.
+ * The number of bytes copied, including the terminator, is returned in
+ * (*res).
+ *
+ * Returns 0 on success, EFAULT or ENAMETOOLONG on failure.
+ */
+int
+copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *res)
+{
+       assert(0);
+}
 
-struct machintr_abi MachIntrABI = {
-       MACHINTR_GENERIC,
-       dummy_intrdis,
-       dummy_intren,
-       dummy_vectorctl,
-       dummy_setvar,
-       dummy_getvar,
-       dummy_finalize
-};
+/*
+ * Copy a binary buffer from user space to kernel space.
+ *
+ * Returns 0 on success, EFAULT on failure.
+ */
+int
+copyin (const void *udaddr, void *kaddr, size_t len)
+{
+       assert(0);
+}
 
-static void
-dummy_intrdis(int)
+/*
+ * Copy a binary buffer from kernel space to user space.
+ *
+ * Returns 0 on success, EFAULT on failure.
+ */
+int
+copyout (const void *kaddr, void *udaddr, size_t len)
+{
+       assert(0);
+}
+/*
+ * Fetch the byte at the specified user address.  Returns -1 on failure.
+ */
+int
+fubyte(const void *base)
 {
+       assert(0);
 }
 
-static void
-dummy_intren(int)
+/*
+ * Store a byte at the specified user address.  Returns -1 on failure.
+ */
+int
+subyte (void *base, int byte)
 {
+       assert(0);
 }
 
-static int
-dummy_vectorctl(int, int, int)
+/*
+ * Fetch a word (integer, 32 bits) from user space
+ */
+long
+fuword (const void *base)
 {
-       return (EOPNOTSUPP);
+       assert(0);
 }
 
-static int
-dummy_setvar(int, const void *)
+/*
+ * Store a word (integer, 32 bits) to user space
+ */
+int
+suword (void *base, long word)
 {
-       return (ENOENT);
+       assert(0);
 }
 
-static int
-dummy_getvar(int, void *)
+/*
+ * Fetch an short word (16 bits) from user space
+ */
+int
+fusword (void *base)
 {
-       return (ENOENT);
+       assert(0);
 }
 
-static void
-dummy_finalize(void)
+/*
+ * Store a short word (16 bits) to user space
+ */
+int
+susword (void *base, int word)
 {
+       assert(0);
 }
 
similarity index 69%
copy from sys/platform/vkernel/platform/machintr.c
copy to sys/platform/vkernel/platform/globaldata.c
index ca6ff00..6b38677 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/machintr.c,v 1.1 2006/12/05 23:14:54 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/globaldata.c,v 1.1 2006/12/26 20:46:15 dillon Exp $
  */
 
 #include <sys/types.h>
-#include <sys/machintr.h>
-#include <stdio.h>
-
-static void dummy_intrdis(int);
-static void dummy_intren(int);
-static int dummy_vectorctl(int, int, int);
-static int dummy_setvar(int, const void *);
-static int dummy_getvar(int, void *);
-static void dummy_finalize(void);
-
-struct machintr_abi MachIntrABI = {
-       MACHINTR_GENERIC,
-       dummy_intrdis,
-       dummy_intren,
-       dummy_vectorctl,
-       dummy_setvar,
-       dummy_getvar,
-       dummy_finalize
-};
-
-static void
-dummy_intrdis(int)
-{
-}
-
-static void
-dummy_intren(int)
-{
-}
+#include <sys/systm.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/tls.h>
+#include <vm/vm_page.h>
 
-static int
-dummy_vectorctl(int, int, int)
-{
-       return (EOPNOTSUPP);
-}
-
-static int
-dummy_setvar(int, const void *)
-{
-       return (ENOENT);
-}
+#include <machine/globaldata.h>
 
-static int
-dummy_getvar(int, void *)
-{
-       return (ENOENT);
-}
-
-static void
-dummy_finalize(void)
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <err.h>
+#include <errno.h>
+#include <assert.h>
+
+struct globaldata *
+globaldata_find(int cpu)
 {
+       KKASSERT(cpu >= 0 && cpu < ncpus);
+       return (&CPU_prvspace[cpu].mdglobaldata.mi);
 }
 
index ba0f909..95a58f6 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.3 2006/12/23 00:27:03 swildner Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.4 2006/12/26 20:46:15 dillon Exp $
  */
 
 #include <sys/types.h>
 #include <sys/systm.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
+#include <sys/tls.h>
 #include <vm/vm_page.h>
 
+#include <machine/globaldata.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -47,6 +50,7 @@
 #include <string.h>
 #include <err.h>
 #include <errno.h>
+#include <assert.h>
 
 vm_paddr_t Maxmem;
 int MemImageFd = -1;
@@ -54,8 +58,11 @@ int RootImageFd = -1;
 vm_offset_t KvaBase;
 vm_offset_t KvaSize;
 
+struct privatespace *CPU_prvspace;
+
 static void init_sys_memory(char *imageFile);
 static void init_kern_memory(void);
+static void init_globaldata(void);
 static void init_rootdevice(char *imageFile);
 static void usage(const char *ctl);
 
@@ -70,6 +77,8 @@ main(int ac, char **av)
        char *suffix;
        int c;
 
+       ncpus = 1;
+
        /*
         * Process options
         */
@@ -113,6 +122,7 @@ main(int ac, char **av)
 
        init_sys_memory(memImageFile);
        init_kern_memory();
+       init_globaldata();
        init_rootdevice(rootImageFile);
        mi_startup();
        /* NOT REACHED */
@@ -223,6 +233,26 @@ init_kern_memory(void)
         */
 }
 
+/*
+ * Map the per-cpu globaldata
+ */
+static
+void
+init_globaldata(void)
+{
+       struct tls_info info;
+       int r;
+
+       CPU_prvspace = mmap(NULL, ncpus * sizeof(struct privatespace),
+                           PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+       assert(CPU_prvspace != MAP_FAILED);
+       bzero(&info, sizeof(info));
+       info.base = CPU_prvspace;
+       info.size = sizeof(struct privatespace);
+       r = sys_set_tls_area(0, &info, sizeof(info));
+       assert(r == 0);
+}
+
 /*
  * The root filesystem path for the virtual kernel is optional.  If specified
  * it points to a filesystem image.
@@ -240,3 +270,9 @@ usage(const char *ctl)
        
 }
 
+void
+cpu_reset(void)
+{
+       kprintf("cpu reset\n");
+       exit(0);
+}
index ca6ff00..84fe6af 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/machintr.c,v 1.1 2006/12/05 23:14:54 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/machintr.c,v 1.2 2006/12/26 20:46:15 dillon Exp $
  */
 
 #include <sys/types.h>
 #include <sys/machintr.h>
+#include <sys/errno.h>
 #include <stdio.h>
 
 static void dummy_intrdis(int);
@@ -56,29 +57,29 @@ struct machintr_abi MachIntrABI = {
 };
 
 static void
-dummy_intrdis(int)
+dummy_intrdis(int intr)
 {
 }
 
 static void
-dummy_intren(int)
+dummy_intren(int intr)
 {
 }
 
 static int
-dummy_vectorctl(int, int, int)
+dummy_vectorctl(int op, int intr, int flags)
 {
        return (EOPNOTSUPP);
 }
 
 static int
-dummy_setvar(int, const void *)
+dummy_setvar(int varid, const void *buf)
 {
        return (ENOENT);
 }
 
 static int
-dummy_getvar(int, void *)
+dummy_getvar(int varid, void *buf)
 {
        return (ENOENT);
 }