Author: br
Date: Fri Jan 29 15:12:31 2016
New Revision: 295041
URL: https://svnweb.freebsd.org/changeset/base/295041

Log:
  Welcome the RISC-V 64-bit kernel.
  
  This is the final step required allowing to compile and to run RISC-V
  kernel and userland from HEAD.
  
  RISC-V is a completely open ISA that is freely available to academia
  and industry.
  
  Thanks to all the people involved! Special thanks to Andrew Turner,
  David Chisnall, Ed Maste, Konstantin Belousov, John Baldwin and
  Arun Thomas for their help.
  Thanks to Robert Watson for organizing this project.
  
  This project sponsored by UK Higher Education Innovation Fund (HEIF5) and
  DARPA CTSRD project at the University of Cambridge Computer Laboratory.
  
  FreeBSD/RISC-V project home: https://wiki.freebsd.org/riscv
  
  Reviewed by:  andrew, emaste, kib
  Relnotes:     Yes
  Sponsored by: DARPA, AFRL
  Sponsored by: HEIF5
  Differential Revision:        https://reviews.freebsd.org/D4982

Added:
  head/sys/boot/fdt/dts/riscv/
  head/sys/boot/fdt/dts/riscv/spike.dts   (contents, props changed)
  head/sys/boot/ficl/riscv/
  head/sys/boot/ficl/riscv/sysdep.c   (contents, props changed)
  head/sys/boot/ficl/riscv/sysdep.h   (contents, props changed)
  head/sys/conf/Makefile.riscv   (contents, props changed)
  head/sys/conf/files.riscv   (contents, props changed)
  head/sys/conf/ldscript.riscv   (contents, props changed)
  head/sys/conf/options.riscv   (contents, props changed)
  head/sys/dev/hwpmc/hwpmc_riscv.h   (contents, props changed)
  head/sys/riscv/conf/
  head/sys/riscv/conf/DEFAULTS   (contents, props changed)
  head/sys/riscv/conf/GENERIC   (contents, props changed)
  head/sys/riscv/htif/
  head/sys/riscv/htif/htif.c   (contents, props changed)
  head/sys/riscv/htif/htif.h   (contents, props changed)
  head/sys/riscv/htif/htif_block.c   (contents, props changed)
  head/sys/riscv/htif/htif_console.c   (contents, props changed)
  head/sys/riscv/riscv/
  head/sys/riscv/riscv/autoconf.c   (contents, props changed)
  head/sys/riscv/riscv/bcopy.c   (contents, props changed)
  head/sys/riscv/riscv/bus_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/busdma_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/clock.c   (contents, props changed)
  head/sys/riscv/riscv/copyinout.S   (contents, props changed)
  head/sys/riscv/riscv/copystr.c   (contents, props changed)
  head/sys/riscv/riscv/cpufunc_asm.S   (contents, props changed)
  head/sys/riscv/riscv/devmap.c   (contents, props changed)
  head/sys/riscv/riscv/dump_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/elf_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/exception.S   (contents, props changed)
  head/sys/riscv/riscv/genassym.c   (contents, props changed)
  head/sys/riscv/riscv/identcpu.c   (contents, props changed)
  head/sys/riscv/riscv/in_cksum.c   (contents, props changed)
  head/sys/riscv/riscv/intr_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/locore.S   (contents, props changed)
  head/sys/riscv/riscv/machdep.c   (contents, props changed)
  head/sys/riscv/riscv/mem.c   (contents, props changed)
  head/sys/riscv/riscv/minidump_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/nexus.c   (contents, props changed)
  head/sys/riscv/riscv/pmap.c   (contents, props changed)
  head/sys/riscv/riscv/support.S   (contents, props changed)
  head/sys/riscv/riscv/swtch.S   (contents, props changed)
  head/sys/riscv/riscv/sys_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/timer.c   (contents, props changed)
  head/sys/riscv/riscv/trap.c   (contents, props changed)
  head/sys/riscv/riscv/uio_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/uma_machdep.c   (contents, props changed)
  head/sys/riscv/riscv/vm_machdep.c   (contents, props changed)
