diff --git a/sys/boot/fdt/dts/riscv/qemu.dts b/sys/boot/fdt/dts/riscv/qemu.dts
index 067e18fcea8..8da1ae5b663 100644
--- a/sys/boot/fdt/dts/riscv/qemu.dts
+++ b/sys/boot/fdt/dts/riscv/qemu.dts
@@ -72,15 +72,11 @@
clock-frequency = < 400000000 >;
};
- htif0: htif@0 {
- compatible = "riscv,htif";
- interrupts = < 0 >;
+ console0: console@0 {
+ compatible = "riscv,console";
+ status = "okay";
+ interrupts = < 1 >;
interrupt-parent = < &pic0 >;
-
- console0: console@0 {
- compatible = "htif,console";
- status = "okay";
- };
};
};
diff --git a/sys/boot/fdt/dts/riscv/rocket.dts b/sys/boot/fdt/dts/riscv/rocket.dts
index b8c139fd67f..8ce718d8295 100644
--- a/sys/boot/fdt/dts/riscv/rocket.dts
+++ b/sys/boot/fdt/dts/riscv/rocket.dts
@@ -83,15 +83,11 @@
clock-frequency = < 1000000 >;
};
- htif0: htif@0 {
- compatible = "riscv,htif";
- interrupts = < 0 >;
+ console0: console@0 {
+ compatible = "riscv,console";
+ status = "okay";
+ interrupts = < 1 >;
interrupt-parent = < &pic0 >;
-
- console0: console@0 {
- compatible = "htif,console";
- status = "okay";
- };
};
};
diff --git a/sys/boot/fdt/dts/riscv/spike.dts b/sys/boot/fdt/dts/riscv/spike.dts
index 27d68f034c3..dfe27f34935 100644
--- a/sys/boot/fdt/dts/riscv/spike.dts
+++ b/sys/boot/fdt/dts/riscv/spike.dts
@@ -65,6 +65,10 @@
};
memory {
+ /*
+ * This is not used currently.
+ * We take information from sbi_query_memory.
+ */
device_type = "memory";
reg = <0x80000000 0x40000000>; /* 1GB at 0x80000000 */
};
@@ -90,15 +94,11 @@
clock-frequency = < 1000000 >;
};
- htif0: htif@0 {
- compatible = "riscv,htif";
+ console0: console@0 {
+ compatible = "riscv,console";
+ status = "okay";
interrupts = < 1 >;
interrupt-parent = < &pic0 >;
-
- console0: console@0 {
- compatible = "htif,console";
- status = "okay";
- };
};
};
diff --git a/sys/conf/files.riscv b/sys/conf/files.riscv
index fe30078f183..e6908bed8ae 100644
--- a/sys/conf/files.riscv
+++ b/sys/conf/files.riscv
@@ -19,9 +19,6 @@ libkern/flsl.c standard
libkern/flsll.c standard
libkern/memmove.c standard
libkern/memset.c standard
-riscv/htif/htif.c optional htif
-riscv/htif/htif_block.c optional htif
-riscv/htif/htif_console.c optional htif
riscv/riscv/autoconf.c standard
riscv/riscv/bcopy.c standard
riscv/riscv/bus_machdep.c standard
@@ -36,6 +33,7 @@ riscv/riscv/db_interface.c optional ddb
riscv/riscv/db_trace.c optional ddb
riscv/riscv/dump_machdep.c standard
riscv/riscv/elf_machdep.c standard
+riscv/riscv/exception.S standard
riscv/riscv/intr_machdep.c standard
riscv/riscv/in_cksum.c optional inet | inet6
riscv/riscv/identcpu.c standard
@@ -47,6 +45,8 @@ riscv/riscv/mem.c standard
riscv/riscv/nexus.c standard
riscv/riscv/ofw_machdep.c optional fdt
riscv/riscv/pmap.c standard
+riscv/riscv/riscv_console.c optional rcons
+riscv/riscv/sbi.S standard
riscv/riscv/stack_machdep.c optional ddb | stack
riscv/riscv/support.S standard
riscv/riscv/swtch.S standard
diff --git a/sys/conf/ldscript.riscv b/sys/conf/ldscript.riscv
index 152b97eca30..5fe32aea178 100644
--- a/sys/conf/ldscript.riscv
+++ b/sys/conf/ldscript.riscv
@@ -6,7 +6,7 @@ SEARCH_DIR(/usr/lib);
SECTIONS
{
/* Read-only sections, merged into text segment: */
- . = kernbase + 0x80000000 /* KERNENTRY */;
+ . = kernbase;
.text : AT(ADDR(.text) - kernbase)
{
*(.text)
diff --git a/sys/riscv/conf/GENERIC b/sys/riscv/conf/GENERIC
index dd73c3a352a..6c53da2a051 100644
--- a/sys/riscv/conf/GENERIC
+++ b/sys/riscv/conf/GENERIC
@@ -76,7 +76,7 @@ options SMP
# Uncomment for memory disk
# options MD_ROOT
-# options MD_ROOT_SIZE=8192 # 8MB ram disk
+# options MD_ROOT_SIZE=32768 # 32MB ram disk
# makeoptions MFS_IMAGE=/path/to/img
# options ROOTDEVNAME=\"ufs:/dev/md0\"
diff --git a/sys/riscv/conf/QEMU b/sys/riscv/conf/QEMU
index 26c65430844..7411aefc6b1 100644
--- a/sys/riscv/conf/QEMU
+++ b/sys/riscv/conf/QEMU
@@ -21,8 +21,8 @@
include GENERIC
ident QEMU
-device htif
-options ROOTDEVNAME=\"ufs:/dev/htif_blk0\"
+device rcons
+options ROOTDEVNAME=\"ufs:/dev/md0\"
# RISCVTODO: This needs to be done via loader (when it's available).
options FDT_DTB_STATIC
diff --git a/sys/riscv/conf/ROCKET b/sys/riscv/conf/ROCKET
index 9a9e3efe46e..1b2b1c08b8d 100644
--- a/sys/riscv/conf/ROCKET
+++ b/sys/riscv/conf/ROCKET
@@ -21,8 +21,8 @@
include GENERIC
ident ROCKET
-device htif
-options ROOTDEVNAME=\"ufs:/dev/htif_blk0\"
+device rcons
+options ROOTDEVNAME=\"ufs:/dev/md0\"
# RISCVTODO: This needs to be done via loader (when it's available).
options FDT_DTB_STATIC
diff --git a/sys/riscv/conf/SPIKE b/sys/riscv/conf/SPIKE
index 6c4a7434bb4..cc36e6f97b0 100644
--- a/sys/riscv/conf/SPIKE
+++ b/sys/riscv/conf/SPIKE
@@ -21,8 +21,8 @@
include GENERIC
ident SPIKE
-device htif
-options ROOTDEVNAME=\"ufs:/dev/htif_blk0\"
+device rcons
+options ROOTDEVNAME=\"ufs:/dev/md0\"
# RISCVTODO: This needs to be done via loader (when it's available).
options FDT_DTB_STATIC
diff --git a/sys/riscv/htif/htif.c b/sys/riscv/htif/htif.c
deleted file mode 100644
index 9a42db2c427..00000000000
--- a/sys/riscv/htif/htif.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/*-
- * Copyright (c) 2015-2016 Ruslan Bukin
- * 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.
- */
-
-#include
-__FBSDID("$FreeBSD$");
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "htif.h"
-
-static struct resource_spec htif_spec[] = {
- { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
- { -1, 0 }
-};
-
-struct intr_entry {
- void (*func) (void *, uint64_t);
- void *arg;
-};
-
-struct intr_entry intrs[HTIF_NDEV];
-
-uint64_t
-htif_command(uint64_t arg)
-{
-
- return (machine_command(ECALL_HTIF_CMD, arg));
-}
-
-int
-htif_setup_intr(int id, void *func, void *arg)
-{
-
- if (id >= HTIF_NDEV)
- return (-1);
-
- intrs[id].func = func;
- intrs[id].arg = arg;
-
- return (0);
-}
-
-static void
-htif_handle_entry(struct htif_softc *sc)
-{
- uint64_t entry;
- uint8_t devcmd;
- uint8_t devid;
-
- entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
- while (entry) {
- devid = HTIF_DEV_ID(entry);
- devcmd = HTIF_DEV_CMD(entry);
-
- if (devcmd == HTIF_CMD_IDENTIFY) {
- /* Enumeration interrupt */
- if (devid == sc->identify_id)
- sc->identify_done = 1;
- } else {
- /* Device interrupt */
- if (intrs[devid].func != NULL)
- intrs[devid].func(intrs[devid].arg, entry);
- }
-
- entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
- }
-}
-
-static int
-htif_intr(void *arg)
-{
- struct htif_softc *sc;
-
- sc = arg;
-
- csr_clear(sip, SIP_SSIP);
-
- htif_handle_entry(sc);
-
- return (FILTER_HANDLED);
-}
-
-static int
-htif_add_device(struct htif_softc *sc, int i, char *id, char *name)
-{
- struct htif_dev_ivars *di;
-
- di = malloc(sizeof(struct htif_dev_ivars), M_DEVBUF, M_WAITOK | M_ZERO);
- di->sc = sc;
- di->index = i;
- di->id = malloc(HTIF_ID_LEN, M_DEVBUF, M_WAITOK | M_ZERO);
- memcpy(di->id, id, HTIF_ID_LEN);
-
- di->dev = device_add_child(sc->dev, name, -1);
- device_set_ivars(di->dev, di);
-
- return (0);
-}
-
-static int
-htif_enumerate(struct htif_softc *sc)
-{
- char id[HTIF_ID_LEN] __aligned(HTIF_ALIGN);
- uint64_t paddr;
- uint64_t data;
- uint64_t cmd;
- int len;
- int i;
-
- device_printf(sc->dev, "Enumerating devices\n");
-
- for (i = 0; i < HTIF_NDEV; i++) {
- paddr = pmap_kextract((vm_offset_t)&id);
- data = (paddr << IDENTIFY_PADDR_SHIFT);
- data |= IDENTIFY_IDENT;
-
- sc->identify_id = i;
- sc->identify_done = 0;
-
- cmd = i;
- cmd <<= HTIF_DEV_ID_SHIFT;
- cmd |= (HTIF_CMD_IDENTIFY << HTIF_CMD_SHIFT);
- cmd |= data;
-
- htif_command(cmd);
-
- len = strnlen(id, sizeof(id));
- if (len <= 0)
- break;
-
- if (bootverbose)
- printf(" %d %s\n", i, id);
-
- if (strncmp(id, "disk", 4) == 0)
- htif_add_device(sc, i, id, "htif_blk");
- else if (strncmp(id, "bcd", 3) == 0)
- htif_add_device(sc, i, id, "htif_console");
- else if (strncmp(id, "syscall_proxy", 13) == 0)
- htif_add_device(sc, i, id, "htif_syscall_proxy");
- }
-
- return (bus_generic_attach(sc->dev));
-}
-
-int
-htif_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
-{
- struct htif_dev_ivars *ivars;
-
- ivars = device_get_ivars(child);
-
- switch (which) {
- case HTIF_IVAR_INDEX:
- *result = ivars->index;
- break;
- case HTIF_IVAR_ID:
- *result = (uintptr_t)ivars->id;
- default:
- return (EINVAL);
- }
-
- return (0);
-}
-
-static int
-htif_probe(device_t dev)
-{
-
- if (!ofw_bus_status_okay(dev))
- return (ENXIO);
-
- if (!ofw_bus_is_compatible(dev, "riscv,htif"))
- return (ENXIO);
-
- device_set_desc(dev, "HTIF bus device");
- return (BUS_PROBE_DEFAULT);
-}
-
-static int
-htif_attach(device_t dev)
-{
- struct htif_softc *sc;
- int error;
-
- sc = device_get_softc(dev);
- sc->dev = dev;
-
- if (bus_alloc_resources(dev, htif_spec, sc->res)) {
- device_printf(dev, "could not allocate resources\n");
- return (ENXIO);
- }
-
- /* Setup IRQs handler */
- error = bus_setup_intr(dev, sc->res[0], INTR_TYPE_CLK,
- htif_intr, NULL, sc, &sc->ihl[0]);
- if (error) {
- device_printf(dev, "Unable to alloc int resource.\n");
- return (ENXIO);
- }
-
- csr_set(sie, SIE_SSIE);
-
- return (htif_enumerate(sc));
-}
-
-static device_method_t htif_methods[] = {
- DEVMETHOD(device_probe, htif_probe),
- DEVMETHOD(device_attach, htif_attach),
-
- /* Bus interface */
- DEVMETHOD(bus_read_ivar, htif_read_ivar),
-
- DEVMETHOD_END
-};
-
-static driver_t htif_driver = {
- "htif",
- htif_methods,
- sizeof(struct htif_softc)
-};
-
-static devclass_t htif_devclass;
-
-DRIVER_MODULE(htif, simplebus, htif_driver,
- htif_devclass, 0, 0);
diff --git a/sys/riscv/htif/htif_block.c b/sys/riscv/htif/htif_block.c
deleted file mode 100644
index 93662d825c1..00000000000
--- a/sys/riscv/htif/htif_block.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*-
- * Copyright (c) 2015-2016 Ruslan Bukin
- * 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.
- */
-
-#include
-__FBSDID("$FreeBSD$");
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-#include "htif.h"
-
-#define SECTOR_SIZE_SHIFT (9)
-#define SECTOR_SIZE (1 << SECTOR_SIZE_SHIFT)
-
-#define HTIF_BLK_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
-#define HTIF_BLK_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
-#define HTIF_BLK_LOCK_INIT(_sc) \
- mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \
- "htif_blk", MTX_DEF)
-#define HTIF_BLK_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx);
-#define HTIF_BLK_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED);
-#define HTIF_BLK_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
-
-static void htif_blk_task(void *arg);
-
-static disk_open_t htif_blk_open;
-static disk_close_t htif_blk_close;
-static disk_strategy_t htif_blk_strategy;
-
-struct htif_blk_softc {
- device_t dev;
- struct disk *disk;
- struct mtx htif_io_mtx;
- struct mtx sc_mtx;
- struct proc *p;
- struct bio_queue_head bio_queue;
- int running;
- int intr_chan;
- int cmd_done;
- int index;
- uint16_t curtag;
-};
-
-struct htif_blk_request {
- uint64_t addr;
- uint64_t offset; /* offset in bytes */
- uint64_t size; /* length in bytes */
- uint64_t tag;
-};
-
-static void
-htif_blk_intr(void *arg, uint64_t entry)
-{
- struct htif_blk_softc *sc;
- uint64_t devcmd;
- uint64_t data;
-
- sc = arg;
-
- devcmd = HTIF_DEV_CMD(entry);
- data = HTIF_DEV_DATA(entry);
-
- if (sc->curtag == data) {
- wmb();
- sc->cmd_done = 1;
- wakeup(&sc->intr_chan);
- } else {
- device_printf(sc->dev, "Unexpected tag %d (should be %d)\n",
- data, sc->curtag);
- }
-}
-
-static int
-htif_blk_probe(device_t dev)
-{
-
- return (0);
-}
-
-static int
-htif_blk_attach(device_t dev)
-{
- struct htif_blk_softc *sc;
- char prefix[] = " size=";
- char *str;
- long size;
-
- sc = device_get_softc(dev);
- sc->dev = dev;
-
- mtx_init(&sc->htif_io_mtx, device_get_nameunit(dev), "htif_blk", MTX_DEF);
- HTIF_BLK_LOCK_INIT(sc);
-
- str = strstr(htif_get_id(dev), prefix);
-
- size = strtol((str + 6), NULL, 10);
- if (size == 0) {
- return (ENXIO);
- }
-
- sc->index = htif_get_index(dev);
- if (sc->index < 0)
- return (EINVAL);
- htif_setup_intr(sc->index, htif_blk_intr, sc);
-
- sc->disk = disk_alloc();
- sc->disk->d_drv1 = sc;
-
- sc->disk->d_maxsize = 4096; /* Max transfer */
- sc->disk->d_name = "htif_blk";
- sc->disk->d_open = htif_blk_open;
- sc->disk->d_close = htif_blk_close;
- sc->disk->d_strategy = htif_blk_strategy;
- sc->disk->d_unit = 0;
- sc->disk->d_sectorsize = SECTOR_SIZE;
- sc->disk->d_mediasize = size;
- disk_create(sc->disk, DISK_VERSION);
-
- bioq_init(&sc->bio_queue);
-
- sc->running = 1;
-
- kproc_create(&htif_blk_task, sc, &sc->p, 0, 0, "%s: transfer",
- device_get_nameunit(dev));
-
- return (0);
-}
-
-static int
-htif_blk_open(struct disk *dp)
-{
-
- return (0);
-}
-
-static int
-htif_blk_close(struct disk *dp)
-{
-
- return (0);
-}
-
-static void
-htif_blk_task(void *arg)
-{
- struct htif_blk_request req __aligned(HTIF_ALIGN);
- struct htif_blk_softc *sc;
- uint64_t req_paddr;
- struct bio *bp;
- uint64_t paddr;
- uint64_t resp;
- uint64_t cmd;
- int i;
-
- sc = (struct htif_blk_softc *)arg;
-
- while (1) {
- HTIF_BLK_LOCK(sc);
- do {
- bp = bioq_takefirst(&sc->bio_queue);
- if (bp == NULL)
- msleep(sc, &sc->sc_mtx, PRIBIO, "jobqueue", 0);
- } while (bp == NULL);
- HTIF_BLK_UNLOCK(sc);
-
- if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) {
- HTIF_BLK_LOCK(sc);
-
- rmb();
- req.offset = (bp->bio_pblkno * sc->disk->d_sectorsize);
- req.size = bp->bio_bcount;
- paddr = vtophys(bp->bio_data);
- KASSERT(paddr != 0, ("paddr is 0"));
- req.addr = paddr;
- sc->curtag++;
- req.tag = sc->curtag;
-
- cmd = sc->index;
- cmd <<= HTIF_DEV_ID_SHIFT;
- if (bp->bio_cmd == BIO_READ)
- cmd |= (HTIF_CMD_READ << HTIF_CMD_SHIFT);
- else
- cmd |= (HTIF_CMD_WRITE << HTIF_CMD_SHIFT);
- req_paddr = vtophys(&req);
- KASSERT(req_paddr != 0, ("req_paddr is 0"));
- cmd |= req_paddr;
-
- sc->cmd_done = 0;
- resp = htif_command(cmd);
- htif_blk_intr(sc, resp);
-
- /* Wait for interrupt */
- i = 0;
- while (sc->cmd_done == 0) {
- msleep(&sc->intr_chan, &sc->sc_mtx, PRIBIO, "intr", hz/2);
-
- if (i++ > 2) {
- /* TODO: try to re-issue operation on timeout ? */
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- disk_err(bp, "hard error", -1, 1);
- break;
- }
- }
- HTIF_BLK_UNLOCK(sc);
-
- biodone(bp);
- } else {
- printf("unknown op %d\n", bp->bio_cmd);
- }
- }
-}
-
-static void
-htif_blk_strategy(struct bio *bp)
-{
- struct htif_blk_softc *sc;
-
- sc = bp->bio_disk->d_drv1;
-
- HTIF_BLK_LOCK(sc);
- if (sc->running > 0) {
- bioq_disksort(&sc->bio_queue, bp);
- HTIF_BLK_UNLOCK(sc);
- wakeup(sc);
- } else {
- HTIF_BLK_UNLOCK(sc);
- biofinish(bp, NULL, ENXIO);
- }
-}
-
-static device_method_t htif_blk_methods[] = {
- DEVMETHOD(device_probe, htif_blk_probe),
- DEVMETHOD(device_attach, htif_blk_attach),
-};
-
-static driver_t htif_blk_driver = {
- "htif_blk",
- htif_blk_methods,
- sizeof(struct htif_blk_softc)
-};
-
-static devclass_t htif_blk_devclass;
-
-DRIVER_MODULE(htif_blk, htif, htif_blk_driver, htif_blk_devclass, 0, 0);
diff --git a/sys/riscv/include/cpufunc.h b/sys/riscv/include/cpufunc.h
index 2db73ede884..6cac649b4e9 100644
--- a/sys/riscv/include/cpufunc.h
+++ b/sys/riscv/include/cpufunc.h
@@ -81,21 +81,6 @@ intr_enable(void)
);
}
-static __inline register_t
-machine_command(uint64_t cmd, uint64_t arg)
-{
- uint64_t res;
-
- __asm __volatile(
- "mv t5, %2\n"
- "mv t6, %1\n"
- "ecall\n"
- "mv %0, t6" : "=&r"(res) : "r"(arg), "r"(cmd)
- );
-
- return (res);
-}
-
#define cpu_nullop() riscv_nullop()
#define cpufunc_nullop() riscv_nullop()
#define cpu_setttb(a) riscv_setttb(a)
diff --git a/sys/riscv/include/pcpu.h b/sys/riscv/include/pcpu.h
index d72b11c012e..ea5336029d6 100644
--- a/sys/riscv/include/pcpu.h
+++ b/sys/riscv/include/pcpu.h
@@ -46,8 +46,7 @@
#define PCPU_MD_FIELDS \
uint32_t pc_pending_ipis; /* IPIs pending to this CPU */ \
- uint64_t pc_reg; /* CPU MMIO base (PA) */ \
- char __pad[117]
+ char __pad[125]
#ifdef _KERNEL
diff --git a/sys/riscv/include/riscvreg.h b/sys/riscv/include/riscvreg.h
index 8c6b4dce2eb..2e3a4a2e9f5 100644
--- a/sys/riscv/include/riscvreg.h
+++ b/sys/riscv/include/riscvreg.h
@@ -37,19 +37,6 @@
#ifndef _MACHINE_RISCVREG_H_
#define _MACHINE_RISCVREG_H_
-/* Machine mode requests */
-#define ECALL_MTIMECMP 0x01
-#define ECALL_HTIF_GET_ENTRY 0x02
-#define ECALL_MCPUID_GET 0x03
-#define ECALL_MIMPID_GET 0x04
-#define ECALL_SEND_IPI 0x05
-#define ECALL_CLEAR_IPI 0x06
-#define ECALL_MIE_SET 0x07
-#define ECALL_IO_IRQ_MASK 0x08
-#define ECALL_HTIF_CMD 0x09
-#define ECALL_HTIF_CMD_REQ 0x0a
-#define ECALL_HTIF_CMD_RESP 0x0b
-
#define EXCP_SHIFT 0
#define EXCP_MASK (0xf << EXCP_SHIFT)
#define EXCP_MISALIGNED_FETCH 0
@@ -65,9 +52,6 @@
#define EXCP_HYPERVISOR_ECALL 10
#define EXCP_MACHINE_ECALL 11
#define EXCP_INTR (1ul << 63)
-#define EXCP_INTR_SOFTWARE 0
-#define EXCP_INTR_TIMER 1
-#define EXCP_INTR_HTIF 2
#define SSTATUS_UIE (1 << 0)
#define SSTATUS_SIE (1 << 1)
diff --git a/sys/riscv/htif/htif.h b/sys/riscv/include/sbi.h
similarity index 53%
rename from sys/riscv/htif/htif.h
rename to sys/riscv/include/sbi.h
index a1183d97c08..76690ab84b0 100644
--- a/sys/riscv/htif/htif.h
+++ b/sys/riscv/include/sbi.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2015 Ruslan Bukin
+ * Copyright (c) 2016 Ruslan Bukin
* All rights reserved.
*
* Portions of this software were developed by SRI International and the
@@ -34,60 +34,32 @@
* $FreeBSD$
*/
-#define HTIF_DEV_ID_SHIFT (56)
-#define HTIF_DEV_ID_MASK (0xfful << HTIF_DEV_ID_SHIFT)
-#define HTIF_CMD_SHIFT (48)
-#define HTIF_CMD_MASK (0xfful << HTIF_CMD_SHIFT)
-#define HTIF_DATA_SHIFT (0)
-#define HTIF_DATA_MASK (0xffffffff << HTIF_DATA_SHIFT)
+#ifndef _MACHINE_SBI_H_
+#define _MACHINE_SBI_H_
-#define HTIF_CMD_READ (0x00ul)
-#define HTIF_CMD_WRITE (0x01ul)
-#define HTIF_CMD_READ_CONTROL_REG (0x02ul)
-#define HTIF_CMD_WRITE_CONTROL_REG (0x03ul)
-#define HTIF_CMD_IDENTIFY (0xfful)
-#define IDENTIFY_PADDR_SHIFT 8
-#define IDENTIFY_IDENT 0xff
+typedef struct {
+ uint64_t base;
+ uint64_t size;
+ uint64_t node_id;
+} memory_block_info;
-#define HTIF_NDEV (256)
-#define HTIF_ID_LEN (64)
-#define HTIF_ALIGN (64)
+uint64_t sbi_query_memory(uint64_t id, memory_block_info *p);
+uint64_t sbi_hart_id(void);
+uint64_t sbi_num_harts(void);
+uint64_t sbi_timebase(void);
+void sbi_set_timer(uint64_t stime_value);
+void sbi_send_ipi(uint64_t hart_id);
+uint64_t sbi_clear_ipi(void);
+void sbi_shutdown(void);
-#define HTIF_DEV_CMD(entry) ((entry & HTIF_CMD_MASK) >> HTIF_CMD_SHIFT)
-#define HTIF_DEV_ID(entry) ((entry & HTIF_DEV_ID_MASK) >> HTIF_DEV_ID_SHIFT)
-#define HTIF_DEV_DATA(entry) ((entry & HTIF_DATA_MASK) >> HTIF_DATA_SHIFT)
+void sbi_console_putchar(unsigned char ch);
+int sbi_console_getchar(void);
-/* bus softc */
-struct htif_softc {
- struct resource *res[1];
- void *ihl[1];
- device_t dev;
- uint64_t identify_id;
- uint64_t identify_done;
-};
+void sbi_remote_sfence_vm(uint64_t hart_mask_ptr, uint64_t asid);
+void sbi_remote_sfence_vm_range(uint64_t hart_mask_ptr, uint64_t asid, uint64_t start, uint64_t size);
+void sbi_remote_fence_i(uint64_t hart_mask_ptr);
-/* device private data */
-struct htif_dev_ivars {
- char *id;
- int index;
- device_t dev;
- struct htif_softc *sc;
-};
+uint64_t sbi_mask_interrupt(uint64_t which);
+uint64_t sbi_unmask_interrupt(uint64_t which);
-uint64_t htif_command(uint64_t);
-int htif_setup_intr(int id, void *func, void *arg);
-int htif_read_ivar(device_t dev, device_t child, int which, uintptr_t *result);
-
-enum htif_device_ivars {
- HTIF_IVAR_INDEX,
- HTIF_IVAR_ID,
-};
-
-/*
- * Simplified accessors for HTIF devices
- */
-#define HTIF_ACCESSOR(var, ivar, type) \
- __BUS_ACCESSOR(htif, var, HTIF, ivar, type)
-
-HTIF_ACCESSOR(index, INDEX, int);
-HTIF_ACCESSOR(id, ID, char *);
+#endif /* !_MACHINE_SBI_H_ */
diff --git a/sys/riscv/include/vmparam.h b/sys/riscv/include/vmparam.h
index 4e1cdcfd6e5..7ecd884f9da 100644
--- a/sys/riscv/include/vmparam.h
+++ b/sys/riscv/include/vmparam.h
@@ -156,26 +156,26 @@
#define VM_MIN_KERNEL_ADDRESS (0xffffffc000000000UL)
#define VM_MAX_KERNEL_ADDRESS (0xffffffc800000000UL)
-/* Direct Map for 128 GiB of PA: 0x0 - 0x1fffffffff */
+/* 128 GiB maximum for the direct map region */
#define DMAP_MIN_ADDRESS (0xffffffd000000000UL)
-#define DMAP_MAX_ADDRESS (0xffffffefffffffffUL)
+#define DMAP_MAX_ADDRESS (0xfffffff000000000UL)
-#define DMAP_MIN_PHYSADDR (0x0000000000000000UL)
-#define DMAP_MAX_PHYSADDR (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS)
+#define DMAP_MIN_PHYSADDR (dmap_phys_base)
+#define DMAP_MAX_PHYSADDR (dmap_phys_max)
/* True if pa is in the dmap range */
#define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
- (pa) <= DMAP_MAX_PHYSADDR)
+ (pa) < DMAP_MAX_PHYSADDR)
/* True if va is in the dmap range */
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
- (va) <= DMAP_MAX_ADDRESS)
+ (va) < (dmap_max_addr))
#define PHYS_TO_DMAP(pa) \
({ \
KASSERT(PHYS_IN_DMAP(pa), \
("%s: PA out of range, PA: 0x%lx", __func__, \
(vm_paddr_t)(pa))); \
- (pa) | DMAP_MIN_ADDRESS; \
+ ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \
})
#define DMAP_TO_PHYS(va) \
@@ -183,7 +183,7 @@
KASSERT(VIRT_IN_DMAP(va), \
("%s: VA out of range, VA: 0x%lx", __func__, \
(vm_offset_t)(va))); \
- (va) & ~DMAP_MIN_ADDRESS; \
+ ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \
})
#define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
@@ -196,7 +196,7 @@
#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
#define USRSTACK SHAREDPAGE
-#define KERNENTRY (0x80000000)
+#define KERNENTRY (0)
/*
* How many physical pages per kmem arena virtual page.
@@ -233,9 +233,14 @@
* #define UMA_MD_SMALL_ALLOC
*/
+#ifndef LOCORE
+extern vm_paddr_t dmap_phys_base;
+extern vm_paddr_t dmap_phys_max;
+extern vm_offset_t dmap_max_addr;
extern u_int tsb_kernel_ldd_phys;
extern vm_offset_t vm_max_kernel_address;
extern vm_offset_t init_pt_va;
+#endif
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
diff --git a/sys/riscv/riscv/exception.S b/sys/riscv/riscv/exception.S
index 5b8ef7a7ae4..d5efd732ca6 100644
--- a/sys/riscv/riscv/exception.S
+++ b/sys/riscv/riscv/exception.S
@@ -235,388 +235,3 @@ ENTRY(cpu_exception_handler_user)
csrrw sp, sscratch, sp
sret
END(cpu_exception_handler_user)
-
-/*
- * Trap handlers
- */
- .text
-bad_trap:
- j bad_trap
-
-machine_trap:
- /* Save state */
- csrrw sp, mscratch, sp
- addi sp, sp, -64
- sd t0, (8 * 0)(sp)
- sd t1, (8 * 1)(sp)
- sd t2, (8 * 2)(sp)
- sd t3, (8 * 3)(sp)
- sd t4, (8 * 4)(sp)
- sd t5, (8 * 5)(sp)
- sd a0, (8 * 7)(sp)
-
- csrr t3, mstatus /* Required for debug */
- csrr t0, mcause
- bltz t0, machine_interrupt
-
- li t1, EXCP_SUPERVISOR_ECALL
- beq t0, t1, supervisor_call
-4:
- /* NOT REACHED */
- j 4b
-
-machine_interrupt:
- /* Type of interrupt ? */
- csrr t0, mcause
- andi t0, t0, EXCP_MASK
-#if 0
- /* lowRISC TODO */
- li t1, 4
- beq t1, t0, io_interrupt /* lowRISC only */
-#endif
- li t1, 1
- beq t1, t0, supervisor_software_interrupt
- li t1, 3
- beq t1, t0, machine_software_interrupt
- li t1, 5
- beq t1, t0, supervisor_timer_interrupt
- li t1, 7
- beq t1, t0, machine_timer_interrupt
-
- /* NOT REACHED */
-1:
- j 1b
-
-#if 0
- /* lowRISC TODO */
-io_interrupt:
- /* Disable IO interrupts so we can go to supervisor mode */
- csrwi CSR_IO_IRQ, 0
-
- /* Handle the trap in supervisor mode */
- j exit_mrts
-#endif
-
-supervisor_software_interrupt:
-1:
- /* Nothing here as we are using mideleg feature */
- j 1b
-
-machine_software_interrupt:
- /* Clear IPI */
- li t0, 0x40001000
- csrr t2, mhartid
- li t3, 0x1000
- mul t2, t2, t3
- add t0, t0, t2
- li t2, 0
- sd t2, 0(t0)
-
- /* Clear machine software pending bit */
- li t0, MIP_MSIP
- csrc mip, t0
-
- /* Post supervisor software interrupt */
- li t0, MIP_SSIP
- csrs mip, t0
-
- j exit
-
-supervisor_timer_interrupt:
-1:
- /* Nothing here as we are using mideleg feature */
- j 1b
-
-machine_timer_interrupt:
- /* Disable machine timer interrupts */
- li t0, MIE_MTIE
- csrc mie, t0
-
- /* Clear machine timer interrupt pending */
- li t0, MIP_MTIP
- csrc mip, t0
-
- /* Post supervisor timer interrupt */
- li t0, MIP_STIP
- csrs mip, t0
-
- /*
- * Check for HTIF interrupts.
- * The only interrupt expected here is key press.
- */
- la t0, htif_lock
- li t2, 1
- amoswap.d t3, t2, 0(t0)
- bnez t3, 5f /* Another operation in progress, give up */
-
- /* We have lock */
- la t1, fromhost
- ld t5, 0(t1)
- beqz t5, 4f
-
- /* Console GET intr ? */
- mv t1, t5
- li t0, 0x100
- srli t1, t1, 48
- beq t1, t0, 2f
-1:
- /* There is no interrupts except keypress */
- j 1b
-
-2:
- /* Save entry */
- la t0, htif_ring
- li t4, (HTIF_RING_SIZE)
- add t0, t0, t4 /* t0 == htif_ring_cursor */
-
- ld t1, 0(t0) /* load ptr to cursor */
- sd t5, 0(t1) /* put entry */
- li t4, 1
- sd t4, 8(t1) /* mark used */
- ld t4, 16(t1) /* take next */
- /* Update cursor */
- sd t4, 0(t0)
-
- /* Post supervisor software interrupt */
- li t0, MIP_SSIP
- csrs mip, t0
-
-3:
- la t1, fromhost
- li t5, 0
- sd t5, 0(t1)
-
-4:
- /* Release lock */
- la t0, htif_lock
- li t2, 0
- amoswap.d t3, t2, 0(t0)
-
-5:
- j exit
-
-supervisor_call:
- csrr t1, mepc
- addi t1, t1, 4 /* Next instruction in t1 */
- li t4, ECALL_HTIF_CMD
- beq t5, t4, htif_cmd
- li t4, ECALL_HTIF_CMD_REQ
- beq t5, t4, htif_cmd_req
- li t4, ECALL_HTIF_CMD_RESP
- beq t5, t4, htif_cmd_resp
- li t4, ECALL_HTIF_GET_ENTRY
- beq t5, t4, htif_get_entry
- li t4, ECALL_MTIMECMP
- beq t5, t4, set_mtimecmp
- li t4, ECALL_MCPUID_GET
- beq t5, t4, mcpuid_get
- li t4, ECALL_MIMPID_GET
- beq t5, t4, mimpid_get
- li t4, ECALL_SEND_IPI
- beq t5, t4, send_ipi
- li t4, ECALL_CLEAR_IPI
- beq t5, t4, clear_ipi
- li t4, ECALL_MIE_SET
- beq t5, t4, mie_set
-#if 0
- /* lowRISC TODO */
- li t4, ECALL_IO_IRQ_MASK
- beq t5, t4, io_irq_mask
-#endif
- j exit_next_instr
-
-#if 0
- /* lowRISC TODO */
-io_irq_mask:
- csrw CSR_IO_IRQ, t6
- j exit_next_instr
-#endif
-
-mie_set:
- csrs mie, t6
- j exit_next_instr
-
-mcpuid_get:
- csrr t6, misa
- j exit_next_instr
-
-mimpid_get:
- csrr t6, mimpid
- j exit_next_instr
-
-send_ipi:
- /* CPU ipi MMIO register in t6 */
- mv t0, t6
- li t2, 1
- sd t2, 0(t0)
- j exit_next_instr
-
-clear_ipi:
- /* Do only clear if there are no new entries in HTIF ring */
- la t0, htif_ring
- li t4, (HTIF_RING_SIZE)
- add t0, t0, t4 /* t0 == ptr to htif_ring_cursor */
- ld t2, 8(t0) /* load htif_ring_last */
- ld t2, 8(t2) /* load used */
- bnez t2, 1f
-
- /* Clear supervisor software interrupt pending bit */
- li t0, MIP_SSIP
- csrc mip, t0
-
-1:
- j exit_next_instr
-
-htif_get_entry:
- /* Get a htif_ring for current core */
- la t0, htif_ring
- li t4, (HTIF_RING_SIZE + 8)
- add t0, t0, t4 /* t0 == htif_ring_last */
-
- /* Check for new entries */
- li t6, 0 /* preset return value */
- ld t2, 0(t0) /* load ptr to last */
- ld t4, 8(t2) /* get used */
- beqz t4, 1f /* No new entries. Exit */
-
- /* Get one */
- ld t6, 0(t2) /* get entry */
- li t4, 0
- sd t4, 8(t2) /* mark free */
- sd t4, 0(t2) /* free entry, just in case */
- ld t4, 16(t2) /* take next */
- sd t4, 0(t0) /* update ptr to last */
-1:
- /* Exit. Result is stored in t6 */
- j exit_next_instr
-
-htif_cmd_resp:
- la t0, htif_lock
- li t2, 1
-1:
- amoswap.d t3, t2, 0(t0)
- bnez t3, 1b
-
- /* We have lock. Read for data */
- la t4, fromhost
- ld t6, 0(t4)
- beqz t6, 2f
-
- /* Clear event */
- li t5, 0
- sd t5, 0(t4)
-
-2:
- /* Release lock */
- la t0, htif_lock
- li t2, 0
- amoswap.d t3, t2, 0(t0)
-
- j exit_next_instr
-
-htif_cmd_req:
- la t0, htif_lock
- li t2, 1
-1:
- amoswap.d t3, t2, 0(t0)
- bnez t3, 1b
-
- /* We have lock. Store new request */
- la t4, tohost
- sd t6, 0(t4)
-
- /* Release lock */
- la t0, htif_lock
- li t2, 0
- amoswap.d t3, t2, 0(t0)
-
- j exit_next_instr
-
-htif_cmd:
- la t0, htif_lock
- li t2, 1
-1:
- amoswap.d t3, t2, 0(t0)
- bnez t3, 1b
-
- mv t3, t6
-
- /* We have lock. Store new request */
- la t4, tohost
- sd t6, 0(t4)
-2:
- /* Poll for result */
- la t4, fromhost
- ld t6, 0(t4)
- beqz t6, 2b
-
- /* Check for unexpected event */
- srli t0, t6, 48
- srli t2, t3, 48
- beq t2, t0, 3f
-
- /*
- * We have something unexpected (e.g. keyboard keypress)
- * Save entry.
- */
- la t0, htif_ring
- li t4, (HTIF_RING_SIZE)
- add t0, t0, t4 /* t0 == htif_ring_cursor */
-
- ld t2, 0(t0) /* load ptr to cursor */
- sd t6, 0(t2) /* put entry */
- li t4, 1
- sd t4, 8(t2) /* mark used */
- ld t4, 16(t2) /* take next */
- /* Update cursor */
- sd t4, 0(t0)
-
- /* Post supervisor software interrupt */
- li t0, MIP_SSIP
- csrs mip, t0
-
- /* Clear and look for response again */
- la t2, fromhost
- li t5, 0
- sd t5, 0(t2)
- j 2b
-
-3:
- la t2, fromhost
- li t5, 0
- sd t5, 0(t2)
-
- /* Release lock */
- la t0, htif_lock
- li t2, 0
- amoswap.d t3, t2, 0(t0)
-
- j exit_next_instr
-
-set_mtimecmp:
- /* Enable interrupts */
- li t0, (MIE_MTIE | MIE_STIE)
- csrs mie, t0
- j exit_next_instr
-
-/*
- * Trap exit functions
- */
-exit_next_instr:
- /* Next instruction is in t1 */
- csrw mepc, t1
-exit:
- /* Restore state */
- ld t0, (8 * 0)(sp)
- ld t1, (8 * 1)(sp)
- ld t2, (8 * 2)(sp)
- ld t3, (8 * 3)(sp)
- ld t4, (8 * 4)(sp)
- ld t5, (8 * 5)(sp)
- ld a0, (8 * 7)(sp)
- addi sp, sp, 64
- csrrw sp, mscratch, sp
- mret
-
-exit_mrts:
- j exit_mrts
diff --git a/sys/riscv/riscv/genassym.c b/sys/riscv/riscv/genassym.c
index c6c8b8518fa..c9e9bc1c991 100644
--- a/sys/riscv/riscv/genassym.c
+++ b/sys/riscv/riscv/genassym.c
@@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include
ASSYM(KERNBASE, KERNBASE);
-ASSYM(KERNENTRY, KERNENTRY);
ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS);
ASSYM(VM_MAX_KERNEL_ADDRESS, VM_MAX_KERNEL_ADDRESS);
ASSYM(TDF_ASTPENDING, TDF_ASTPENDING);
diff --git a/sys/riscv/riscv/identcpu.c b/sys/riscv/riscv/identcpu.c
index 8226423b2fc..94ad889e0ed 100644
--- a/sys/riscv/riscv/identcpu.c
+++ b/sys/riscv/riscv/identcpu.c
@@ -101,8 +101,9 @@ identify_cpu(void)
cpu_partsp = NULL;
- mimpid = machine_command(ECALL_MIMPID_GET, 0);
- misa = machine_command(ECALL_MCPUID_GET, 0);
+ /* TODO: can we get mimpid and misa somewhere ? */
+ mimpid = 0;
+ misa = 0;
cpu = PCPU_GET(cpuid);
diff --git a/sys/riscv/riscv/intr_machdep.c b/sys/riscv/riscv/intr_machdep.c
index 3dd988f712b..879cea710e7 100644
--- a/sys/riscv/riscv/intr_machdep.c
+++ b/sys/riscv/riscv/intr_machdep.c
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
+#include
#ifdef SMP
#include
@@ -267,7 +268,7 @@ ipi_send(struct pcpu *pc, int ipi)
CTR3(KTR_SMP, "%s: cpu=%d, ipi=%x", __func__, pc->pc_cpuid, ipi);
atomic_set_32(&pc->pc_pending_ipis, ipi);
- machine_command(ECALL_SEND_IPI, pc->pc_reg);
+ sbi_send_ipi(pc->pc_cpuid);
CTR1(KTR_SMP, "%s: sent", __func__);
}
diff --git a/sys/riscv/riscv/locore.S b/sys/riscv/riscv/locore.S
index 1783fb90817..2b36e2e8aeb 100644
--- a/sys/riscv/riscv/locore.S
+++ b/sys/riscv/riscv/locore.S
@@ -43,118 +43,47 @@
#include
#include
-#define HTIF_RING_NENTRIES (512)
-#define HTIF_RING_ENTRY_SZ (24)
-#define HTIF_RING_SIZE (HTIF_RING_ENTRY_SZ * HTIF_RING_NENTRIES)
-#define HW_STACK_SIZE (96)
-
-/*
- * Event queue:
- *
- * struct htif_ring {
- * uint64_t data;
- * uint64_t used;
- * uint64_t next;
- * } htif_ring[HTIF_RING_NENTRIES];
- * uint64_t htif_ring_cursor;
- * uint64_t htif_ring_last;
- */
-
-.macro build_ring
- la t0, htif_ring
- li t1, 0
- sd t1, 0(t0) /* zero data */
- sd t1, 8(t0) /* zero used */
- mv t2, t0
- mv t3, t0
- li t5, (HTIF_RING_SIZE)
- li t6, 0
- add t4, t0, t5
-1:
- addi t3, t3, HTIF_RING_ENTRY_SZ /* pointer to next */
- beq t3, t4, 2f /* finish */
- sd t3, 16(t2) /* store pointer */
- addi t2, t2, HTIF_RING_ENTRY_SZ /* next entry */
- addi t6, t6, 1 /* counter */
- j 1b
-2:
- addi t3, t3, -HTIF_RING_ENTRY_SZ
- sd t0, 16(t3) /* last -> first */
-
- li t2, (HTIF_RING_SIZE)
- add s0, t0, t2
- sd t0, 0(s0) /* cursor */
- sd t0, 8(s0) /* last */
- /* finish building ring */
-.endm
-
.globl kernbase
.set kernbase, KERNBASE
/* Trap entries */
.text
-mentry:
- /* Vectors */
- j _start /* reset */
- j bad_trap /* NMI (non-maskable interrupt) */
- j machine_trap
-
/* Reset vector */
.text
.globl _start
_start:
- /* Setup machine trap vector */
- la t0, machine_trap
- csrw mtvec, t0
-
- /* Delegate interrupts to supervisor mode */
- li t0, (MIP_SSIP | MIP_STIP | MIP_SEIP)
- csrw mideleg, t0
-
- /* Delegate exceptions to supervisor mode */
- li t0, (1 << EXCP_MISALIGNED_FETCH) | \
- (1 << EXCP_FAULT_FETCH) | \
- (1 << EXCP_ILLEGAL_INSTRUCTION) | \
- (1 << EXCP_FAULT_LOAD) | \
- (1 << EXCP_FAULT_STORE) | \
- (1 << EXCP_BREAKPOINT) | \
- (1 << EXCP_USER_ECALL)
- csrw medeleg, t0
-
+ /* Setup supervisor trap vector */
la t0, cpu_exception_handler
- li t1, KERNBASE
- add t0, t0, t1
csrw stvec, t0
- /* Direct secondary cores to mpentry */
- csrr a0, mhartid
- bnez a0, mpentry
-
- li t1, 0
- la t0, tohost
- sd t1, 0(t0)
- la t0, fromhost
- sd t1, 0(t0)
-
- /* Build event queue for current core */
- build_ring
-
- /* Setup machine-mode stack for CPU 0 */
- la t0, hardstack_end
- csrw mscratch, t0
-
+ /* Ensure sscratch is zero */
li t0, 0
csrw sscratch, t0
- li s10, PAGE_SIZE
- li s9, (PAGE_SIZE * KSTACK_PAGES)
+ /* Load physical memory information */
+ li a0, 0
+ la a1, memory_info
+ call sbi_query_memory
- /* Page tables */
+ /* Store base to s6 */
+ la s6, memory_info
+ ld s6, 0(s6) /* s6 = physmem base */
+
+ /* Direct secondary cores to mpentry */
+ call sbi_hart_id
+ bnez a0, mpentry
+
+ /*
+ * Page tables
+ */
/* Create an L1 page for early devmap */
la s1, pagetable_l1
la s2, pagetable_l2_devmap /* Link to next level PN */
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
srli s2, s2, PAGE_SHIFT
li a5, (VM_MAX_KERNEL_ADDRESS - L2_SIZE)
@@ -170,19 +99,74 @@ _start:
add t0, s1, a5
sd t6, (t0)
- /* Add single Level 1 entry for kernel */
+ /* Create an L1 page for SBI */
+ la s1, pagetable_l1
+ la s2, pagetable_l2_sbi /* Link to next level PN */
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
+ srli s2, s2, PAGE_SHIFT
+ li a5, 511
+ li t4, PTE_V
+ slli t5, s2, PTE_PPN0_S /* (s2 << PTE_PPN0_S) */
+ or t6, t4, t5
+
+ /* Store SBI L1 PTE entry to position */
+ li a6, PTE_SIZE
+ mulw a5, a5, a6
+ add t0, s1, a5
+ sd t6, (t0)
+
+ /* Create an L2 page for SBI */
+ la s1, pagetable_l2_sbi
+ la s2, pagetable_l3_sbi /* Link to next level PN */
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
+ srli s2, s2, PAGE_SHIFT
+ li a5, 511
+ li t4, PTE_V
+ slli t5, s2, PTE_PPN0_S /* (s2 << PTE_PPN0_S) */
+ or t6, t4, t5
+
+ /* Store SBI L2 PTE entry to position */
+ li a6, PTE_SIZE
+ mulw a5, a5, a6
+ add t0, s1, a5
+ sd t6, (t0)
+
+ /* Create an L3 page for SBI */
+ la s1, pagetable_l3_sbi
+ li s2, 0x80009000
+ srli s2, s2, PAGE_SHIFT
+ li a5, 511
+ li t4, PTE_V | PTE_RX | PTE_W
+ slli t5, s2, PTE_PPN0_S /* (s2 << PTE_PPN0_S) */
+ or t6, t4, t5
+
+ /* Store SBI L3 PTE entry to position */
+ li a6, PTE_SIZE
+ mulw a5, a5, a6
+ add t0, s1, a5
+ sd t6, (t0)
+ /* END SBI page creation */
+
+ /* Add L1 entry for kernel */
la s1, pagetable_l1
la s2, pagetable_l2 /* Link to next level PN */
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
srli s2, s2, PAGE_SHIFT
- li a5, (KERNBASE + KERNENTRY)
+ li a5, KERNBASE
srli a5, a5, L1_SHIFT /* >> L1_SHIFT */
andi a5, a5, 0x1ff /* & 0x1ff */
li t4, PTE_V
slli t5, s2, PTE_PPN0_S /* (s2 << PTE_PPN0_S) */
or t6, t4, t5
- /* Store single level1 PTE entry to position */
+ /* Store L1 PTE entry to position */
li a6, PTE_SIZE
mulw a5, a5, a6
add t0, s1, a5
@@ -190,8 +174,7 @@ _start:
/* Level 2 superpages (512 x 2MiB) */
la s1, pagetable_l2
- li t4, KERNENTRY
- srli t4, t4, 21 /* Div by 2 MiB */
+ srli t4, s6, 21 /* Div physmem base by 2 MiB */
li t2, 512 /* Build 512 entries */
add t3, t4, t2
li t5, 0
@@ -206,32 +189,13 @@ _start:
bltu t4, t3, 2b
/* Set page tables base register */
- la s1, pagetable_l1
- srli s1, s1, PAGE_SHIFT
- csrw sptbr, s1
+ la s2, pagetable_l1
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
+ srli s2, s2, PAGE_SHIFT
+ csrw sptbr, s2
- /* Page tables END */
-
- /* Enter supervisor mode */
- li s0, ((MSTATUS_VM_SV39 << MSTATUS_VM_SHIFT) | \
- (MSTATUS_PRV_S << MSTATUS_MPP_SHIFT));
- csrw mstatus, s0
-
- /*
- * Enable machine-mode software interrupts
- * so we can deliver IPI to this core.
- */
- li t0, MIE_MSIE
- csrs mie, t0
-
- /* Exit from machine mode */
- la t0, .Lmmu_on
- li s11, KERNBASE
- add t0, t0, s11
- csrw mepc, t0
- mret
-
-.Lmmu_on:
/* Initialize stack pointer */
la s3, initstack_end
mv sp, s3
@@ -247,8 +211,10 @@ _start:
/* Fill riscv_bootparams */
addi sp, sp, -16
+
la t0, pagetable_l1
sd t0, 0(sp) /* kern_l1pt */
+
la t0, initstack_end
sd t0, 8(sp) /* kern_stack */
@@ -260,19 +226,6 @@ _start:
initstack:
.space (PAGE_SIZE * KSTACK_PAGES)
initstack_end:
-hardstack:
- .space (HW_STACK_SIZE * MAXCPU)
-hardstack_end:
-
- .globl htif_ring
-htif_ring:
- .space (HTIF_RING_SIZE + 16)
-htif_lock:
- .space (8)
-tohost:
- .space (8)
-fromhost:
- .space (8)
ENTRY(sigcode)
mv a0, sp
@@ -305,6 +258,14 @@ pagetable_l2:
.space PAGE_SIZE
pagetable_l2_devmap:
.space PAGE_SIZE
+pagetable_l2_sbi:
+ .space PAGE_SIZE
+pagetable_l3_sbi:
+ .space PAGE_SIZE
+
+ .globl memory_info
+memory_info:
+ .space (24)
.globl init_pt_va
init_pt_va:
@@ -321,7 +282,6 @@ END(mpentry)
* mpentry(unsigned long)
*
* Called by a core when it is being brought online.
- * The data in x0 is passed straight to init_secondary.
*/
ENTRY(mpentry)
/*
@@ -340,44 +300,12 @@ ENTRY(mpentry)
beqz t1, 1b
/* Set page tables base register */
- la t0, pagetable_l1
- srli t0, t0, PAGE_SHIFT
- csrw sptbr, t0
-
- /* Configure mstatus */
- li s0, ((MSTATUS_VM_SV39 << MSTATUS_VM_SHIFT) | \
- (MSTATUS_PRV_S << MSTATUS_MPP_SHIFT));
- csrw mstatus, s0
-
- /* Setup stack for machine mode exceptions */
- la t0, hardstack_end
- li t1, HW_STACK_SIZE
- mulw t1, t1, a0
- sub t0, t0, t1
- csrw mscratch, t0
-
- li t0, 0
- csrw sscratch, t0
-
- /*
- * Enable machine-mode software interrupts
- * so we can deliver IPI to this core.
- */
- li t0, MIE_MSIE
- csrs mie, t0
-
- /*
- * Exit from machine mode and go to
- * the virtual address space.
- */
- la t0, mp_virtdone
- li s11, KERNBASE
- add t0, t0, s11
- csrw mepc, t0
- mret
-
-mp_virtdone:
- /* We are now in virtual address space */
+ la s2, pagetable_l1
+ li t0, KERNBASE
+ sub s2, s2, t0
+ add s2, s2, s6
+ srli s2, s2, PAGE_SHIFT
+ csrw sptbr, s2
/* Setup stack pointer */
la t0, secondary_stacks
@@ -388,5 +316,3 @@ mp_virtdone:
call init_secondary
END(mpentry)
#endif
-
-#include "exception.S"
diff --git a/sys/riscv/riscv/machdep.c b/sys/riscv/riscv/machdep.c
index fb969f1e770..7bc4402597d 100644
--- a/sys/riscv/riscv/machdep.c
+++ b/sys/riscv/riscv/machdep.c
@@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
+#include
#include
@@ -116,6 +117,7 @@ int64_t idcache_line_size; /* The minimum cache line size */
extern int *end;
extern int *initstack_end;
+extern memory_block_info memory_info;
struct pcpu *pcpup;
@@ -728,12 +730,9 @@ fake_preload_metadata(struct riscv_bootparams *rvbp __unused)
void
initriscv(struct riscv_bootparams *rvbp)
{
- struct mem_region mem_regions[FDT_MEM_REGIONS];
vm_offset_t lastaddr;
- int mem_regions_sz;
vm_size_t kernlen;
caddr_t kmdp;
- int i;
/* Set the module data location */
lastaddr = fake_preload_metadata(rvbp);
@@ -755,12 +754,20 @@ initriscv(struct riscv_bootparams *rvbp)
/* Load the physical memory ranges */
physmap_idx = 0;
+#if 0
+ struct mem_region mem_regions[FDT_MEM_REGIONS];
+ int mem_regions_sz;
+ int i;
/* Grab physical memory regions information from device tree. */
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, NULL) != 0)
panic("Cannot get physical memory regions");
for (i = 0; i < mem_regions_sz; i++)
add_physmap_entry(mem_regions[i].mr_start,
mem_regions[i].mr_size, physmap, &physmap_idx);
+#endif
+
+ add_physmap_entry(memory_info.base, memory_info.size,
+ physmap, &physmap_idx);
/* Set the pcpu data, this is needed by pmap_bootstrap */
pcpup = &__pcpu[0];
@@ -778,14 +785,15 @@ initriscv(struct riscv_bootparams *rvbp)
/* Bootstrap enough of pmap to enter the kernel proper */
kernlen = (lastaddr - KERNBASE);
- pmap_bootstrap(rvbp->kern_l1pt, KERNENTRY, kernlen);
+ pmap_bootstrap(rvbp->kern_l1pt, memory_info.base, kernlen);
cninit();
init_proc0(rvbp->kern_stack);
/* set page table base register for thread0 */
- thread0.td_pcb->pcb_l1addr = (rvbp->kern_l1pt - KERNBASE);
+ thread0.td_pcb->pcb_l1addr = \
+ (rvbp->kern_l1pt - KERNBASE + memory_info.base);
msgbufinit(msgbufp, msgbufsize);
mutex_init();
diff --git a/sys/riscv/riscv/mp_machdep.c b/sys/riscv/riscv/mp_machdep.c
index 9152e700e36..33353ac2a3c 100644
--- a/sys/riscv/riscv/mp_machdep.c
+++ b/sys/riscv/riscv/mp_machdep.c
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
#include
#include
+#include
#ifdef VFP
#include
#endif
@@ -273,14 +274,7 @@ ipi_handler(void *arg)
u_int cpu, ipi;
int bit;
- /*
- * We have shared interrupt line for both IPI and HTIF,
- * so we don't really need to clear pending bit here
- * as it will be cleared later in htif_intr.
- * But lets assume HTIF is optional part, so do clear
- * pending bit if there is no new entires in htif_ring.
- */
- machine_command(ECALL_CLEAR_IPI, 0);
+ sbi_clear_ipi();
cpu = PCPU_GET(cpuid);
@@ -382,12 +376,10 @@ cpu_init_fdt(u_int id, phandle_t node, u_int addr_size, pcell_t *reg)
/* We are already running on cpu 0 */
if (id == 0) {
- pcpup->pc_reg = target_cpu;
return (1);
}
pcpu_init(pcpup, id, sizeof(struct pcpu));
- pcpup->pc_reg = target_cpu;
dpcpu[id - 1] = (void *)kmem_malloc(kernel_arena, DPCPU_SIZE,
M_WAITOK | M_ZERO);
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index 73bc5c89687..f09fc857a89 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -220,6 +220,14 @@ vm_offset_t kernel_vm_end = 0;
struct msgbuf *msgbufp = NULL;
+vm_paddr_t dmap_phys_base; /* The start of the dmap region */
+vm_paddr_t dmap_phys_max; /* The limit of the dmap region */
+vm_offset_t dmap_max_addr; /* The virtual address limit of the dmap */
+
+/* This code assumes all L1 DMAP entries will be used */
+CTASSERT((DMAP_MIN_ADDRESS & ~L1_OFFSET) == DMAP_MIN_ADDRESS);
+CTASSERT((DMAP_MAX_ADDRESS & ~L1_OFFSET) == DMAP_MAX_ADDRESS);
+
static struct rwlock_padalign pvh_global_lock;
/*
@@ -458,6 +466,10 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
l2 = pmap_early_page_idx(l1pt, va, &l1_slot, &l2_slot);
+ /* Check locore has used L2 superpages */
+ KASSERT((l2[l2_slot] & PTE_RX) != 0,
+ ("Invalid bootstrap L2 table"));
+
/* L2 is superpages */
ret = (l2[l2_slot] >> PTE_PPN1_S) << L2_SHIFT;
ret += (va & L2_OFFSET);
@@ -466,7 +478,7 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
}
static void
-pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart)
+pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_paddr_t max_pa)
{
vm_offset_t va;
vm_paddr_t pa;
@@ -475,19 +487,12 @@ pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart)
pt_entry_t entry;
pn_t pn;
- /*
- * Initialize DMAP starting from zero physical address.
- * TODO: remove this once machine-mode code splitted out.
- */
- kernstart = 0;
- printf("%s: l1pt 0x%016lx kernstart 0x%016lx\n", __func__, l1pt, kernstart);
-
- pa = kernstart & ~L1_OFFSET;
+ pa = dmap_phys_base = min_pa & ~L1_OFFSET;
va = DMAP_MIN_ADDRESS;
- l1 = (pd_entry_t *)l1pt;
+ l1 = (pd_entry_t *)kern_l1;
l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS);
- for (; va < DMAP_MAX_ADDRESS;
+ for (; va < DMAP_MAX_ADDRESS && pa < max_pa;
pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
@@ -498,6 +503,10 @@ pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart)
pmap_load_store(&l1[l1_slot], entry);
}
+ /* Set the upper limit of the DMAP region */
+ dmap_phys_max = pa;
+ dmap_max_addr = va;
+
cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE);
cpu_tlb_flushID();
}
@@ -552,7 +561,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
pt_entry_t *l2;
vm_offset_t va, freemempos;
vm_offset_t dpcpu, msgbufpv;
- vm_paddr_t pa, min_pa;
+ vm_paddr_t pa, min_pa, max_pa;
int i;
kern_delta = KERNBASE - kernstart;
@@ -574,7 +583,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
LIST_INIT(&allpmaps);
/* Assume the address we were loaded to is a valid physical address */
- min_pa = KERNBASE - kern_delta;
+ min_pa = max_pa = KERNBASE - kern_delta;
/*
* Find the minimum physical address. physmap is sorted,
@@ -585,11 +594,13 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
continue;
if (physmap[i] <= min_pa)
min_pa = physmap[i];
+ if (physmap[i + 1] > max_pa)
+ max_pa = physmap[i + 1];
break;
}
/* Create a direct map region early so we can use it for pa -> va */
- pmap_bootstrap_dmap(l1pt, min_pa);
+ pmap_bootstrap_dmap(l1pt, min_pa, max_pa);
va = KERNBASE;
pa = KERNBASE - kern_delta;
diff --git a/sys/riscv/htif/htif_console.c b/sys/riscv/riscv/riscv_console.c
similarity index 71%
rename from sys/riscv/htif/htif_console.c
rename to sys/riscv/riscv/riscv_console.c
index 7eca398b799..d59ed59c18a 100644
--- a/sys/riscv/htif/htif_console.c
+++ b/sys/riscv/riscv/riscv_console.c
@@ -47,16 +47,41 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
-
-#include
-#include
-
-#include "htif.h"
+#include
#include
-
#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static struct resource_spec rcons_spec[] = {
+ { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ { -1, 0 }
+};
+
+/* bus softc */
+struct rcons_softc {
+ struct resource *res[1];
+ void *ihl[1];
+ device_t dev;
+};
+
+/* CN Console interface */
+
static tsw_outwakeup_t riscvtty_outwakeup;
static struct ttydevsw riscv_ttydevsw = {
@@ -86,8 +111,6 @@ CONSOLE_DRIVER(riscv);
#define MAX_BURST_LEN 1
#define QUEUE_SIZE 256
-#define CONSOLE_DEFAULT_ID 1ul
-#define SPIN_IN_MACHINE_MODE 1
struct queue_entry {
uint64_t data;
@@ -102,13 +125,8 @@ struct queue_entry *entry_served;
static void
riscv_putc(int c)
{
- uint64_t cmd;
- cmd = (HTIF_CMD_WRITE << HTIF_CMD_SHIFT);
- cmd |= (CONSOLE_DEFAULT_ID << HTIF_DEV_ID_SHIFT);
- cmd |= c;
-
- machine_command(ECALL_HTIF_CMD, cmd);
+ sbi_console_putchar(c);
}
#ifdef EARLY_PRINTF
@@ -215,39 +233,23 @@ riscv_cnungrab(struct consdev *cp)
static int
riscv_cngetc(struct consdev *cp)
{
-#if defined(KDB)
- uint64_t devcmd;
- uint64_t entry;
- uint64_t devid;
-#endif
- uint64_t cmd;
uint8_t data;
int ch;
- cmd = (HTIF_CMD_READ << HTIF_CMD_SHIFT);
- cmd |= (CONSOLE_DEFAULT_ID << HTIF_DEV_ID_SHIFT);
-
- machine_command(ECALL_HTIF_CMD_REQ, cmd);
-
#if defined(KDB)
+ /*
+ * RISCVTODO: BBL polls for console data on timer interrupt,
+ * but interrupts are turned off in KDB.
+ * So we currently do not have console in KDB.
+ */
if (kdb_active) {
+ ch = sbi_console_getchar();
+ while (ch) {
+ entry_last->data = ch;
+ entry_last->used = 1;
+ entry_last = entry_last->next;
- entry = machine_command(ECALL_HTIF_CMD_RESP, 0);
- while (entry) {
- devid = HTIF_DEV_ID(entry);
- devcmd = HTIF_DEV_CMD(entry);
- data = HTIF_DEV_DATA(entry);
-
- if (devid == CONSOLE_DEFAULT_ID && devcmd == 0) {
- entry_last->data = data;
- entry_last->used = 1;
- entry_last = entry_last->next;
- } else {
- printf("Lost interrupt: devid %d\n",
- devid);
- }
-
- entry = machine_command(ECALL_HTIF_CMD_RESP, 0);
+ ch = sbi_console_getchar();
}
}
#endif
@@ -275,75 +277,83 @@ riscv_cnputc(struct consdev *cp, int c)
riscv_putc(c);
}
-/*
- * Bus interface.
- */
+/* Bus interface */
-struct htif_console_softc {
- device_t dev;
- int running;
- int intr_chan;
- int cmd_done;
- int curtag;
- int index;
-};
-
-static void
-htif_console_intr(void *arg, uint64_t entry)
+static int
+rcons_intr(void *arg)
{
- struct htif_console_softc *sc;
- uint8_t devcmd;
- uint64_t data;
+ int c;
- sc = arg;
-
- devcmd = HTIF_DEV_CMD(entry);
- data = HTIF_DEV_DATA(entry);
-
- if (devcmd == 0) {
- entry_last->data = data;
+ c = sbi_console_getchar();
+ if (c > 0 && c < 0xff) {
+ entry_last->data = c;
entry_last->used = 1;
entry_last = entry_last->next;
}
+
+ csr_clear(sip, SIP_SSIP);
+
+ return (FILTER_HANDLED);
}
static int
-htif_console_probe(device_t dev)
+rcons_probe(device_t dev)
{
- return (0);
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (!ofw_bus_is_compatible(dev, "riscv,console"))
+ return (ENXIO);
+
+ device_set_desc(dev, "RISC-V console");
+ return (BUS_PROBE_DEFAULT);
}
static int
-htif_console_attach(device_t dev)
+rcons_attach(device_t dev)
{
- struct htif_console_softc *sc;
+ struct rcons_softc *sc;
+ int error;
sc = device_get_softc(dev);
sc->dev = dev;
- sc->index = htif_get_index(dev);
- if (sc->index < 0)
- return (EINVAL);
+ if (bus_alloc_resources(dev, rcons_spec, sc->res)) {
+ device_printf(dev, "could not allocate resources\n");
+ return (ENXIO);
+ }
- htif_setup_intr(sc->index, htif_console_intr, sc);
+ /* Setup IRQs handler */
+ error = bus_setup_intr(dev, sc->res[0], INTR_TYPE_CLK,
+ rcons_intr, NULL, sc, &sc->ihl[0]);
+ if (error) {
+ device_printf(dev, "Unable to alloc int resource.\n");
+ return (ENXIO);
+ }
+
+ csr_set(sie, SIE_SSIE);
+
+ bus_generic_attach(sc->dev);
+
+ sbi_console_getchar();
return (0);
}
-static device_method_t htif_console_methods[] = {
- DEVMETHOD(device_probe, htif_console_probe),
- DEVMETHOD(device_attach, htif_console_attach),
+static device_method_t rcons_methods[] = {
+ DEVMETHOD(device_probe, rcons_probe),
+ DEVMETHOD(device_attach, rcons_attach),
+
DEVMETHOD_END
};
-static driver_t htif_console_driver = {
- "htif_console",
- htif_console_methods,
- sizeof(struct htif_console_softc)
+static driver_t rcons_driver = {
+ "rcons",
+ rcons_methods,
+ sizeof(struct rcons_softc)
};
-static devclass_t htif_console_devclass;
+static devclass_t rcons_devclass;
-DRIVER_MODULE(htif_console, htif, htif_console_driver,
- htif_console_devclass, 0, 0);
+DRIVER_MODULE(rcons, simplebus, rcons_driver, rcons_devclass, 0, 0);
diff --git a/sys/riscv/riscv/sbi.S b/sys/riscv/riscv/sbi.S
new file mode 100644
index 00000000000..b5b2916e0f4
--- /dev/null
+++ b/sys/riscv/riscv/sbi.S
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2016 Ruslan Bukin
+ * 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.
+ */
+
+#include
+__FBSDID("$FreeBSD$");
+
+.globl sbi_hart_id; sbi_hart_id = -2048
+.globl sbi_num_harts; sbi_num_harts = -2032
+.globl sbi_query_memory; sbi_query_memory = -2016
+.globl sbi_console_putchar; sbi_console_putchar = -2000
+.globl sbi_console_getchar; sbi_console_getchar = -1984
+.globl sbi_send_ipi; sbi_send_ipi = -1952
+.globl sbi_clear_ipi; sbi_clear_ipi = -1936
+.globl sbi_timebase; sbi_timebase = -1920
+.globl sbi_shutdown; sbi_shutdown = -1904
+.globl sbi_set_timer; sbi_set_timer = -1888
+.globl sbi_mask_interrupt; sbi_mask_interrupt = -1872
+.globl sbi_unmask_interrupt; sbi_unmask_interrupt = -1856
+.globl sbi_remote_sfence_vm; sbi_remote_sfence_vm = -1840
+.globl sbi_remote_sfence_vm_range; sbi_remote_sfence_vm_range = -1824
+.globl sbi_remote_fence_i; sbi_remote_fence_i = -1808
diff --git a/sys/riscv/riscv/timer.c b/sys/riscv/riscv/timer.c
index ae8ec67b6e9..0462e62b1aa 100644
--- a/sys/riscv/riscv/timer.c
+++ b/sys/riscv/riscv/timer.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
+#include
#include
#include
@@ -135,7 +136,7 @@ riscv_tmr_start(struct eventtimer *et, sbintime_t first, sbintime_t period)
cpu = PCPU_GET(cpuid);
WRITE8(sc, TIMER_MTIMECMP(cpu), counts);
csr_set(sie, SIE_STIE);
- machine_command(ECALL_MTIMECMP, counts);
+ sbi_set_timer(counts);
return (0);
}
diff --git a/sys/riscv/riscv/vm_machdep.c b/sys/riscv/riscv/vm_machdep.c
index 1f661307714..d2d4c6e3d3e 100644
--- a/sys/riscv/riscv/vm_machdep.c
+++ b/sys/riscv/riscv/vm_machdep.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
+#include
/*
* Finish a fork operation, with process p2 nearly set up.
@@ -106,9 +107,9 @@ void
cpu_reset(void)
{
- printf("cpu_reset");
- while(1)
- __asm volatile("wfi" ::: "memory");
+ sbi_shutdown();
+
+ while(1);
}
void