Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Glen Barber 2016-02-23 16:01:34 +00:00
commit 86b234d2f5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/release-pkg/; revision=295926
34 changed files with 347 additions and 145 deletions

View File

@ -8934,14 +8934,14 @@ elf_create_symbuf (bfd_size_type symcount, Elf_Internal_Sym *isymbuf)
shndx_count++;
ssymbuf = bfd_malloc ((shndx_count + 1) * sizeof (*ssymbuf)
+ (indbufend - indbuf) * sizeof (*ssymbuf));
+ (indbufend - indbuf) * sizeof (*ssym));
if (ssymbuf == NULL)
{
free (indbuf);
return NULL;
}
ssym = (struct elf_symbuf_symbol *) (ssymbuf + shndx_count);
ssym = (struct elf_symbuf_symbol *) (ssymbuf + shndx_count + 1);
ssymbuf->ssym = NULL;
ssymbuf->count = shndx_count;
ssymbuf->st_shndx = 0;

View File

@ -545,13 +545,13 @@ archive_read_open1(struct archive *_a)
static int
choose_filters(struct archive_read *a)
{
int number_bidders, i, bid, best_bid;
int number_bidders, i, bid, best_bid, n;
struct archive_read_filter_bidder *bidder, *best_bidder;
struct archive_read_filter *filter;
ssize_t avail;
int r;
for (;;) {
for (n = 0; n < 25; ++n) {
number_bidders = sizeof(a->bidders) / sizeof(a->bidders[0]);
best_bid = 0;
@ -597,6 +597,9 @@ choose_filters(struct archive_read *a)
return (ARCHIVE_FATAL);
}
}
archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
"Input requires too many filters for decoding");
return (ARCHIVE_FATAL);
}
/*

View File

@ -422,8 +422,10 @@ hdestroy(HTAB *hashp)
if (hashp->tmp_buf)
free(hashp->tmp_buf);
if (hashp->fp != -1)
if (hashp->fp != -1) {
(void)_fsync(hashp->fp);
(void)_close(hashp->fp);
}
free(hashp);
@ -458,6 +460,8 @@ hash_sync(const DB *dbp, u_int32_t flags)
return (0);
if (__buf_free(hashp, 0, 1) || flush_meta(hashp))
return (ERROR);
if (hashp->fp != -1 && _fsync(hashp->fp) != 0)
return (ERROR);
hashp->new_file = 0;
return (0);
}

View File

@ -34,16 +34,9 @@
#include <machine/armreg.h>
#include <machine/sysreg.h>
#if __ARM_ARCH >= 6
#define GET_PCB(tmp) \
mrc CP15_TPIDRPRW(tmp); \
add tmp, tmp, #(TD_PCB)
#else
.Lcurpcb:
.word _C_LABEL(__pcpu) + PC_CURPCB
#define GET_PCB(tmp) \
ldr tmp, .Lcurpcb
#endif
mrc CP15_TPIDRPRW(tmp); \
add tmp, tmp, #(TD_PCB)
/*
* Define cache functions used by startup code, which counts on the fact that

View File

@ -94,7 +94,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_map.h>
#include <vm/vm_extern.h>
#include <machine/acle-compat.h>
#include <machine/cpu.h>
#include <machine/frame.h>
#include <machine/machdep.h>
@ -312,16 +311,13 @@ abort_handler(struct trapframe *tf, int type)
}
/*
* We need to know whether the page should be mapped as R or R/W. On
* armv6 and later the fault status register indicates whether the
* access was a read or write. Prior to armv6, we know that a
* permission fault can only be the result of a write to a read-only
* location, so we can deal with those quickly. Otherwise we need to
* disassemble the faulting instruction to determine if it was a write.
* We need to know whether the page should be mapped as R or R/W.
* On armv4, the fault status register does not indicate whether
* the access was a read or write. We know that a permission fault
* can only be the result of a write to a read-only location, so we
* can deal with those quickly. Otherwise we need to disassemble
* the faulting instruction to determine if it was a write.
*/
#if __ARM_ARCH >= 6
ftype = (fsr & FAULT_WNR) ? VM_PROT_READ | VM_PROT_WRITE : VM_PROT_READ;
#else
if (IS_PERMISSION_FAULT(fsr))
ftype = VM_PROT_WRITE;
else {
@ -338,7 +334,6 @@ abort_handler(struct trapframe *tf, int type)
ftype = VM_PROT_READ;
}
}
#endif
/*
* See if the fault is as a result of ref/mod emulation,

View File

@ -94,6 +94,74 @@ fdt_pic_decode_t fdt_pic_table[] = {
};
#endif
/*
* Fix FDT data related to interrupts.
*
* Driven by the needs of linux and its drivers (as always), the published FDT
* data for imx6 now sets the interrupt parent for most devices to the GPC
* interrupt controller, which is for use when the chip is in deep-sleep mode.
* We don't support deep sleep or have a GPC-PIC driver; we need all interrupts
* to be handled by the GIC.
*
* Luckily, the change to the FDT data was to assign the GPC as the interrupt
* parent for the soc node and letting that get inherited by all other devices
* (except a few that directly name GIC as their interrupt parent). So we can
* set the world right by just changing the interrupt-parent property of the soc
* node to refer to GIC instead of GPC. This will get us by until we write our
* own GPC driver (or until linux changes its mind and the FDT data again).
*
* We validate that we have data that looks like we expect before changing it:
* - SOC node exists and has GPC as its interrupt parent.
* - GPC node exists and has GIC as its interrupt parent.
* - GIC node exists and is its own interrupt parent.
*
* This applies to all models of imx6. Luckily all of them have the devices
* involved at the same addresses on the same busses, so we don't need any
* per-soc logic. We handle this at platform attach time rather than via the
* fdt_fixup_table, because the latter requires matching on the FDT "model"
* property, and this applies to all boards including those not yet invented.
*/
static void
fix_fdt_interrupt_data(void)
{
phandle_t gicipar, gicnode, gicxref;
phandle_t gpcipar, gpcnode, gpcxref;
phandle_t socipar, socnode;
int result;
socnode = OF_finddevice("/soc");
if (socnode == -1)
return;
result = OF_getencprop(socnode, "interrupt-parent", &socipar,
sizeof(socipar));
if (result <= 0)
return;
gicnode = OF_finddevice("/soc/interrupt-controller@00a01000");
if (gicnode == -1)
return;
result = OF_getencprop(gicnode, "interrupt-parent", &gicipar,
sizeof(gicipar));
if (result <= 0)
return;
gicxref = OF_xref_from_node(gicnode);
gpcnode = OF_finddevice("/soc/aips-bus@02000000/gpc@020dc000");
if (gpcnode == -1)
return;
result = OF_getencprop(gpcnode, "interrupt-parent", &gpcipar,
sizeof(gpcipar));
if (result <= 0)
return;
gpcxref = OF_xref_from_node(gpcnode);
if (socipar != gpcxref || gpcipar != gicxref || gicipar != gicxref)
return;
gicxref = cpu_to_fdt32(gicxref);
OF_setprop(socnode, "interrupt-parent", &gicxref, sizeof(gicxref));
}
static vm_offset_t
imx6_lastaddr(platform_t plat)
{
@ -104,6 +172,10 @@ imx6_lastaddr(platform_t plat)
static int
imx6_attach(platform_t plat)
{
/* Fix soc interrupt-parent property. */
fix_fdt_interrupt_data();
/* Inform the MPCore timer driver that its clock is variable. */
arm_tmr_change_frequency(ARM_TMR_FREQUENCY_VARIES);

View File

@ -177,15 +177,12 @@ _RF0(cp15_dfar_get, CP15_DFAR(%0))
_RF0(cp15_ifar_get, CP15_IFAR(%0))
_RF0(cp15_l2ctlr_get, CP15_L2CTLR(%0))
#endif
/* ARMv6+ and XScale */
_RF0(cp15_actlr_get, CP15_ACTLR(%0))
_WF1(cp15_actlr_set, CP15_ACTLR(%0))
#if __ARM_ARCH >= 6
_WF1(cp15_ats1cpr_set, CP15_ATS1CPR(%0))
_WF1(cp15_ats1cpw_set, CP15_ATS1CPW(%0))
_RF0(cp15_par_get, CP15_PAR(%0))
_RF0(cp15_sctlr_get, CP15_SCTLR(%0))
#endif
/*CPU id registers */
_RF0(cp15_midr_get, CP15_MIDR(%0))

View File

@ -103,6 +103,7 @@ device mii
device miibus # MII bus support
device em # Intel PRO/1000 Gigabit Ethernet Family
device igb # Intel PRO/1000 PCIE Server Gigabit Family
device ix # Intel 10Gb Ethernet Family
device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet
device vnic # Cavium ThunderX NIC

View File

@ -49,7 +49,7 @@
memory {
device_type = "memory";
reg = <0x0 0x8000000>; /* 128MB at 0x0 */
reg = <0x0 0x40000000>; /* 1GB at 0x0 */
};
soc {

View File

@ -49,7 +49,7 @@
memory {
device_type = "memory";
reg = <0x0 0x8000000>; /* 128MB at 0x0 */
reg = <0x0 0x40000000>; /* 1GB at 0x0 */
};
soc {

View File

@ -108,9 +108,19 @@ get_env_net_params()
char *envstr;
in_addr_t rootaddr, serveraddr;
/* Silently get out right away if we don't have rootpath. */
if (ub_env_get("rootpath") == NULL)
/*
* Silently get out right away if we don't have rootpath, because none
* of the other info we obtain below is sufficient to boot without it.
*
* If we do have rootpath, copy it into the global var and also set
* dhcp.root-path in the env. If we don't get all the other info from
* the u-boot env below, we will still try dhcp/bootp, but the server-
* provided path will not replace the user-provided value we set here.
*/
if ((envstr = ub_env_get("rootpath")) == NULL)
return;
strlcpy(rootpath, envstr, sizeof(rootpath));
setenv("dhcp.root-path", rootpath, 0);
/*
* Our own IP address must be valid. Silently get out if it's not set,
@ -154,9 +164,6 @@ get_env_net_params()
* There must be a rootpath. It may be ip:/path or it may be just the
* path in which case the ip needs to be in serverip.
*/
if ((envstr = ub_env_get("rootpath")) == NULL)
return;
strncpy(rootpath, envstr, sizeof(rootpath) - 1);
rootaddr = net_parse_rootpath();
if (rootaddr == INADDR_NONE)
rootaddr = serveraddr;

View File

@ -35,18 +35,26 @@ __FBSDID("$FreeBSD$");
/* Converts CloudABI's memory protection flags to FreeBSD's. */
static int
convert_mprot(cloudabi_mprot_t in)
convert_mprot(cloudabi_mprot_t in, int *out)
{
int out;
out = 0;
/* Unknown protection flags. */
if ((in & ~(CLOUDABI_PROT_EXEC | CLOUDABI_PROT_WRITE |
CLOUDABI_PROT_READ)) != 0)
return (ENOTSUP);
/* W^X: Write and exec cannot be enabled at the same time. */
if ((in & (CLOUDABI_PROT_EXEC | CLOUDABI_PROT_WRITE)) ==
(CLOUDABI_PROT_EXEC | CLOUDABI_PROT_WRITE))
return (ENOTSUP);
*out = 0;
if (in & CLOUDABI_PROT_EXEC)
out |= PROT_EXEC;
*out |= PROT_EXEC;
if (in & CLOUDABI_PROT_WRITE)
out |= PROT_WRITE;
*out |= PROT_WRITE;
if (in & CLOUDABI_PROT_READ)
out |= PROT_READ;
return (out);
*out |= PROT_READ;
return (0);
}
int
@ -98,10 +106,10 @@ cloudabi_sys_mem_map(struct thread *td, struct cloudabi_sys_mem_map_args *uap)
struct mmap_args mmap_args = {
.addr = uap->addr,
.len = uap->len,
.prot = convert_mprot(uap->prot),
.fd = uap->fd,
.pos = uap->off
};
int error;
/* Translate flags. */
if (uap->flags & CLOUDABI_MAP_ANON)
@ -113,6 +121,11 @@ cloudabi_sys_mem_map(struct thread *td, struct cloudabi_sys_mem_map_args *uap)
if (uap->flags & CLOUDABI_MAP_SHARED)
mmap_args.flags |= MAP_SHARED;
/* Translate protection. */
error = convert_mprot(uap->prot, &mmap_args.prot);
if (error != 0)
return (error);
return (sys_mmap(td, &mmap_args));
}
@ -123,8 +136,13 @@ cloudabi_sys_mem_protect(struct thread *td,
struct mprotect_args mprotect_args = {
.addr = uap->addr,
.len = uap->len,
.prot = convert_mprot(uap->prot),
};
int error;
/* Translate protection. */
error = convert_mprot(uap->prot, &mprotect_args.prot);
if (error != 0)
return (error);
return (sys_mprotect(td, &mprotect_args));
}

View File

@ -34,9 +34,10 @@ 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/stack_machdep.c optional ddb | stack
riscv/riscv/support.S standard
riscv/riscv/swtch.S standard
riscv/riscv/sys_machdep.c standard
riscv/riscv/trap.c standard
riscv/riscv/timer.c standard
riscv/riscv/uio_machdep.c standard

View File

@ -222,10 +222,9 @@ _MKDEPCC:= ${CC:N${CCACHE_BIN}}
SRCS= assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
${MFILES:T:S/.m$/.h/}
DEPENDFILES= .depend
DEPENDFILES= .depend .depend.*
.if ${MK_FAST_DEPEND} == "yes" && \
(${.MAKE.MODE:Unormal:Mmeta} == "" || ${.MAKE.MODE:Unormal:Mnofilemon} != "")
DEPENDFILES+= .depend.*
DEPEND_CFLAGS+= -MD -MP -MF.depend.${.TARGET}
DEPEND_CFLAGS+= -MT${.TARGET}
.if defined(.PARSEDIR)

View File

@ -3193,9 +3193,11 @@ em_setup_interface(device_t dev, struct adapter *adapter)
if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
if_setioctlfn(ifp, em_ioctl);
if_setgetcounterfn(ifp, em_get_counter);
/* TSO parameters */
ifp->if_hw_tsomax = IP_MAXPACKET;
ifp->if_hw_tsomaxsegcount = EM_MAX_SCATTER;
/* Take m_pullup(9)'s in em_xmit() w/ TSO into acount. */
ifp->if_hw_tsomaxsegcount = EM_MAX_SCATTER - 5;
ifp->if_hw_tsomaxsegsize = EM_TSO_SEG_SIZE;
#ifdef EM_MULTIQUEUE

View File

@ -269,7 +269,7 @@
#define HW_DEBUGOUT1(S, A) if (DEBUG_HW) printf(S "\n", A)
#define HW_DEBUGOUT2(S, A, B) if (DEBUG_HW) printf(S "\n", A, B)
#define EM_MAX_SCATTER 64
#define EM_MAX_SCATTER 40
#define EM_VFTA_SIZE 128
#define EM_TSO_SIZE (65535 + sizeof(struct ether_vlan_header))
#define EM_TSO_SEG_SIZE 4096 /* Max dma segment size */

View File

@ -3139,6 +3139,12 @@ igb_setup_interface(device_t dev, struct adapter *adapter)
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = igb_ioctl;
ifp->if_get_counter = igb_get_counter;
/* TSO parameters */
ifp->if_hw_tsomax = IP_MAXPACKET;
ifp->if_hw_tsomaxsegcount = IGB_MAX_SCATTER;
ifp->if_hw_tsomaxsegsize = IGB_TSO_SEG_SIZE;
#ifndef IGB_LEGACY_TX
ifp->if_transmit = igb_mq_start;
ifp->if_qflush = igb_qflush;

View File

@ -278,7 +278,7 @@
#define HW_DEBUGOUT1(S, A) if (DEBUG_HW) printf(S "\n", A)
#define HW_DEBUGOUT2(S, A, B) if (DEBUG_HW) printf(S "\n", A, B)
#define IGB_MAX_SCATTER 64
#define IGB_MAX_SCATTER 40
#define IGB_VFTA_SIZE 128
#define IGB_BR_SIZE 4096 /* ring buf size */
#define IGB_TSO_SIZE (65535 + sizeof(struct ether_vlan_header))

View File

@ -236,10 +236,8 @@
#define HW_DEBUGOUT1(S, A) if (DEBUG_HW) printf(S "\n", A)
#define HW_DEBUGOUT2(S, A, B) if (DEBUG_HW) printf(S "\n", A, B)
#define EM_MAX_SCATTER 64
#define EM_MAX_SCATTER 40
#define EM_VFTA_SIZE 128
#define EM_TSO_SIZE (65535 + sizeof(struct ether_vlan_header))
#define EM_TSO_SEG_SIZE 4096 /* Max dma segment size */
#define EM_MSIX_MASK 0x01F00000 /* For 82574 use */
#define ETH_ZLEN 60
#define ETH_ADDR_LEN 6

View File

@ -904,6 +904,68 @@ hn_encap(struct hn_tx_ring *txr, struct hn_txdesc *txd, struct mbuf **m_head0)
return 0;
}
/*
* NOTE:
* If this function fails, then txd will be freed, but the mbuf
* associated w/ the txd will _not_ be freed.
*/
static int
hn_send_pkt(struct ifnet *ifp, struct hv_device *device_ctx,
struct hn_tx_ring *txr, struct hn_txdesc *txd)
{
int error, send_failed = 0;
again:
/*
* Make sure that txd is not freed before ETHER_BPF_MTAP.
*/
hn_txdesc_hold(txd);
error = hv_nv_on_send(device_ctx, &txd->netvsc_pkt);
if (!error) {
ETHER_BPF_MTAP(ifp, txd->m);
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
}
hn_txdesc_put(txr, txd);
if (__predict_false(error)) {
int freed;
/*
* This should "really rarely" happen.
*
* XXX Too many RX to be acked or too many sideband
* commands to run? Ask netvsc_channel_rollup()
* to kick start later.
*/
txr->hn_has_txeof = 1;
if (!send_failed) {
txr->hn_send_failed++;
send_failed = 1;
/*
* Try sending again after set hn_has_txeof;
* in case that we missed the last
* netvsc_channel_rollup().
*/
goto again;
}
if_printf(ifp, "send failed\n");
/*
* Caller will perform further processing on the
* associated mbuf, so don't free it in hn_txdesc_put();
* only unload it from the DMA map in hn_txdesc_put(),
* if it was loaded.
*/
txd->m = NULL;
freed = hn_txdesc_put(txr, txd);
KASSERT(freed != 0,
("fail to free txd upon send error"));
txr->hn_send_failed++;
}
return error;
}
/*
* Start a transmit of one or more packets
*/
@ -922,9 +984,9 @@ hn_start_locked(struct hn_tx_ring *txr, int len)
return 0;
while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
int error, send_failed = 0;
struct hn_txdesc *txd;
struct mbuf *m_head;
int error;
IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
if (m_head == NULL)
@ -936,14 +998,14 @@ hn_start_locked(struct hn_tx_ring *txr, int len)
* dispatch this packet sending (and sending of any
* following up packets) to tx taskqueue.
*/
IF_PREPEND(&ifp->if_snd, m_head);
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
return 1;
}
txd = hn_txdesc_get(txr);
if (txd == NULL) {
txr->hn_no_txdescs++;
IF_PREPEND(&ifp->if_snd, m_head);
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
atomic_set_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
break;
}
@ -953,53 +1015,11 @@ hn_start_locked(struct hn_tx_ring *txr, int len)
/* Both txd and m_head are freed */
continue;
}
again:
/*
* Make sure that txd is not freed before ETHER_BPF_MTAP.
*/
hn_txdesc_hold(txd);
error = hv_nv_on_send(device_ctx, &txd->netvsc_pkt);
if (!error) {
ETHER_BPF_MTAP(ifp, m_head);
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
}
hn_txdesc_put(txr, txd);
error = hn_send_pkt(ifp, device_ctx, txr, txd);
if (__predict_false(error)) {
int freed;
/*
* This should "really rarely" happen.
*
* XXX Too many RX to be acked or too many sideband
* commands to run? Ask netvsc_channel_rollup()
* to kick start later.
*/
txr->hn_has_txeof = 1;
if (!send_failed) {
txr->hn_send_failed++;
send_failed = 1;
/*
* Try sending again after set hn_has_txeof;
* in case that we missed the last
* netvsc_channel_rollup().
*/
goto again;
}
if_printf(ifp, "send failed\n");
/*
* This mbuf will be prepended, don't free it
* in hn_txdesc_put(); only unload it from the
* DMA map in hn_txdesc_put(), if it was loaded.
*/
txd->m = NULL;
freed = hn_txdesc_put(txr, txd);
KASSERT(freed != 0,
("fail to free txd upon send error"));
txr->hn_send_failed++;
IF_PREPEND(&ifp->if_snd, m_head);
/* txd is freed, but m_head is not */
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
atomic_set_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
break;
}