Modified:
  head/sys/cddl/compat/opensolaris/sys/atomic.h
  head/sys/cddl/contrib/opensolaris/uts/common/sys/isa_defs.h
  head/sys/conf/kern.mk
  head/sys/conf/kern.pre.mk
  head/sys/sys/cdefs.h
  head/sys/sys/kerneldump.h

Added: head/sys/boot/fdt/dts/riscv/spike.dts
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/boot/fdt/dts/riscv/spike.dts       Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,92 @@
+/*-
+ * Copyright (c) 2015 Ruslan Bukin <b...@bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * 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$
+ */
+
+/dts-v1/;
+
+/ {
+       model = "UC Berkeley Spike Simulator RV64I";
+       compatible = "riscv,rv64i";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       #interrupt-cells = <1>;
+
+       aliases {
+               console0 = &console0;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x0 0x8000000>; /* 128MB at 0x0 */
+       };
+
+       soc {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+
+               compatible = "simple-bus";
+               ranges;
+
+               pic0: pic@0 {
+                       compatible = "riscv,pic";
+                       interrupt-controller;
+               };
+
+               timer0: timer@0 {
+                       compatible = "riscv,timer";
+                       interrupts = < 1 >;
+                       interrupt-parent = < &pic0 >;
+                       clock-frequency = < 1000000 >;
+               };
+
+               htif0: htif@0 {
+                       compatible = "riscv,htif";
+                       interrupts = < 0 >;
+                       interrupt-parent = < &pic0 >;
+
+                       console0: console@0 {
+                               compatible = "htif,console";
+                               status = "okay";
+                       };
+               };
+       };
+
+       chosen {
+               bootargs = "-v";
+               stdin = "console0";
+               stdout = "console0";
+       };
+};

Added: head/sys/boot/ficl/riscv/sysdep.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/boot/ficl/riscv/sysdep.c   Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,99 @@
+/*******************************************************************
+** s y s d e p . c
+** Forth Inspired Command Language
+** Author: John Sadler (john_sad...@alum.mit.edu)
+** Created: 16 Oct 1997
+** Implementations of FICL external interface functions... 
+**
+*******************************************************************/
+
+/* $FreeBSD$ */
+
+#ifdef TESTMAIN
+#include <stdio.h>
+#include <stdlib.h>
+#else
+#include <stand.h>
+#endif
+#include "ficl.h"
+
+/*
+*******************  FreeBSD  P O R T   B E G I N S   H E R E 
******************** Michael Smith
+*/
+
+#if PORTABLE_LONGMULDIV == 0
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
+{
+    DPUNS q;
+    u_int64_t qx;
+
+    qx = (u_int64_t)x * (u_int64_t) y;
+
+    q.hi = (u_int32_t)( qx >> 32 );
+    q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
+
+    return q;
+}
+
+UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
+{
+    UNSQR result;
+    u_int64_t qx, qh;
+
+    qh = q.hi;
+    qx = (qh << 32) | q.lo;
+
+    result.quot = qx / y;
+    result.rem  = qx % y;
+
+    return result;
+}
+#endif
+
+void  ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
+{
+    IGNORE(pVM);
+
+    while(*msg != 0)
+       putchar(*(msg++));
+    if (fNewline)
+       putchar('\n');
+
+   return;
+}
+
+void *ficlMalloc (size_t size)
+{
+    return malloc(size);
+}
+
+void *ficlRealloc (void *p, size_t size)
+{
+    return realloc(p, size);
+}
+
+void  ficlFree   (void *p)
+{
+    free(p);
+}
+
+
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** is guaranteed to be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** befor timeout (optional - could also block forever)
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock)
+{
+       IGNORE(fLock);
+       return 0;
+}
+#endif /* FICL_MULTITHREAD */

