MFH
Sponsored by: The FreeBSD Foundation
This commit is contained in:
commit
bd77e66df8
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
||||
|
@ -49,7 +49,7 @@
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x8000000>; /* 128MB at 0x0 */
|
||||
reg = <0x0 0x40000000>; /* 1GB at 0x0 */
|
||||
};
|
||||
|
||||
soc {
|
||||
|
@ -49,7 +49,7 @@
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x8000000>; /* 128MB at 0x0 */
|
||||
reg = <0x0 0x40000000>; /* 1GB at 0x0 */
|
||||
};
|
||||
|
||||
soc {
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -904,6 +904,68 @@ done:
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 |
|
||||
|
@ -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;
|
||||
|
@ -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. */
|
||||
|
@ -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),
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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];
|
||||
|
63
sys/riscv/riscv/stack_machdep.c
Normal file
63
sys/riscv/riscv/stack_machdep.c
Normal 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)
|
||||
{
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user