View File

@ -810,8 +810,8 @@ hv_storvsc_rescan_target(struct storvsc_softc *sc)
if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, targetid,
CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
printf("unable to create path for rescan, pathid: %d,"
"targetid: %d\n", pathid, targetid);
printf("unable to create path for rescan, pathid: %u,"
"targetid: %u\n", pathid, targetid);
xpt_free_ccb(ccb);
return;
}

View File

@ -54,10 +54,6 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart_cpu.h>
#include <dev/uart/uart_cpu_fdt.h>
#ifdef __aarch64__
extern bus_space_tag_t fdtbus_bs_tag;
#endif
/*
* UART console routines.
*/
@ -136,9 +132,6 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
char *cp;
int err;
uart_bus_space_mem = fdtbus_bs_tag;
uart_bus_space_io = NULL;
/* Allow overriding the FDT using the environment. */
class = &uart_ns8250_class;
err = uart_getenv(devtype, di, class);
@ -195,10 +188,8 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
if (uart_fdt_get_shift(node, &shift) != 0)
shift = uart_getregshift(class);
if (OF_getprop(node, "current-speed", &br, sizeof(br)) <= 0)
if (OF_getencprop(node, "current-speed", &br, sizeof(br)) <= 0)
br = 0;
else
br = fdt32_to_cpu(br);
/*
* Finalize configuration.
@ -212,5 +203,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
di->stopbits = 1;
di->parity = UART_PARITY_NONE;
return (OF_decode_addr(node, 0, &di->bas.bst, &di->bas.bsh, NULL));
err = OF_decode_addr(node, 0, &di->bas.bst, &di->bas.bsh, NULL);
uart_bus_space_mem = di->bas.bst;
uart_bus_space_io = NULL;
return (err);
}

View File

@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/conf.h>
#include <machine/bus.h>
#include <machine/fdt.h>
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
@ -49,9 +48,9 @@ __FBSDID("$FreeBSD$");
static bus_space_handle_t bsh_clkpwr;
#define lpc_ns8250_get_clkreg(_bas, _reg) \
bus_space_read_4(fdtbus_bs_tag, bsh_clkpwr, (_reg))
bus_space_read_4((_bas)->bst, bsh_clkpwr, (_reg))
#define lpc_ns8250_set_clkreg(_bas, _reg, _val) \
bus_space_write_4(fdtbus_bs_tag, bsh_clkpwr, (_reg), (_val))
bus_space_write_4((_bas)->bst, bsh_clkpwr, (_reg), (_val))
/*
* Clear pending interrupts. THRE is cleared by reading IIR. Data
@ -292,7 +291,7 @@ lpc_ns8250_init(struct uart_bas *bas, int baudrate, int databits, int stopbits,
u_long clkmode;
/* Enable UART clock */
bus_space_map(fdtbus_bs_tag, LPC_CLKPWR_PHYS_BASE, LPC_CLKPWR_SIZE, 0,
bus_space_map(bas->bst, LPC_CLKPWR_PHYS_BASE, LPC_CLKPWR_SIZE, 0,
&bsh_clkpwr);
clkmode = lpc_ns8250_get_clkreg(bas, LPC_UART_CLKMODE);
lpc_ns8250_set_clkreg(bas, LPC_UART_CLKMODE, clkmode |

View File

@ -354,7 +354,8 @@ hid_get_item(struct hid_data *s, struct hid_item *h)
/* range check usage count */
if (c->loc.count > 255) {
DPRINTFN(0, "Number of "
"items truncated to 255\n");
"items(%u) truncated to 255\n",
(unsigned)(c->loc.count));
s->ncount = 255;
} else
s->ncount = c->loc.count;

View File

@ -835,6 +835,7 @@ product ABOCOM RT2573_4 0xb21e RT2573
product ABOCOM RTL8188CU_1 0x8188 RTL8188CU
product ABOCOM RTL8188CU_2 0x8189 RTL8188CU
product ABOCOM RTL8192CU 0x8178 RTL8192CU
product ABOCOM RTL8188EU 0x8179 RTL8188EU
product ABOCOM WUG2700 0xb21f WUG2700
/* Acton Research Corp. */

View File

@ -176,6 +176,7 @@ static const STRUCT_USB_HOST_ID urtwn_devs[] = {
URTWN_DEV(TRENDNET, RTL8192CU),
URTWN_DEV(ZYXEL, RTL8192CU),
/* URTWN_RTL8188E */
URTWN_RTL8188E_DEV(ABOCOM, RTL8188EU),
URTWN_RTL8188E_DEV(DLINK, DWA123D1),
URTWN_RTL8188E_DEV(DLINK, DWA125D1),
URTWN_RTL8188E_DEV(ELECOM, WDC150SU2M),

View File

@ -157,7 +157,8 @@ law_find_free(void)
return (i);
}
#define _LAW_SR(trgt,size) (0x80000000 | (trgt << 20) | (ffsl(size) - 2))
#define _LAW_SR(trgt,size) (0x80000000 | (trgt << 20) | \
(flsl(size + (size - 1)) - 2))
int
law_enable(int trgt, uint64_t bar, uint32_t size)