Added: head/sys/boot/ficl/riscv/sysdep.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/boot/ficl/riscv/sysdep.h   Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,411 @@
+/*******************************************************************
+                    s y s d e p . h
+** Forth Inspired Command Language
+** Author: John Sadler (john_sad...@alum.mit.edu)
+** Created: 16 Oct 1997
+** Ficl system dependent types and prototypes...
+**
+** Note: Ficl also depends on the use of "assert" when
+** FICL_ROBUST is enabled. This may require some consideration
+** in firmware systems since assert often
+** assumes stderr/stdout.  
+** $Id: sysdep.h,v 1.6 2001-04-26 21:41:55-07 jsadler Exp jsadler $
+*******************************************************************/
+/*
+** Copyright (c) 1997-2001 John Sadler (john_sad...@alum.mit.edu)
+** All rights reserved.
+**
+** Get the latest Ficl release at http://ficl.sourceforge.net
+**
+** L I C E N S E  and  D I S C L A I M E R
+** 
+** 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.
+**
+** I am interested in hearing from anyone who uses ficl. If you have
+** a problem, a success story, a defect, an enhancement request, or
+** if you would like to contribute to the ficl release, please send
+** contact me by email at the address above.
+**
+** $Id: sysdep.h,v 1.6 2001-04-26 21:41:55-07 jsadler Exp jsadler $
+** $FreeBSD$
+*/
+
+#if !defined (__SYSDEP_H__)
+#define __SYSDEP_H__ 
+
+#include <sys/types.h>
+
+#include <stddef.h> /* size_t, NULL */
+#include <setjmp.h>
+#include <assert.h>
+
+#if !defined IGNORE            /* Macro to silence unused param warnings */
+#define IGNORE(x) (void)(x)
+#endif
+
+/*
+** TRUE and FALSE for C boolean operations, and
+** portable 32 bit types for CELLs
+** 
+*/
+#if !defined TRUE
+#define TRUE 1
+#endif
+#if !defined FALSE
+#define FALSE 0
+#endif
+
+
+/*
+** System dependent data type declarations...
+*/
+#if !defined INT32
+#define INT32 int
+#endif
+
+#if !defined UNS32
+#define UNS32 unsigned int
+#endif
+
+#if !defined UNS16
+#define UNS16 unsigned short
+#endif
+
+#if !defined UNS8
+#define UNS8 unsigned char
+#endif
+
+#if !defined NULL
+#define NULL ((void *)0)
+#endif
+
+/*
+** FICL_UNS and FICL_INT must have the same size as a void* on
+** the target system. A CELL is a union of void*, FICL_UNS, and
+** FICL_INT. 
+** (11/2000: same for FICL_FLOAT)
+*/
+#if !defined FICL_INT
+#define FICL_INT long
+#endif
+
+#if !defined FICL_UNS
+#define FICL_UNS unsigned long
+#endif
+
+#if !defined FICL_FLOAT
+#define FICL_FLOAT float
+#endif
+
+/*
+** Ficl presently supports values of 32 and 64 for BITS_PER_CELL
+*/
+#if !defined BITS_PER_CELL
+#define BITS_PER_CELL 64
+#endif
+
+#if ((BITS_PER_CELL != 32) && (BITS_PER_CELL != 64))
+    Error!
+#endif
+
+typedef struct
+{
+    FICL_UNS hi;
+    FICL_UNS lo;
+} DPUNS;
+
+typedef struct
+{
+    FICL_UNS quot;
+    FICL_UNS rem;
+} UNSQR;
+
+typedef struct
+{
+    FICL_INT hi;
+    FICL_INT lo;
+} DPINT;
+
+typedef struct
+{
+    FICL_INT quot;
+    FICL_INT rem;
+} INTQR;
+
+
+/*
+** B U I L D   C O N T R O L S
+*/
+
+#if !defined (FICL_MINIMAL)
+#define FICL_MINIMAL 0
+#endif
+#if (FICL_MINIMAL)
+#define FICL_WANT_SOFTWORDS  0
+#define FICL_WANT_FLOAT      0
+#define FICL_WANT_USER       0
+#define FICL_WANT_LOCALS     0
+#define FICL_WANT_DEBUGGER   0
+#define FICL_WANT_OOP        0
+#define FICL_PLATFORM_EXTEND 0
+#define FICL_MULTITHREAD     0
+#define FICL_ROBUST          0
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** FICL_PLATFORM_EXTEND
+** Includes words defined in ficlCompilePlatform
+*/
+#if !defined (FICL_PLATFORM_EXTEND)
+#define FICL_PLATFORM_EXTEND 1
+#endif
+
+/*
+** FICL_WANT_FLOAT
+** Includes a floating point stack for the VM, and words to do float 
operations.
+** Contributed by Guy Carver
+*/
+#if !defined (FICL_WANT_FLOAT)
+#define FICL_WANT_FLOAT 0
+#endif
+
+/*
+** FICL_WANT_DEBUGGER
+** Inludes a simple source level debugger
+*/
+#if !defined (FICL_WANT_DEBUGGER)
+#define FICL_WANT_DEBUGGER 1
+#endif
+
+/*
+** User variables: per-instance variables bound to the VM.
+** Kinda like thread-local storage. Could be implemented in a 
+** VM private dictionary, but I've chosen the lower overhead
+** approach of an array of CELLs instead.
+*/
+#if !defined FICL_WANT_USER
+#define FICL_WANT_USER 1
+#endif
+
+#if !defined FICL_USER_CELLS
+#define FICL_USER_CELLS 16
+#endif
+
+/* 
+** FICL_WANT_LOCALS controls the creation of the LOCALS wordset and
+** a private dictionary for local variable compilation.
+*/
+#if !defined FICL_WANT_LOCALS
+#define FICL_WANT_LOCALS 1
+#endif
+
+/* Max number of local variables per definition */
+#if !defined FICL_MAX_LOCALS
+#define FICL_MAX_LOCALS 16
+#endif
+
+/*
+** FICL_WANT_OOP
+** Inludes object oriented programming support (in softwords)
+** OOP support requires locals and user variables!
+*/
+#if !(FICL_WANT_LOCALS) || !(FICL_WANT_USER)
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 0
+#endif
+#endif
+
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 1
+#endif
+
+/*
+** FICL_WANT_SOFTWORDS
+** Controls inclusion of all softwords in softcore.c
+*/
+#if !defined (FICL_WANT_SOFTWORDS)
+#define FICL_WANT_SOFTWORDS 1
+#endif
+
+/*
+** FICL_MULTITHREAD enables dictionary mutual exclusion
+** wia the ficlLockDictionary system dependent function.
+** Note: this implementation is experimental and poorly
+** tested. Further, it's unnecessary unless you really
+** intend to have multiple SESSIONS (poor choice of name
+** on my part) - that is, threads that modify the dictionary
+** at the same time.
+*/
+#if !defined FICL_MULTITHREAD
+#define FICL_MULTITHREAD 0
+#endif
+
+/*
+** PORTABLE_LONGMULDIV causes ficlLongMul and ficlLongDiv to be
+** defined in C in sysdep.c. Use this if you cannot easily 
+** generate an inline asm definition
+*/ 
+#if !defined (PORTABLE_LONGMULDIV)
+#define PORTABLE_LONGMULDIV 0
+#endif
+
+/*
+** INLINE_INNER_LOOP causes the inner interpreter to be inline code
+** instead of a function call. This is mainly because MS VC++ 5
+** chokes with an internal compiler error on the function version.
+** in release mode. Sheesh.
+*/
+#if !defined INLINE_INNER_LOOP
+#if defined _DEBUG
+#define INLINE_INNER_LOOP 0
+#else
+#define INLINE_INNER_LOOP 1
+#endif
+#endif
+
+/*
+** FICL_ROBUST enables bounds checking of stacks and the dictionary.
+** This will detect stack over and underflows and dictionary overflows.
+** Any exceptional condition will result in an assertion failure.
+** (As generated by the ANSI assert macro)
+** FICL_ROBUST == 1 --> stack checking in the outer interpreter
+** FICL_ROBUST == 2 also enables checking in many primitives
+*/
+
+#if !defined FICL_ROBUST
+#define FICL_ROBUST 2
+#endif
+
+/*
+** FICL_DEFAULT_STACK Specifies the default size (in CELLs) of
+** a new virtual machine's stacks, unless overridden at 
+** create time.
+*/
+#if !defined FICL_DEFAULT_STACK
+#define FICL_DEFAULT_STACK 128
+#endif
+
+/*
+** FICL_DEFAULT_DICT specifies the number of CELLs to allocate
+** for the system dictionary by default. The value
+** can be overridden at startup time as well.
+** FICL_DEFAULT_ENV specifies the number of cells to allot
+** for the environment-query dictionary.
+*/
+#if !defined FICL_DEFAULT_DICT
+#define FICL_DEFAULT_DICT 12288
+#endif
+
+#if !defined FICL_DEFAULT_ENV
+#define FICL_DEFAULT_ENV 260
+#endif
+
+/*
+** FICL_DEFAULT_VOCS specifies the maximum number of wordlists in 
+** the dictionary search order. See Forth DPANS sec 16.3.3
+** (file://dpans16.htm#16.3.3)
+*/
+#if !defined FICL_DEFAULT_VOCS
+#define FICL_DEFAULT_VOCS 16
+#endif
+
+/*
+** FICL_MAX_PARSE_STEPS controls the size of an array in the FICL_SYSTEM 
structure
+** that stores pointers to parser extension functions. I would never expect to 
have
+** more than 8 of these, so that's the default limit. Too many of these 
functions
+** will probably exact a nasty performance penalty.
+*/
+#if !defined FICL_MAX_PARSE_STEPS
+#define FICL_MAX_PARSE_STEPS 8
+#endif
+
+/*
+** FICL_EXTENDED_PREFIX enables a bunch of extra prefixes in prefix.c and 
prefix.fr (if
+** included as part of softcore.c)
+*/
+#if !defined FICL_EXTENDED_PREFIX
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** FICL_ALIGN is the power of two to which the dictionary
+** pointer address must be aligned. This value is usually
+** either 1 or 2, depending on the memory architecture
+** of the target system; 2 is safe on any 16 or 32 bit
+** machine. 3 would be appropriate for a 64 bit machine.
+*/
+#if !defined FICL_ALIGN
+#define FICL_ALIGN 3
+#define FICL_ALIGN_ADD ((1 << FICL_ALIGN) - 1)
+#endif
+
+/*
+** System dependent routines --
+** edit the implementations in sysdep.c to be compatible
+** with your runtime environment...
+** ficlTextOut sends a NULL terminated string to the 
+**   default output device - used for system error messages
+** ficlMalloc and ficlFree have the same semantics as malloc and free
+**   in standard C
+** ficlLongMul multiplies two UNS32s and returns a 64 bit unsigned 
+**   product
+** ficlLongDiv divides an UNS64 by an UNS32 and returns UNS32 quotient
+**   and remainder
+*/
+struct vm;
+void  ficlTextOut(struct vm *pVM, char *msg, int fNewline);
+void *ficlMalloc (size_t size);
+void  ficlFree   (void *p);
+void *ficlRealloc(void *p, size_t size);
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** must be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** before timeout (optional - could also block forever)
+**
+** NOTE: this function must be implemented with lock counting
+** semantics: nested calls must behave properly.
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock);
+#else
+#define ficlLockDictionary(x) 0 /* ignore */
+#endif
+
+/*
+** 64 bit integer math support routines: multiply two UNS32s
+** to get a 64 bit product, & divide the product by an UNS32
+** to get an UNS32 quotient and remainder. Much easier in asm
+** on a 32 bit CPU than in C, which usually doesn't support 
+** the double length result (but it should).
+*/
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y);
+UNSQR ficlLongDiv(DPUNS    q, FICL_UNS y);
+
+#endif /*__SYSDEP_H__*/

