Date: Sat, 1 Feb 2020 22:07:37 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r357390 - in projects/clang1000-import: include lib/libc/stdlib share/man/man4 sys/compat/linux sys/dev/tpm sys/fs/devfs sys/fs/pseudofs sys/fs/tmpfs sys/kern sys/riscv/sifive sys/sys s... Message-ID: <202002012207.011M7b8K005558@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Sat Feb 1 22:07:37 2020 New Revision: 357390 URL: https://svnweb.freebsd.org/changeset/base/357390 Log: Merge ^/head r357368 through r357388. Modified: projects/clang1000-import/include/stdlib.h projects/clang1000-import/lib/libc/stdlib/Symbol.map projects/clang1000-import/lib/libc/stdlib/rand.3 projects/clang1000-import/lib/libc/stdlib/rand.c projects/clang1000-import/lib/libc/stdlib/random.3 projects/clang1000-import/lib/libc/stdlib/random.c projects/clang1000-import/lib/libc/stdlib/random.h projects/clang1000-import/share/man/man4/hwpstate_intel.4 projects/clang1000-import/sys/compat/linux/linux_getcwd.c projects/clang1000-import/sys/dev/tpm/tpm_crb.c projects/clang1000-import/sys/dev/tpm/tpm_tis.c projects/clang1000-import/sys/fs/devfs/devfs_vnops.c projects/clang1000-import/sys/fs/pseudofs/pseudofs_vnops.c projects/clang1000-import/sys/fs/tmpfs/tmpfs_vnops.c projects/clang1000-import/sys/kern/kern_sig.c projects/clang1000-import/sys/kern/vfs_cache.c projects/clang1000-import/sys/kern/vfs_default.c projects/clang1000-import/sys/kern/vnode_if.src projects/clang1000-import/sys/riscv/sifive/fu540_prci.c projects/clang1000-import/sys/sys/syscallsubr.h projects/clang1000-import/sys/sys/vnode.h projects/clang1000-import/sys/vm/vm_page.c projects/clang1000-import/sys/vm/vm_page.h projects/clang1000-import/sys/x86/cpufreq/hwpstate_intel.c projects/clang1000-import/sys/x86/include/specialreg.h projects/clang1000-import/sys/x86/x86/identcpu.c projects/clang1000-import/tests/sys/net/if_epair.c Directory Properties: projects/clang1000-import/ (props changed) Modified: projects/clang1000-import/include/stdlib.h ============================================================================== --- projects/clang1000-import/include/stdlib.h Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/include/stdlib.h Sat Feb 1 22:07:37 2020 (r357390) @@ -73,7 +73,11 @@ typedef struct { #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 -#define RAND_MAX 0x7ffffffd +/* + * I.e., INT_MAX; rand(3) returns a signed integer but must produce output in + * the range [0, RAND_MAX], so half of the possible output range is unused. + */ +#define RAND_MAX 0x7fffffff __BEGIN_DECLS #ifdef _XLOCALE_H_ Modified: projects/clang1000-import/lib/libc/stdlib/Symbol.map ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/Symbol.map Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/Symbol.map Sat Feb 1 22:07:37 2020 (r357390) @@ -54,8 +54,6 @@ FBSD_1.0 { radixsort; sradixsort; rand_r; - rand; - srand; srandom; srandomdev; initstate; @@ -125,6 +123,8 @@ FBSD_1.5 { FBSD_1.6 { qsort_s; + rand; + srand; }; FBSDprivate_1.0 { Modified: projects/clang1000-import/lib/libc/stdlib/rand.3 ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/rand.3 Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/rand.3 Sat Feb 1 22:07:37 2020 (r357390) @@ -32,7 +32,7 @@ .\" @(#)rand.3 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd December 14, 2019 +.Dd February 1, 2020 .Dt RAND 3 .Os .Sh NAME @@ -59,49 +59,52 @@ Applications which require unpredictable random number instead. .Ef .Pp -These interfaces are obsoleted by -.Xr random 3 . -.Pp The .Fn rand function computes a sequence of pseudo-random integers in the range of 0 to -.Dv RAND_MAX -(as defined by the header file -.In stdlib.h ) . +.Dv RAND_MAX , +inclusive. .Pp The .Fn srand -function sets its argument +function seeds the algorithm with the .Fa seed -as the seed for a new sequence of -pseudo-random numbers to be returned by -.Fn rand . -These sequences are repeatable by calling +parameter. +Repeatable sequences of +.Fn rand +output may be obtained by calling .Fn srand -with the same seed value. +with the same +.Fa seed . +.Fn rand +is implicitly initialized as if +.Fn srand "1" +had been invoked explicitly. .Pp -If no -.Fa seed -value is provided, the functions are automatically -seeded with a value of 1. -.Pp -The +In +.Fx 13 , +.Fn rand +is implemented using the same 128-byte state LFSR generator algorithm as +.Xr random 3 . +However, the legacy .Fn rand_r -function -provides the same functionality as -.Fn rand . -A pointer to the context value -.Fa ctx -must be supplied by the caller. -.Pp -For better generator quality, use -.Xr random 3 -or -.Xr lrand48 3 . +function is not (and can not be, because of its limited +.Fa *ctx +size). +.Fn rand_r +implements the historical, poor-quality Park-Miller 32-bit LCG and should not +be used in new designs. +.Sh IMPLEMENTATION NOTES +Since +.Fx 13 , +.Fn rand +is implemented with the same generator as +.Xr random 3 , +so the low-order bits should no longer be significantly worse than the +high-order bits. .Sh SEE ALSO .Xr arc4random 3 , -.Xr lrand48 3 , .Xr random 3 , .Xr random 4 .Sh STANDARDS @@ -115,5 +118,32 @@ conform to .Pp The .Fn rand_r -function is marked as obsolescent in POSIX and may be removed in a future -revision of the standard. +function is not part of +.St -isoC +and is marked obsolescent in +.St -p1003.1-2008 . +It may be removed in a future revision of POSIX. +.Sh CAVEATS +Prior to +.Fx 13 , +.Fn rand +used the historical Park-Miller generator with 32 bits of state and produced +poor quality output, especially in the lower bits. +.Fn rand +in earlier versions of +.Fx , +as well as other standards-conforming implementations, may continue to produce +poor quality output. +.Pp +.Em These functions should not be used in portable applications that want a +.Em high quality or high performance pseudorandom number generator . +One possible replacement, +.Xr random 3 , +is portable to Linux — but it is not especially fast, nor standardized. +.Pp +If broader portability or better performance is desired, any of the widely +available and permissively licensed SFC64/32, JSF64/32, PCG64/32, or SplitMix64 +algorithm implementations may be embedded in your application. +These algorithms have the benefit of requiring less space than +.Xr random 3 +and being quite fast (in header inline implementations). Modified: projects/clang1000-import/lib/libc/stdlib/rand.c ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/rand.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/rand.c Sat Feb 1 22:07:37 2020 (r357390) @@ -40,11 +40,60 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" #include <sys/param.h> #include <sys/sysctl.h> +#include <assert.h> #include <stdbool.h> #include <stdlib.h> #include <syslog.h> #include "un-namespace.h" +#include "random.h" + +/* + * Implement rand(3), the standard C PRNG API, using the non-standard but + * higher quality random(3) implementation and the same size 128-byte state + * LFSR as the random(3) default. + * + * It turns out there are portable applications that want a PRNG but are too + * lazy to use better-but-nonstandard interfaces like random(3), when + * available, and too lazy to import higher-quality and faster PRNGs into their + * codebase (such as any of SFC, JSF, 128-bit LCGs, PCG, or Splitmix64). + * + * Since we're stuck with rand(3) due to the C standard, we can at least have + * it produce a relatively good PRNG sequence using our existing random(3) + * LFSR. The random(3) design is not particularly fast nor compact, but it has + * the advantage of being the one already in the tree. + */ +static struct __random_state *rand3_state; + +static void +initialize_rand3(void) +{ + int error; + + rand3_state = allocatestate(TYPE_3); + error = initstate_r(rand3_state, 1, rand3_state->rst_randtbl, BREAK_3); + assert(error == 0); +} + +int +rand(void) +{ + if (rand3_state == NULL) + initialize_rand3(); + return ((int)random_r(rand3_state)); +} + +void +srand(unsigned seed) +{ + if (rand3_state == NULL) + initialize_rand3(); + srandom_r(rand3_state, seed); +} + +/* + * FreeBSD 12 and prior compatibility implementation of rand(3). + */ static int do_rand(unsigned long *ctx) { @@ -71,7 +120,9 @@ do_rand(unsigned long *ctx) return (x); } - +/* + * Can't fix this garbage; too little state. + */ int rand_r(unsigned *ctx) { @@ -84,21 +135,23 @@ rand_r(unsigned *ctx) return (r); } - static u_long next = 1; +int __rand_fbsd12(void); int -rand(void) +__rand_fbsd12(void) { return (do_rand(&next)); } +__sym_compat(rand, __rand_fbsd12, FBSD_1.0); +void __srand_fbsd12(unsigned seed); void -srand(unsigned seed) +__srand_fbsd12(unsigned seed) { next = seed; } - +__sym_compat(srand, __srand_fbsd12, FBSD_1.0); void __sranddev_fbsd12(void); void Modified: projects/clang1000-import/lib/libc/stdlib/random.3 ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/random.3 Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/random.3 Sat Feb 1 22:07:37 2020 (r357390) @@ -28,7 +28,7 @@ .\" @(#)random.3 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd January 20, 2020 +.Dd February 1, 2020 .Dt RANDOM 3 .Os .Sh NAME @@ -74,8 +74,7 @@ The period of this random number generator is very lar .Pp If initialized with less than 32 bytes of state, .Fn random -uses the same poor-quality Park-Miller LCG as -.Xr rand 3 . +uses the poor-quality 32-bit Park-Miller LCG. .Pp The .Fn random @@ -85,9 +84,6 @@ functions are analagous to .Xr rand 3 and .Xr srand 3 . -The difference is that -.Xr rand 3 -is a worse pseudo-random number generator. .Pp Like .Xr rand 3 , Modified: projects/clang1000-import/lib/libc/stdlib/random.c ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/random.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/random.c Sat Feb 1 22:07:37 2020 (r357390) @@ -104,48 +104,13 @@ __FBSDID("$FreeBSD$"); * byte buffer it is about 5 percent faster. */ -/* - * For each of the currently supported random number generators, we have a - * break value on the amount of state information (you need at least this - * many bytes of state info to support this random number generator), a degree - * for the polynomial (actually a trinomial) that the R.N.G. is based on, and - * the separation between the two lower order coefficients of the trinomial. - */ -#define TYPE_0 0 /* linear congruential */ -#define BREAK_0 8 -#define DEG_0 0 -#define SEP_0 0 - -#define TYPE_1 1 /* x**7 + x**3 + 1 */ -#define BREAK_1 32 -#define DEG_1 7 -#define SEP_1 3 - -#define TYPE_2 2 /* x**15 + x + 1 */ -#define BREAK_2 64 -#define DEG_2 15 -#define SEP_2 1 - -#define TYPE_3 3 /* x**31 + x**3 + 1 */ -#define BREAK_3 128 -#define DEG_3 31 -#define SEP_3 3 - -#define TYPE_4 4 /* x**63 + x + 1 */ -#define BREAK_4 256 -#define DEG_4 63 -#define SEP_4 1 - -/* - * Array versions of the above information to make code run faster -- - * relies on fact that TYPE_i == i. - */ -#define MAX_TYPES 5 /* max number of types above */ - #define NSHUFF 50 /* to drop some "seed -> 1st value" linearity */ static const int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; -static const int seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; +static const int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; +static const int breaks[MAX_TYPES] = { + BREAK_0, BREAK_1, BREAK_2, BREAK_3, BREAK_4 +}; /* * Initially, everything is set up as if from: @@ -523,4 +488,20 @@ long random(void) { return (random_r(&implicit)); +} + +struct __random_state * +allocatestate(unsigned type) +{ + size_t asize; + + /* No point using this interface to get the Park-Miller LCG. */ + if (type < TYPE_1) + abort(); + /* Clamp to widest supported variant. */ + if (type > (MAX_TYPES - 1)) + type = (MAX_TYPES - 1); + + asize = sizeof(struct __random_state) + (size_t)breaks[type]; + return (malloc(asize)); } Modified: projects/clang1000-import/lib/libc/stdlib/random.h ============================================================================== --- projects/clang1000-import/lib/libc/stdlib/random.h Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/lib/libc/stdlib/random.h Sat Feb 1 22:07:37 2020 (r357390) @@ -27,6 +27,44 @@ #pragma once +/* + * For each of the currently supported random number generators, we have a + * break value on the amount of state information (you need at least this + * many bytes of state info to support this random number generator), a degree + * for the polynomial (actually a trinomial) that the R.N.G. is based on, and + * the separation between the two lower order coefficients of the trinomial. + */ +#define TYPE_0 0 /* linear congruential */ +#define BREAK_0 8 +#define DEG_0 0 +#define SEP_0 0 + +#define TYPE_1 1 /* x**7 + x**3 + 1 */ +#define BREAK_1 32 +#define DEG_1 7 +#define SEP_1 3 + +#define TYPE_2 2 /* x**15 + x + 1 */ +#define BREAK_2 64 +#define DEG_2 15 +#define SEP_2 1 + +#define TYPE_3 3 /* x**31 + x**3 + 1 */ +#define BREAK_3 128 +#define DEG_3 31 +#define SEP_3 3 + +#define TYPE_4 4 /* x**63 + x + 1 */ +#define BREAK_4 256 +#define DEG_4 63 +#define SEP_4 1 + +/* + * Array versions of the above information to make code run faster -- + * relies on fact that TYPE_i == i. + */ +#define MAX_TYPES 5 /* max number of types above */ + /* A full instance of the random(3) generator. */ struct __random_state { uint32_t *rst_fptr; @@ -40,6 +78,7 @@ struct __random_state { uint32_t rst_randtbl[]; }; +struct __random_state *allocatestate(unsigned type); int initstate_r(struct __random_state *, unsigned, uint32_t *, size_t); long random_r(struct __random_state *); void srandom_r(struct __random_state *, unsigned); Modified: projects/clang1000-import/share/man/man4/hwpstate_intel.4 ============================================================================== --- projects/clang1000-import/share/man/man4/hwpstate_intel.4 Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/share/man/man4/hwpstate_intel.4 Sat Feb 1 22:07:37 2020 (r357390) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 22, 2020 +.Dd February 1, 2020 .Dt HWPSTATE_INTEL 4 .Os .Sh NAME @@ -49,7 +49,15 @@ Can be used to disable .Nm , allowing other compatible drivers to manage performance states, like .Xr est 4 . -.Pq default 0 +Defaults to +.Dv Qq 0 +(enabled). +.It Va machdep.hwpstate_pkg_ctrl +Selects between package-level control (the default) and per-core control. +.Dv Qq 1 +selects package-level control and +.Dv Qq 0 +selects core-level control. .El .Sh SYSCTL VARIABLES The following Modified: projects/clang1000-import/sys/compat/linux/linux_getcwd.c ============================================================================== --- projects/clang1000-import/sys/compat/linux/linux_getcwd.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/compat/linux/linux_getcwd.c Sat Feb 1 22:07:37 2020 (r357390) @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> -#include <sys/syscallsubr.h> +#include <sys/vnode.h> #include <sys/proc.h> #include <sys/malloc.h> @@ -60,28 +60,25 @@ __FBSDID("$FreeBSD$"); * Find pathname of process's current directory. */ int -linux_getcwd(struct thread *td, struct linux_getcwd_args *args) +linux_getcwd(struct thread *td, struct linux_getcwd_args *uap) { - char *path; - int error, lenused; + char *buf, *retbuf; + size_t buflen; + int error; - /* - * Linux returns ERANGE instead of EINVAL. - */ - if (args->bufsize < 2) + buflen = uap->bufsize; + if (__predict_false(buflen < 2)) return (ERANGE); + if (buflen > LINUX_PATH_MAX) + buflen = LINUX_PATH_MAX; - path = malloc(LINUX_PATH_MAX, M_LINUX, M_WAITOK); - - error = kern___getcwd(td, path, UIO_SYSSPACE, args->bufsize, - LINUX_PATH_MAX); + buf = malloc(buflen, M_TEMP, M_WAITOK); + error = vn_getcwd(td, buf, &retbuf, &buflen); if (error == 0) { - lenused = strlen(path) + 1; - error = copyout(path, args->buf, lenused); + error = copyout(retbuf, uap->buf, buflen); if (error == 0) - td->td_retval[0] = lenused; + td->td_retval[0] = buflen; } - - free(path, M_LINUX); + free(buf, M_TEMP); return (error); } Modified: projects/clang1000-import/sys/dev/tpm/tpm_crb.c ============================================================================== --- projects/clang1000-import/sys/dev/tpm/tpm_crb.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/dev/tpm/tpm_crb.c Sat Feb 1 22:07:37 2020 (r357390) @@ -70,7 +70,8 @@ __FBSDID("$FreeBSD$"); #define TPM_CRB_CTRL_STS_ERR_BIT BIT(0) #define TPM_CRB_CTRL_STS_IDLE_BIT BIT(1) -#define TPM_CRB_CTRL_CANCEL_CMD BIT(0) +#define TPM_CRB_CTRL_CANCEL_CMD 0x1 +#define TPM_CRB_CTRL_CANCEL_CLEAR 0x0 #define TPM_CRB_CTRL_START_CMD BIT(0) @@ -298,7 +299,7 @@ tpmcrb_cancel_cmd(struct tpm_sc *sc) return (false); } - WR4(sc, TPM_CRB_CTRL_CANCEL, ~TPM_CRB_CTRL_CANCEL_CMD); + WR4(sc, TPM_CRB_CTRL_CANCEL, TPM_CRB_CTRL_CANCEL_CLEAR; return (true); } @@ -330,7 +331,7 @@ tpmcrb_transmit(struct tpm_sc *sc, size_t length) return (EIO); } /* Clear cancellation bit */ - WR4(sc, TPM_CRB_CTRL_CANCEL, ~TPM_CRB_CTRL_CANCEL_CMD); + WR4(sc, TPM_CRB_CTRL_CANCEL, TPM_CRB_CTRL_CANCEL_CLEAR; /* Switch device to idle state if necessary */ if (!(RD4(sc, TPM_CRB_CTRL_STS) & TPM_CRB_CTRL_STS_IDLE_BIT)) { Modified: projects/clang1000-import/sys/dev/tpm/tpm_tis.c ============================================================================== --- projects/clang1000-import/sys/dev/tpm/tpm_tis.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/dev/tpm/tpm_tis.c Sat Feb 1 22:07:37 2020 (r357390) @@ -386,12 +386,11 @@ tpmtis_go_ready(struct tpm_sc *sc) mask = TPM_STS_CMD_RDY; sc->intr_type = TPM_INT_STS_CMD_RDY; - OR4(sc, TPM_STS, TPM_STS_CMD_RDY); + WR4(sc, TPM_STS, TPM_STS_CMD_RDY); bus_barrier(sc->mem_res, TPM_STS, 4, BUS_SPACE_BARRIER_WRITE); if (!tpm_wait_for_u32(sc, TPM_STS, mask, mask, TPM_TIMEOUT_B)) return (false); - AND4(sc, TPM_STS, ~TPM_STS_CMD_RDY); return (true); } Modified: projects/clang1000-import/sys/fs/devfs/devfs_vnops.c ============================================================================== --- projects/clang1000-import/sys/fs/devfs/devfs_vnops.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/fs/devfs/devfs_vnops.c Sat Feb 1 22:07:37 2020 (r357390) @@ -274,7 +274,7 @@ devfs_vptocnp(struct vop_vptocnp_args *ap) struct vnode **dvp = ap->a_vpp; struct devfs_mount *dmp; char *buf = ap->a_buf; - int *buflen = ap->a_buflen; + size_t *buflen = ap->a_buflen; struct devfs_dirent *dd, *de; int i, error; Modified: projects/clang1000-import/sys/fs/pseudofs/pseudofs_vnops.c ============================================================================== --- projects/clang1000-import/sys/fs/pseudofs/pseudofs_vnops.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/fs/pseudofs/pseudofs_vnops.c Sat Feb 1 22:07:37 2020 (r357390) @@ -377,7 +377,7 @@ pfs_vptocnp(struct vop_vptocnp_args *ap) struct pfs_node *pn; struct mount *mp; char *buf = ap->a_buf; - int *buflen = ap->a_buflen; + size_t *buflen = ap->a_buflen; char pidbuf[PFS_NAMELEN]; pid_t pid = pvd->pvd_pid; int len, i, error, locked; Modified: projects/clang1000-import/sys/fs/tmpfs/tmpfs_vnops.c ============================================================================== --- projects/clang1000-import/sys/fs/tmpfs/tmpfs_vnops.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/fs/tmpfs/tmpfs_vnops.c Sat Feb 1 22:07:37 2020 (r357390) @@ -1491,7 +1491,7 @@ tmpfs_vptocnp_dir(struct tmpfs_node *tn, struct tmpfs_ static int tmpfs_vptocnp_fill(struct vnode *vp, struct tmpfs_node *tn, - struct tmpfs_node *tnp, char *buf, int *buflen, struct vnode **dvp) + struct tmpfs_node *tnp, char *buf, size_t *buflen, struct vnode **dvp) { struct tmpfs_dirent *de; int error, i; @@ -1531,7 +1531,7 @@ tmpfs_vptocnp(struct vop_vptocnp_args *ap) struct tmpfs_dirent *de; struct tmpfs_mount *tm; char *buf; - int *buflen; + size_t *buflen; int error; vp = ap->a_vp; Modified: projects/clang1000-import/sys/kern/kern_sig.c ============================================================================== --- projects/clang1000-import/sys/kern/kern_sig.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/kern/kern_sig.c Sat Feb 1 22:07:37 2020 (r357390) @@ -3608,6 +3608,7 @@ coredump(struct thread *td) struct vnode *vp; struct flock lf; struct vattr vattr; + size_t fullpathsize; int error, error1, locked; char *name; /* name of corefile */ void *rl_cookie; @@ -3711,13 +3712,14 @@ coredump(struct thread *td) * if the path of the core is relative, add the current dir in front if it. */ if (name[0] != '/') { - fullpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); - if (kern___getcwd(td, fullpath, UIO_SYSSPACE, MAXPATHLEN, MAXPATHLEN) != 0) { - free(fullpath, M_TEMP); + fullpathsize = MAXPATHLEN; + freepath = malloc(fullpathsize, M_TEMP, M_WAITOK); + if (vn_getcwd(td, freepath, &fullpath, &fullpathsize) != 0) { + free(freepath, M_TEMP); goto out2; } devctl_safe_quote_sb(sb, fullpath); - free(fullpath, M_TEMP); + free(freepath, M_TEMP); sbuf_putc(sb, '/'); } devctl_safe_quote_sb(sb, name); Modified: projects/clang1000-import/sys/kern/vfs_cache.c ============================================================================== --- projects/clang1000-import/sys/kern/vfs_cache.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/kern/vfs_cache.c Sat Feb 1 22:07:37 2020 (r357390) @@ -364,7 +364,7 @@ STATNODE_COUNTER(numposhits, "Number of cache hits (po STATNODE_COUNTER(numnegzaps, "Number of cache hits (negative) we do not want to cache"); STATNODE_COUNTER(numneghits, "Number of cache hits (negative)"); -/* These count for kern___getcwd(), too. */ +/* These count for vn_getcwd(), too. */ STATNODE_COUNTER(numfullpathcalls, "Number of fullpath search calls"); STATNODE_COUNTER(numfullpathfail1, "Number of fullpath search errors (ENOTDIR)"); STATNODE_COUNTER(numfullpathfail2, @@ -388,7 +388,7 @@ STATNODE_COUNTER(shrinking_skipped, static void cache_zap_locked(struct namecache *ncp, bool neg_locked); static int vn_fullpath1(struct thread *td, struct vnode *vp, struct vnode *rdir, - char *buf, char **retbuf, u_int buflen); + char *buf, char **retbuf, size_t *buflen); static MALLOC_DEFINE(M_VFSCACHE, "vfscache", "VFS name cache entries"); @@ -2167,39 +2167,35 @@ vfs_cache_lookup(struct vop_lookup_args *ap) return (error); } -/* - * XXX All of these sysctls would probably be more productive dead. - */ -static int __read_mostly disablecwd; -SYSCTL_INT(_debug, OID_AUTO, disablecwd, CTLFLAG_RW, &disablecwd, 0, - "Disable the getcwd syscall"); - /* Implementation of the getcwd syscall. */ int sys___getcwd(struct thread *td, struct __getcwd_args *uap) { + char *buf, *retbuf; + size_t buflen; + int error; - return (kern___getcwd(td, uap->buf, UIO_USERSPACE, uap->buflen, - MAXPATHLEN)); + buflen = uap->buflen; + if (__predict_false(buflen < 2)) + return (EINVAL); + if (buflen > MAXPATHLEN) + buflen = MAXPATHLEN; + + buf = malloc(buflen, M_TEMP, M_WAITOK); + error = vn_getcwd(td, buf, &retbuf, &buflen); + if (error == 0) + error = copyout(retbuf, uap->buf, buflen); + free(buf, M_TEMP); + return (error); } int -kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, size_t buflen, - size_t path_max) +vn_getcwd(struct thread *td, char *buf, char **retbuf, size_t *buflen) { - char *bp, *tmpbuf; struct filedesc *fdp; struct vnode *cdir, *rdir; int error; - if (__predict_false(disablecwd)) - return (ENODEV); - if (__predict_false(buflen < 2)) - return (EINVAL); - if (buflen > path_max) - buflen = path_max; - - tmpbuf = malloc(buflen, M_TEMP, M_WAITOK); fdp = td->td_proc->p_fd; FILEDESC_SLOCK(fdp); cdir = fdp->fd_cdir; @@ -2207,33 +2203,18 @@ kern___getcwd(struct thread *td, char *buf, enum uio_s rdir = fdp->fd_rdir; vrefact(rdir); FILEDESC_SUNLOCK(fdp); - error = vn_fullpath1(td, cdir, rdir, tmpbuf, &bp, buflen); + error = vn_fullpath1(td, cdir, rdir, buf, retbuf, buflen); vrele(rdir); vrele(cdir); - if (!error) { - if (bufseg == UIO_SYSSPACE) - bcopy(bp, buf, strlen(bp) + 1); - else - error = copyout(bp, buf, strlen(bp) + 1); #ifdef KTRACE - if (KTRPOINT(curthread, KTR_NAMEI)) - ktrnamei(bp); + if (KTRPOINT(curthread, KTR_NAMEI) && error == 0) + ktrnamei(*retbuf); #endif - } - free(tmpbuf, M_TEMP); return (error); } /* - * Thus begins the fullpath magic. - */ - -static int __read_mostly disablefullpath; -SYSCTL_INT(_debug, OID_AUTO, disablefullpath, CTLFLAG_RW, &disablefullpath, 0, - "Disable the vn_fullpath function"); - -/* * Retrieve the full filesystem path that correspond to a vnode from the name * cache (if available) */ @@ -2243,20 +2224,20 @@ vn_fullpath(struct thread *td, struct vnode *vn, char char *buf; struct filedesc *fdp; struct vnode *rdir; + size_t buflen; int error; - if (__predict_false(disablefullpath)) - return (ENODEV); if (__predict_false(vn == NULL)) return (EINVAL); - buf = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); + buflen = MAXPATHLEN; + buf = malloc(buflen, M_TEMP, M_WAITOK); fdp = td->td_proc->p_fd; FILEDESC_SLOCK(fdp); rdir = fdp->fd_rdir; vrefact(rdir); FILEDESC_SUNLOCK(fdp); - error = vn_fullpath1(td, vn, rdir, buf, retbuf, MAXPATHLEN); + error = vn_fullpath1(td, vn, rdir, buf, retbuf, &buflen); vrele(rdir); if (!error) @@ -2277,14 +2258,14 @@ vn_fullpath_global(struct thread *td, struct vnode *vn char **retbuf, char **freebuf) { char *buf; + size_t buflen; int error; - if (__predict_false(disablefullpath)) - return (ENODEV); if (__predict_false(vn == NULL)) return (EINVAL); - buf = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); - error = vn_fullpath1(td, vn, rootvnode, buf, retbuf, MAXPATHLEN); + buflen = MAXPATHLEN; + buf = malloc(buflen, M_TEMP, M_WAITOK); + error = vn_fullpath1(td, vn, rootvnode, buf, retbuf, &buflen); if (!error) *freebuf = buf; else @@ -2293,7 +2274,7 @@ vn_fullpath_global(struct thread *td, struct vnode *vn } int -vn_vptocnp(struct vnode **vp, struct ucred *cred, char *buf, u_int *buflen) +vn_vptocnp(struct vnode **vp, struct ucred *cred, char *buf, size_t *buflen) { struct vnode *dvp; struct namecache *ncp; @@ -2355,18 +2336,21 @@ vn_vptocnp(struct vnode **vp, struct ucred *cred, char } /* - * The magic behind kern___getcwd() and vn_fullpath(). + * The magic behind vn_getcwd() and vn_fullpath(). */ static int vn_fullpath1(struct thread *td, struct vnode *vp, struct vnode *rdir, - char *buf, char **retbuf, u_int buflen) + char *buf, char **retbuf, size_t *len) { int error, slash_prefixed; #ifdef KDTRACE_HOOKS struct vnode *startvp = vp; #endif struct vnode *vp1; + size_t buflen; + buflen = *len; + buflen--; buf[buflen] = '\0'; error = 0; @@ -2457,6 +2441,7 @@ vn_fullpath1(struct thread *td, struct vnode *vp, stru SDT_PROBE3(vfs, namecache, fullpath, return, 0, startvp, buf + buflen); *retbuf = buf + buflen; + *len -= buflen; return (0); } @@ -2515,9 +2500,6 @@ vn_commname(struct vnode *vp, char *buf, u_int buflen) * Requires a locked, referenced vnode. * Vnode is re-locked on success or ENODEV, otherwise unlocked. * - * If sysctl debug.disablefullpath is set, ENODEV is returned, - * vnode is left locked and path remain untouched. - * * If vp is a directory, the call to vn_fullpath_global() always succeeds * because it falls back to the ".." lookup if the namecache lookup fails. */ @@ -2531,10 +2513,6 @@ vn_path_to_global_path(struct thread *td, struct vnode int error; ASSERT_VOP_ELOCKED(vp, __func__); - - /* Return ENODEV if sysctl debug.disablefullpath==1 */ - if (__predict_false(disablefullpath)) - return (ENODEV); /* Construct global filesystem path from vp. */ VOP_UNLOCK(vp); Modified: projects/clang1000-import/sys/kern/vfs_default.c ============================================================================== --- projects/clang1000-import/sys/kern/vfs_default.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/kern/vfs_default.c Sat Feb 1 22:07:37 2020 (r357390) @@ -804,7 +804,7 @@ vop_stdvptocnp(struct vop_vptocnp_args *ap) struct vnode **dvp = ap->a_vpp; struct ucred *cred = ap->a_cred; char *buf = ap->a_buf; - int *buflen = ap->a_buflen; + size_t *buflen = ap->a_buflen; char *dirbuf, *cpos; int i, error, eofflag, dirbuflen, flags, locked, len, covered; off_t off; Modified: projects/clang1000-import/sys/kern/vnode_if.src ============================================================================== --- projects/clang1000-import/sys/kern/vnode_if.src Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/kern/vnode_if.src Sat Feb 1 22:07:37 2020 (r357390) @@ -640,7 +640,7 @@ vop_vptocnp { OUT struct vnode **vpp; IN struct ucred *cred; INOUT char *buf; - INOUT int *buflen; + INOUT size_t *buflen; }; Modified: projects/clang1000-import/sys/riscv/sifive/fu540_prci.c ============================================================================== --- projects/clang1000-import/sys/riscv/sifive/fu540_prci.c Sat Feb 1 21:47:34 2020 (r357389) +++ projects/clang1000-import/sys/riscv/sifive/fu540_prci.c Sat Feb 1 22:07:37 2020 (r357390) @@ -45,11 +45,21 @@ __FBSDID("$FreeBSD$"); #include <machine/cpu.h> #include <dev/extres/clk/clk.h> +#include <dev/extres/clk/clk_fixed.h> #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> #include <dev/ofw/openfirm.h> +#include <gnu/dts/include/dt-bindings/clock/sifive-fu540-prci.h> + +static struct ofw_compat_data compat_data[] = { + { "sifive,aloeprci0", 1 }, + { "sifive,ux00prci0", 1 }, + { "sifive,fu540-c000-prci", 1 }, + { NULL, 0 }, +}; + static struct resource_spec prci_spec[] = { { SYS_RES_MEMORY, 0, RF_ACTIVE }, RESOURCE_SPEC_END @@ -68,6 +78,7 @@ struct prci_softc { struct prci_clk_pll_sc { struct prci_softc *parent_sc; + uint32_t reg; }; #define PRCI_LOCK(sc) mtx_lock(&(sc)->mtx) @@ -75,17 +86,51 @@ struct prci_clk_pll_sc { #define PRCI_ASSERT_LOCKED(sc) mtx_assert(&(sc)->mtx, MA_OWNED); #define PRCI_ASSERT_UNLOCKED(sc) mtx_assert(&(sc)->mtx, MA_NOTOWNED); -#define PRCI_COREPLL 0x4 -#define PRCI_COREPLL_DIVR_MASK 0x3f -#define PRCI_COREPLL_DIVR_SHIFT 0 -#define PRCI_COREPLL_DIVF_MASK 0x7fc0 -#define PRCI_COREPLL_DIVF_SHIFT 6 -#define PRCI_COREPLL_DIVQ_MASK 0x38000 -#define PRCI_COREPLL_DIVQ_SHIFT 15 +#define PRCI_COREPLL_CFG0 0x4 +#define PRCI_DDRPLL_CFG0 0xC +#define PRCI_GEMGXLPLL_CFG0 0x1C +#define PRCI_PLL_DIVR_MASK 0x3f +#define PRCI_PLL_DIVR_SHIFT 0 +#define PRCI_PLL_DIVF_MASK 0x7fc0 +#define PRCI_PLL_DIVF_SHIFT 6 +#define PRCI_PLL_DIVQ_MASK 0x38000 +#define PRCI_PLL_DIVQ_SHIFT 15 + #define PRCI_READ(_sc, _reg) \ bus_space_read_4((_sc)->bst, (_sc)->bsh, (_reg)) +struct prci_pll_def { + uint32_t id; + const char *name; + uint32_t reg; +}; + +#define PLL(_id, _name, _base) \ +{ \ + .id = (_id), \ + .name = (_name), \ + .reg = (_base), \ +} + +/* PLL Clocks */ +struct prci_pll_def pll_clks[] = { + PLL(PRCI_CLK_COREPLL, "coreclk", PRCI_COREPLL_CFG0), + PLL(PRCI_CLK_DDRPLL, "ddrclk", PRCI_DDRPLL_CFG0), + PLL(PRCI_CLK_GEMGXLPLL, "gemgxclk", PRCI_GEMGXLPLL_CFG0), +}; + +/* Fixed divisor clock TLCLK. */ +struct clk_fixed_def tlclk_def = { + .clkdef.id = PRCI_CLK_TLCLK, + .clkdef.name = "prci_tlclk", + .clkdef.parent_names = (const char *[]){"coreclk"}, + .clkdef.parent_cnt = 1, + .clkdef.flags = CLK_NODE_STATIC_STRINGS, + .mult = 1, + .div = 2, +}; + static int prci_clk_pll_init(struct clknode *clk, device_t dev) { @@ -121,11 +166,11 @@ prci_clk_pll_recalc(struct clknode *clk, uint64_t *fre } /* Calculate the PLL output */ - val = PRCI_READ(sc->parent_sc, PRCI_COREPLL); + val = PRCI_READ(sc->parent_sc, sc->reg); - divf = (val & PRCI_COREPLL_DIVF_MASK) >> PRCI_COREPLL_DIVF_SHIFT; - divq = (val & PRCI_COREPLL_DIVQ_MASK) >> PRCI_COREPLL_DIVQ_SHIFT; - divr = (val & PRCI_COREPLL_DIVR_MASK) >> PRCI_COREPLL_DIVR_SHIFT; + divf = (val & PRCI_PLL_DIVF_MASK) >> PRCI_PLL_DIVF_SHIFT; + divq = (val & PRCI_PLL_DIVQ_MASK) >> PRCI_PLL_DIVQ_SHIFT; + divr = (val & PRCI_PLL_DIVR_MASK) >> PRCI_PLL_DIVR_SHIFT; *freq = refclk / (divr + 1) * (2 * (divf + 1)) / (1 << divq); @@ -151,7 +196,7 @@ prci_probe(device_t dev) if (!ofw_bus_status_okay(dev)) return (ENXIO); - if (!ofw_bus_is_compatible(dev, "sifive,aloeprci0")) + if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) return (ENXIO); device_set_desc(dev, "SiFive FU540 Power Reset Clocking Interrupt"); @@ -160,7 +205,8 @@ prci_probe(device_t dev) } static void -prci_pll_register(struct prci_softc *parent_sc, struct clknode_init_def *clkdef) +prci_pll_register(struct prci_softc *parent_sc, struct clknode_init_def *clkdef, + uint32_t reg) { struct clknode *clk; struct prci_clk_pll_sc *sc; @@ -172,6 +218,7 @@ prci_pll_register(struct prci_softc *parent_sc, struct sc = clknode_get_softc(clk); sc->parent_sc = parent_sc; + sc->reg = reg; clknode_register(parent_sc->clkdom, clk); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202002012207.011M7b8K005558>