View File

@ -399,10 +399,6 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val)
*p = val;
}
#define atomic_add_acq_int atomic_add_acq_32
#define atomic_clear_acq_int atomic_clear_acq_32
#define atomic_cmpset_acq_int atomic_cmpset_acq_32
#define atomic_add_acq_long atomic_add_acq_64
#define atomic_clear_acq_long atomic_add_acq_64
#define atomic_cmpset_acq_long atomic_cmpset_acq_64

View File

@ -555,7 +555,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
tf->tf_ra = (register_t)(sysent->sv_psstrings -
*(sysent->sv_szsigcode));
CTR3(KTR_SIG, "sendsig: return td=%p pc=%#x sp=%#x", td, tf->tf_elr,
CTR3(KTR_SIG, "sendsig: return td=%p pc=%#x sp=%#x", td, tf->tf_sepc,
tf->tf_sp);
PROC_LOCK(p);
@ -729,9 +729,13 @@ 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;
uint32_t memsize;
caddr_t kmdp;
int i;
/* Set the module data location */
lastaddr = fake_preload_metadata(rvbp);
@ -752,11 +756,12 @@ initriscv(struct riscv_bootparams *rvbp)
/* Load the physical memory ranges */
physmap_idx = 0;
/*
* RISCVTODO: figure out whether platform provides ranges,
* or grab from FDT.
*/
add_physmap_entry(0, 0x8000000, physmap, &physmap_idx);
/* Grab physical memory regions information from device tree. */
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, &memsize) != 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);
/* Set the pcpu data, this is needed by pmap_bootstrap */
pcpup = &__pcpu[0];