Modified: head/sys/cddl/compat/opensolaris/sys/atomic.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/atomic.h       Fri Jan 29 14:52:54 
2016        (r295040)
+++ head/sys/cddl/compat/opensolaris/sys/atomic.h       Fri Jan 29 15:12:31 
2016        (r295041)
@@ -51,7 +51,7 @@ extern uint8_t atomic_or_8_nv(volatile u
 extern void membar_producer(void);
 
 #if defined(__sparc64__) || defined(__powerpc__) || defined(__arm__) || \
-    defined(__mips__) || defined(__aarch64__)
+    defined(__mips__) || defined(__aarch64__) || defined(__riscv__)
 extern void atomic_or_8(volatile uint8_t *target, uint8_t value);
 #else
 static __inline void

Modified: head/sys/cddl/contrib/opensolaris/uts/common/sys/isa_defs.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/sys/isa_defs.h Fri Jan 29 
14:52:54 2016        (r295040)
+++ head/sys/cddl/contrib/opensolaris/uts/common/sys/isa_defs.h Fri Jan 29 
15:12:31 2016        (r295041)
@@ -388,6 +388,48 @@ extern "C" {
 #define        _DONT_USE_1275_GENERIC_NAMES
 #define        _HAVE_CPUID_INSN
 
+#elif defined(__riscv__)
+
+/*
+ * Define the appropriate "processor characteristics"
+ */
+#define        _STACK_GROWS_DOWNWARD
+#define        _LONG_LONG_LTOH
+#define        _BIT_FIELDS_LTOH
+#define        _IEEE_754
+#define        _CHAR_IS_UNSIGNED
+#define        _BOOL_ALIGNMENT                 1
+#define        _CHAR_ALIGNMENT                 1
+#define        _SHORT_ALIGNMENT                2
+#define        _INT_ALIGNMENT                  4
+#define        _FLOAT_ALIGNMENT                4
+#define        _FLOAT_COMPLEX_ALIGNMENT        4
+#define        _LONG_ALIGNMENT                 8
+#define        _LONG_LONG_ALIGNMENT            8
+#define        _DOUBLE_ALIGNMENT               8
+#define        _DOUBLE_COMPLEX_ALIGNMENT       8
+#define        _LONG_DOUBLE_ALIGNMENT          16
+#define        _LONG_DOUBLE_COMPLEX_ALIGNMENT  16
+#define        _POINTER_ALIGNMENT              8
+#define        _MAX_ALIGNMENT                  16
+#define        _ALIGNMENT_REQUIRED             1
+
+#define        _LONG_LONG_ALIGNMENT_32         _LONG_LONG_ALIGNMENT
+
+/*
+ * Define the appropriate "implementation choices"
+ */
+#if !defined(_LP64)
+#define        _LP64
+#endif
+#define        _SUNOS_VTOC_16
+#define        _DMA_USES_PHYSADDR
+#define        _FIRMWARE_NEEDS_FDISK
+#define        _PSM_MODULES
+#define        _RTC_CONFIG
+#define        _DONT_USE_1275_GENERIC_NAMES
+#define        _HAVE_CPUID_INSN
+
 #elif defined(__arm__)
 
 /*

Added: head/sys/conf/Makefile.riscv
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/conf/Makefile.riscv        Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,49 @@
+# Makefile.riscv -- with config changes.
+# Copyright 1990 W. Jolitz
+#      from: @(#)Makefile.i386 7.1 5/10/91
+#      from FreeBSD: src/sys/conf/Makefile.i386,v 1.255 2002/02/20 23:35:49
+# $FreeBSD$
+#
+# Makefile for FreeBSD
+#
+# RISCVTODO: copy pasted from aarch64, needs to be
+# constructed from a machine description:
+#      config machineid
+# Most changes should be made in the machine description
+#      /sys/riscv/conf/``machineid''
+# after which you should do
+#       config machineid
+# Generic makefile changes should be made in
+#      /sys/conf/Makefile.riscv
+# after which config should be rerun for all machines.
+#
+
+# Which version of config(8) is required.
+%VERSREQ=      600012
+
+.if !defined(S)
+S=     ../../..
+.endif
+.include "$S/conf/kern.pre.mk"
+
+INCLUDES+= -I$S/contrib/libfdt
+
+.if !empty(DDB_ENABLED)
+CFLAGS += -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
+.endif
+
+%BEFORE_DEPEND
+
+%OBJS
+
+%FILES.c
+
+%FILES.s
+
+%FILES.m
+
+%CLEAN
+
+%RULES
+
+.include "$S/conf/kern.post.mk"

Added: head/sys/conf/files.riscv
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/conf/files.riscv   Fri Jan 29 15:12:31 2016        (r295041)
@@ -0,0 +1,44 @@
+# $FreeBSD$
+crypto/blowfish/bf_enc.c       optional        crypto | ipsec
+crypto/des/des_enc.c           optional        crypto | ipsec | netsmb
+kern/kern_clocksource.c                standard
+kern/subr_dummy_vdso_tc.c      standard
+libkern/bcmp.c                 standard
+libkern/ffs.c                  standard
+libkern/ffsl.c                 standard
+libkern/fls.c                  standard
+libkern/flsl.c                 standard
+libkern/flsll.c                        standard
+libkern/memmove.c              standard
+libkern/memset.c               standard
+riscv/htif/htif.c              standard
+riscv/htif/htif_block.c                standard
+riscv/htif/htif_console.c      standard
+riscv/riscv/autoconf.c         standard
+riscv/riscv/bcopy.c            standard
+riscv/riscv/bus_machdep.c      standard
+riscv/riscv/busdma_machdep.c   standard
+riscv/riscv/clock.c            standard
+riscv/riscv/copyinout.S                standard
+riscv/riscv/copystr.c          standard
+riscv/riscv/cpufunc_asm.S      standard
+riscv/riscv/devmap.c           standard
+riscv/riscv/dump_machdep.c     standard
+riscv/riscv/elf_machdep.c      standard
+riscv/riscv/intr_machdep.c     standard
+riscv/riscv/in_cksum.c         optional        inet | inet6
+riscv/riscv/identcpu.c         standard
+riscv/riscv/locore.S           standard        no-obj
+riscv/riscv/minidump_machdep.c standard
+riscv/riscv/machdep.c          standard
+riscv/riscv/mem.c              standard
+riscv/riscv/nexus.c            standard
+riscv/riscv/pmap.c             standard
+riscv/riscv/sys_machdep.c      standard
+riscv/riscv/support.S          standard
+riscv/riscv/swtch.S            standard
+riscv/riscv/trap.c             standard
+riscv/riscv/timer.c            standard
+riscv/riscv/uio_machdep.c      standard
+riscv/riscv/uma_machdep.c      standard
+riscv/riscv/vm_machdep.c       standard

Modified: head/sys/conf/kern.mk
==============================================================================
--- head/sys/conf/kern.mk       Fri Jan 29 14:52:54 2016        (r295040)
+++ head/sys/conf/kern.mk       Fri Jan 29 15:12:31 2016        (r295041)
@@ -104,6 +104,10 @@ CFLAGS += -mgeneral-regs-only
 CFLAGS += -ffixed-x18
 .endif
 
+.if ${MACHINE_CPUARCH} == "riscv"
+INLINE_LIMIT?= 8000
+.endif
+
 #
 # For sparc64 we want the medany code model so modules may be located
 # anywhere in the 64-bit address space.  We also tell GCC to use floating

Modified: head/sys/conf/kern.pre.mk
==============================================================================
--- head/sys/conf/kern.pre.mk   Fri Jan 29 14:52:54 2016        (r295040)
+++ head/sys/conf/kern.pre.mk   Fri Jan 29 15:12:31 2016        (r295041)
@@ -252,6 +252,7 @@ EMBEDFS_FORMAT.mips?=               elf32-tradbigmips
 EMBEDFS_FORMAT.mipsel?=                elf32-tradlittlemips
 EMBEDFS_FORMAT.mips64?=                elf64-tradbigmips
 EMBEDFS_FORMAT.mips64el?=      elf64-tradlittlemips
+EMBEDFS_FORMAT.riscv?=         elf64-littleriscv
 .endif
 
 # Detect kernel config options that force stack frames to be turned on.

Added: head/sys/conf/ldscript.riscv
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/conf/ldscript.riscv        Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,136 @@
+/* $FreeBSD$ */
+OUTPUT_ARCH(riscv)
+ENTRY(_start)
+
+SEARCH_DIR(/usr/lib);
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = kernbase + 0x100;
+  .text      : AT(ADDR(.text) - kernbase)
+  {
+    *(.text)
+    *(.stub)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.gnu.linkonce.t*)
+  } =0x9090
+  _etext = .;
+  PROVIDE (etext = .);
+  .fini      : { *(.fini)    } =0x9090
+  .rodata    : { *(.rodata) *(.gnu.linkonce.r*) }
+  .rodata1   : { *(.rodata1) }
+   .interp     : { *(.interp)  }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .gnu.version   : { *(.gnu.version)   }
+  .gnu.version_d   : { *(.gnu.version_d)       }
+  .gnu.version_r   : { *(.gnu.version_r)       }
+  .rel.text      :
+    { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+  .rela.text     :
+    { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+  .rel.data      :
+    { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+  .rela.data     :
+    { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+  .rel.rodata    :
+    { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+  .rela.rodata   :
+    { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.init      : { *(.rel.init)      }
+  .rela.init     : { *(.rela.init)     }
+  .rel.fini      : { *(.rel.fini)      }
+  .rela.fini     : { *(.rela.fini)     }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  } =0x9090
+  .plt      : { *(.plt)        }
+
+  /* Adjust the address for the data segment.  We want to adjust up to
+     the same address within the page on the next page up.  */
+  . = ALIGN(0x1000) + (. & (0x1000 - 1)) ;
+  .data    :
+  {
+    *(.data)
+    *(.gnu.linkonce.d*)
+    CONSTRUCTORS
+  }
+  .data1   : { *(.data1) }
+  . = ALIGN(32 / 8);
+  _start_ctors = .;
+  PROVIDE (start_ctors = .);
+  .ctors         :
+  {
+    *(.ctors)
+  }
+  _stop_ctors = .;
+  PROVIDE (stop_ctors = .);
+  .dtors         :
+  {
+    *(.dtors)
+  }
+  .got           : { *(.got.plt) *(.got) }
+  .dynamic       : { *(.dynamic) }
+  /* We want the small data sections together, so single-instruction offsets
+     can access them all, and initialized data all before uninitialized, so
+     we can shorten the on-disk segment size.  */
+  . = ALIGN(8);
+  .sdata     : { *(.sdata) }
+  _edata  =  .;
+  PROVIDE (edata = .);
+  __bss_start = .;
+  .sbss      : { *(.sbss) *(.scommon) }
+  .bss       :
+  {
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  . = ALIGN(8);
+  _end = . ;
+  PROVIDE (end = .);
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* These must appear regardless of  .  */
+}

Added: head/sys/conf/options.riscv
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/conf/options.riscv Fri Jan 29 15:12:31 2016        (r295041)
@@ -0,0 +1,4 @@
+# $FreeBSD$
+
+RISCV                          opt_global.h
+VFP                            opt_global.h

Added: head/sys/dev/hwpmc/hwpmc_riscv.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/hwpmc/hwpmc_riscv.h    Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2015 Ruslan Bukin <b...@bsdpad.com>
+ * All rights reserved.
+ *
+ * This software was developed by the University of Cambridge Computer
+ * Laboratory with support from ARM Ltd.
+ *
+ * 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$
+ */
+
+#ifndef _DEV_HWPMC_RISCV_H_
+#define        _DEV_HWPMC_RISCV_H_
+
+#define        RISCV_PMC_CAPS          (PMC_CAP_INTERRUPT | PMC_CAP_USER |     
\
+                                PMC_CAP_SYSTEM | PMC_CAP_EDGE |        \
+                                PMC_CAP_THRESHOLD | PMC_CAP_READ |     \
+                                PMC_CAP_WRITE | PMC_CAP_INVERT |       \
+                                PMC_CAP_QUALIFIER)
+
+#define        RISCV_RELOAD_COUNT_TO_PERFCTR_VALUE(R)  (-(R))
+#define        RISCV_PERFCTR_VALUE_TO_RELOAD_COUNT(P)  (-(P))
+#define        EVENT_ID_MASK   0xFF
+
+#ifdef _KERNEL
+/* MD extension for 'struct pmc' */
+struct pmc_md_riscv_pmc {
+       uint32_t        pm_riscv_evsel;
+};
+#endif /* _KERNEL */
+#endif /* _DEV_HWPMC_RISCV_H_ */

Added: head/sys/riscv/conf/DEFAULTS
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/riscv/conf/DEFAULTS        Fri Jan 29 15:12:31 2016        
(r295041)
@@ -0,0 +1,13 @@
+#
+# DEFAULTS -- Default kernel configuration file for FreeBSD/RISC-V

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to