View File

@ -0,0 +1,63 @@
/*-
* Copyright (c) 2016 Ruslan Bukin <br@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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/stack.h>
#include <machine/vmparam.h>
#include <machine/pcb.h>
void
stack_save_td(struct stack *st, struct thread *td)
{
}
int
stack_save_td_running(struct stack *st, struct thread *td)
{
return (EOPNOTSUPP);
}
void
stack_save(struct stack *st)
{
}

View File

@ -145,8 +145,9 @@ riscv_tmr_intr(void *arg)
/*
* Clear interrupt pending bit.
* Note sip register is unimplemented in Spike simulator,
* so use machine command to clear in mip.
* Note: SIP_STIP bit is not implemented in sip register
* in Spike simulator, so use machine command to clear
* interrupt pending bit in mip.
*/
machine_command(ECALL_CLEAR_PENDING, 0);

View File

@ -270,6 +270,17 @@ do_trap_supervisor(struct trapframe *frame)
case EXCP_INSTR_ACCESS_FAULT:
data_abort(frame, 0);
break;
case EXCP_INSTR_BREAKPOINT:
#ifdef KDB
kdb_trap(exception, 0, frame);
#else
dump_regs(frame);
panic("No debugger in kernel.\n");
#endif
case EXCP_INSTR_ILLEGAL:
dump_regs(frame);
panic("Illegal instruction at %x\n", frame->tf_sepc);
break;
default:
dump_regs(frame);
panic("Unknown kernel exception %x badaddr %lx\n",
@ -281,6 +292,10 @@ void
do_trap_user(struct trapframe *frame)
{
uint64_t exception;
struct thread *td;
td = curthread;
td->td_frame = frame;
exception = (frame->tf_scause & EXCP_MASK);
if (frame->tf_scause & EXCP_INTR) {
@ -302,6 +317,14 @@ do_trap_user(struct trapframe *frame)
frame->tf_sepc += 4; /* Next instruction */
svc_handler(frame);
break;
case EXCP_INSTR_ILLEGAL:
call_trapsignal(td, SIGILL, ILL_ILLTRP, (void *)frame->tf_sepc);
userret(td, frame);
break;
case EXCP_INSTR_BREAKPOINT:
call_trapsignal(td, SIGTRAP, TRAP_BRKPT, (void *)frame->tf_sepc);
userret(td, frame);
break;
default:
dump_regs(frame);
panic("Unknown userland exception %x badaddr %lx\n",

View File

@ -797,7 +797,7 @@ devstats(int perf_select, long double etime, int havelast)
long double total_mb, blocks_per_second, total_duration;
long double ms_per_other, ms_per_read, ms_per_write, ms_per_transaction;
int firstline = 1;
char *devname;
char *devicename;
if (xflag > 0) {
printf(" extended device statistics ");
@ -871,7 +871,7 @@ devstats(int perf_select, long double etime, int havelast)
}
if (xflag > 0) {
if (asprintf(&devname, "%s%d",
if (asprintf(&devicename, "%s%d",
cur.dinfo->devices[di].device_name,
cur.dinfo->devices[di].unit_number) == -1)
err(1, "asprintf");
@ -887,7 +887,7 @@ devstats(int perf_select, long double etime, int havelast)
printf("%-8.8s %5d %5d %8.1Lf "
"%8.1Lf %5d %5d %5d %5d "
"%4" PRIu64 " %3.0Lf ",
devname,
devicename,
(int)transfers_per_second_read,
(int)transfers_per_second_write,
mb_per_second_read * 1024,
@ -900,7 +900,7 @@ devstats(int perf_select, long double etime, int havelast)
printf("%-8.8s %11.1Lf %11.1Lf "
"%12.1Lf %12.1Lf %4" PRIu64
" %10.1Lf %9.1Lf ",
devname,
devicename,
(long double)total_transfers_read,
(long double)total_transfers_write,
(long double)
@ -925,7 +925,7 @@ devstats(int perf_select, long double etime, int havelast)
}
printf("\n");
}
free(devname);
free(devicename);
} else if (oflag > 0) {
int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
@ -979,15 +979,15 @@ static void
cpustats(void)
{
int state;
double time;
double cptime;
time = 0.0;
cptime = 0.0;
for (state = 0; state < CPUSTATES; ++state)
time += cur.cp_time[state];
cptime += cur.cp_time[state];
for (state = 0; state < CPUSTATES; ++state)
printf(" %2.0f",
rint(100. * cur.cp_time[state] / (time ? time : 1)));
rint(100. * cur.cp_time[state] / (cptime ? cptime : 1)));
}
static int

View File

@ -228,14 +228,14 @@ main(int argc, char *argv[])
clean = FILE_INSECURE;
cp(buf2, buf, PERM_INSECURE);
dp = dbopen(buf,
O_RDWR|O_EXCL|O_SYNC, PERM_INSECURE, DB_HASH, &openinfo);
O_RDWR|O_EXCL, PERM_INSECURE, DB_HASH, &openinfo);
if (dp == NULL)
error(buf);
clean = FILE_SECURE;
cp(sbuf2, sbuf, PERM_SECURE);
sdp = dbopen(sbuf,
O_RDWR|O_EXCL|O_SYNC, PERM_SECURE, DB_HASH, &openinfo);
O_RDWR|O_EXCL, PERM_SECURE, DB_HASH, &openinfo);
if (sdp == NULL)
error(sbuf);
@ -292,13 +292,13 @@ main(int argc, char *argv[])
method = 0;
} else {
dp = dbopen(buf,
O_RDWR|O_CREAT|O_EXCL|O_SYNC, PERM_INSECURE, DB_HASH, &openinfo);
O_RDWR|O_CREAT|O_EXCL, PERM_INSECURE, DB_HASH, &openinfo);
if (dp == NULL)
error(buf);
clean = FILE_INSECURE;
sdp = dbopen(sbuf,
O_RDWR|O_CREAT|O_EXCL|O_SYNC, PERM_SECURE, DB_HASH, &openinfo);
O_RDWR|O_CREAT|O_EXCL, PERM_SECURE, DB_HASH, &openinfo);
if (sdp == NULL)
error(sbuf);
clean = FILE_SECURE;