mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-06-28 17:49:33 +08:00
kern: Add a proc0
- Provides the thread's proc pointer and with that access to creds Update #4475
This commit is contained in:
parent
761fd69393
commit
c7427fc154
@ -103,7 +103,9 @@ void mi_startup(void); /* Should be elsewhere */
|
|||||||
/* Components of the first process -- never freed. */
|
/* Components of the first process -- never freed. */
|
||||||
static struct session session0;
|
static struct session session0;
|
||||||
static struct pgrp pgrp0;
|
static struct pgrp pgrp0;
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct proc proc0;
|
struct proc proc0;
|
||||||
|
#ifndef __rtems__
|
||||||
struct thread0_storage thread0_st __aligned(32);
|
struct thread0_storage thread0_st __aligned(32);
|
||||||
struct vmspace vmspace0;
|
struct vmspace vmspace0;
|
||||||
struct proc *initproc;
|
struct proc *initproc;
|
||||||
@ -121,6 +123,7 @@ SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0,
|
|||||||
int bootverbose = BOOTVERBOSE;
|
int bootverbose = BOOTVERBOSE;
|
||||||
SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0,
|
SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0,
|
||||||
"Control the output of verbose kernel messages");
|
"Control the output of verbose kernel messages");
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
#ifdef VERBOSE_SYSINIT
|
#ifdef VERBOSE_SYSINIT
|
||||||
/*
|
/*
|
||||||
@ -134,6 +137,7 @@ int verbose_sysinit = VERBOSE_SYSINIT;
|
|||||||
TUNABLE_INT("debug.verbose_sysinit", &verbose_sysinit);
|
TUNABLE_INT("debug.verbose_sysinit", &verbose_sysinit);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
#ifdef INVARIANTS
|
#ifdef INVARIANTS
|
||||||
FEATURE(invariants, "Kernel compiled with INVARIANTS, may affect performance");
|
FEATURE(invariants, "Kernel compiled with INVARIANTS, may affect performance");
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <machine/rtems-bsd-kernel-space.h>
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*
|
*
|
||||||
@ -46,12 +48,14 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "opt_inet.h"
|
#include <rtems/bsd/local/opt_inet.h>
|
||||||
#include "opt_inet6.h"
|
#include <rtems/bsd/local/opt_inet6.h>
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#ifndef __rtems__
|
||||||
#include <sys/acct.h>
|
#include <sys/acct.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
#include <sys/kdb.h>
|
#include <sys/kdb.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
@ -65,13 +69,19 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
#include <sys/sysproto.h>
|
#include <sys/sysproto.h>
|
||||||
#include <sys/jail.h>
|
#include <sys/jail.h>
|
||||||
|
#ifndef __rtems__
|
||||||
#include <sys/pioctl.h>
|
#include <sys/pioctl.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
#include <sys/racct.h>
|
#include <sys/racct.h>
|
||||||
|
#ifndef __rtems__
|
||||||
#include <sys/rctl.h>
|
#include <sys/rctl.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
#include <sys/resourcevar.h>
|
#include <sys/resourcevar.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/socketvar.h>
|
#include <sys/socketvar.h>
|
||||||
|
#ifndef __rtems__
|
||||||
#include <sys/syscallsubr.h>
|
#include <sys/syscallsubr.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
#ifdef REGRESSION
|
#ifdef REGRESSION
|
||||||
@ -79,11 +89,14 @@ FEATURE(regression,
|
|||||||
"Kernel support for interfaces necessary for regression testing (SECURITY RISK!)");
|
"Kernel support for interfaces necessary for regression testing (SECURITY RISK!)");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
#include <security/audit/audit.h>
|
#include <security/audit/audit.h>
|
||||||
#include <security/mac/mac_framework.h>
|
#include <security/mac/mac_framework.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
static MALLOC_DEFINE(M_CRED, "cred", "credentials");
|
static MALLOC_DEFINE(M_CRED, "cred", "credentials");
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
SYSCTL_NODE(_security, OID_AUTO, bsd, CTLFLAG_RW, 0, "BSD security policy");
|
SYSCTL_NODE(_security, OID_AUTO, bsd, CTLFLAG_RW, 0, "BSD security policy");
|
||||||
|
|
||||||
static void crsetgroups_locked(struct ucred *cr, int ngrp,
|
static void crsetgroups_locked(struct ucred *cr, int ngrp,
|
||||||
@ -1260,6 +1273,7 @@ sys___setugid(struct thread *td, struct __setugid_args *uap)
|
|||||||
return (ENOSYS);
|
return (ENOSYS);
|
||||||
#endif /* REGRESSION */
|
#endif /* REGRESSION */
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if gid is a member of the group set.
|
* Check if gid is a member of the group set.
|
||||||
@ -1294,6 +1308,7 @@ groupmember(gid_t gid, struct ucred *cred)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
/*
|
/*
|
||||||
* Test the active securelevel against a given level. securelevel_gt()
|
* Test the active securelevel against a given level. securelevel_gt()
|
||||||
* implements (securelevel > level). securelevel_ge() implements
|
* implements (securelevel > level). securelevel_ge() implements
|
||||||
@ -1807,6 +1822,7 @@ p_canwait(struct thread *td, struct proc *p)
|
|||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate a zeroed cred structure.
|
* Allocate a zeroed cred structure.
|
||||||
@ -1836,7 +1852,10 @@ crget(void)
|
|||||||
struct ucred *
|
struct ucred *
|
||||||
crhold(struct ucred *cr)
|
crhold(struct ucred *cr)
|
||||||
{
|
{
|
||||||
|
#ifdef __rtems__
|
||||||
|
if (cr == NULL)
|
||||||
|
return (cr);
|
||||||
|
#endif /* __rtems__ */
|
||||||
refcount_acquire(&cr->cr_ref);
|
refcount_acquire(&cr->cr_ref);
|
||||||
return (cr);
|
return (cr);
|
||||||
}
|
}
|
||||||
@ -1847,6 +1866,10 @@ crhold(struct ucred *cr)
|
|||||||
void
|
void
|
||||||
crfree(struct ucred *cr)
|
crfree(struct ucred *cr)
|
||||||
{
|
{
|
||||||
|
#ifdef __rtems__
|
||||||
|
if (cr == NULL)
|
||||||
|
return;
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
KASSERT(cr->cr_ref > 0, ("bad ucred refcount: %d", cr->cr_ref));
|
KASSERT(cr->cr_ref > 0, ("bad ucred refcount: %d", cr->cr_ref));
|
||||||
KASSERT(cr->cr_ref != 0xdeadc0de, ("dangling reference to ucred"));
|
KASSERT(cr->cr_ref != 0xdeadc0de, ("dangling reference to ucred"));
|
||||||
@ -1863,6 +1886,7 @@ crfree(struct ucred *cr)
|
|||||||
/*
|
/*
|
||||||
* Free a prison, if any.
|
* Free a prison, if any.
|
||||||
*/
|
*/
|
||||||
|
#ifndef __rtems__
|
||||||
if (cr->cr_prison != NULL)
|
if (cr->cr_prison != NULL)
|
||||||
prison_free(cr->cr_prison);
|
prison_free(cr->cr_prison);
|
||||||
if (cr->cr_loginclass != NULL)
|
if (cr->cr_loginclass != NULL)
|
||||||
@ -1873,6 +1897,7 @@ crfree(struct ucred *cr)
|
|||||||
#ifdef MAC
|
#ifdef MAC
|
||||||
mac_cred_destroy(cr);
|
mac_cred_destroy(cr);
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* __rtems__ */
|
||||||
if (cr->cr_groups != cr->cr_smallgroups)
|
if (cr->cr_groups != cr->cr_smallgroups)
|
||||||
free(cr->cr_groups, M_CRED);
|
free(cr->cr_groups, M_CRED);
|
||||||
free(cr, M_CRED);
|
free(cr, M_CRED);
|
||||||
@ -1885,6 +1910,10 @@ crfree(struct ucred *cr)
|
|||||||
void
|
void
|
||||||
crcopy(struct ucred *dest, struct ucred *src)
|
crcopy(struct ucred *dest, struct ucred *src)
|
||||||
{
|
{
|
||||||
|
#ifdef __rtems__
|
||||||
|
if (dest == NULL || src == NULL)
|
||||||
|
return;
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
KASSERT(dest->cr_ref == 1, ("crcopy of shared ucred"));
|
KASSERT(dest->cr_ref == 1, ("crcopy of shared ucred"));
|
||||||
bcopy(&src->cr_startcopy, &dest->cr_startcopy,
|
bcopy(&src->cr_startcopy, &dest->cr_startcopy,
|
||||||
@ -1893,6 +1922,7 @@ crcopy(struct ucred *dest, struct ucred *src)
|
|||||||
crsetgroups(dest, src->cr_ngroups, src->cr_groups);
|
crsetgroups(dest, src->cr_ngroups, src->cr_groups);
|
||||||
uihold(dest->cr_uidinfo);
|
uihold(dest->cr_uidinfo);
|
||||||
uihold(dest->cr_ruidinfo);
|
uihold(dest->cr_ruidinfo);
|
||||||
|
#ifndef __rtems__
|
||||||
prison_hold(dest->cr_prison);
|
prison_hold(dest->cr_prison);
|
||||||
loginclass_hold(dest->cr_loginclass);
|
loginclass_hold(dest->cr_loginclass);
|
||||||
#ifdef AUDIT
|
#ifdef AUDIT
|
||||||
@ -1901,6 +1931,7 @@ crcopy(struct ucred *dest, struct ucred *src)
|
|||||||
#ifdef MAC
|
#ifdef MAC
|
||||||
mac_cred_copy(src, dest);
|
mac_cred_copy(src, dest);
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* __rtems__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1911,6 +1942,10 @@ crdup(struct ucred *cr)
|
|||||||
{
|
{
|
||||||
struct ucred *newcr;
|
struct ucred *newcr;
|
||||||
|
|
||||||
|
#ifdef __rtems__
|
||||||
|
if (cr == NULL)
|
||||||
|
return NULL;
|
||||||
|
#endif /* __rtems__ */
|
||||||
newcr = crget();
|
newcr = crget();
|
||||||
crcopy(newcr, cr);
|
crcopy(newcr, cr);
|
||||||
return (newcr);
|
return (newcr);
|
||||||
@ -1934,6 +1969,7 @@ cru2x(struct ucred *cr, struct xucred *xcr)
|
|||||||
ngroups * sizeof(*cr->cr_groups));
|
ngroups * sizeof(*cr->cr_groups));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
/*
|
/*
|
||||||
* Set initial process credentials.
|
* Set initial process credentials.
|
||||||
* Callers are responsible for providing the reference for provided credentials.
|
* Callers are responsible for providing the reference for provided credentials.
|
||||||
@ -1993,6 +2029,7 @@ crcopysafe(struct proc *p, struct ucred *cr)
|
|||||||
|
|
||||||
return (oldcred);
|
return (oldcred);
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extend the passed in credential to hold n items.
|
* Extend the passed in credential to hold n items.
|
||||||
@ -2083,6 +2120,7 @@ crsetgroups(struct ucred *cr, int ngrp, gid_t *groups)
|
|||||||
crsetgroups_locked(cr, ngrp, groups);
|
crsetgroups_locked(cr, ngrp, groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
/*
|
/*
|
||||||
* Get login name, if available.
|
* Get login name, if available.
|
||||||
*/
|
*/
|
||||||
@ -2157,6 +2195,7 @@ setsugid(struct proc *p)
|
|||||||
if (!(p->p_pfsflags & PF_ISUGID))
|
if (!(p->p_pfsflags & PF_ISUGID))
|
||||||
p->p_stops = 0;
|
p->p_stops = 0;
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Change a process's effective uid.
|
* Change a process's effective uid.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <machine/rtems-bsd-kernel-space.h>
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*
|
*
|
||||||
@ -59,15 +61,21 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#ifndef __rtems__
|
||||||
#include <sys/umtx.h>
|
#include <sys/umtx.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
#include <vm/vm.h>
|
#include <vm/vm.h>
|
||||||
#include <vm/vm_param.h>
|
#include <vm/vm_param.h>
|
||||||
#include <vm/pmap.h>
|
#include <vm/pmap.h>
|
||||||
#include <vm/vm_map.h>
|
#include <vm/vm_map.h>
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
static MALLOC_DEFINE(M_PLIMIT, "plimit", "plimit structures");
|
static MALLOC_DEFINE(M_PLIMIT, "plimit", "plimit structures");
|
||||||
|
#endif /* __rtems__ */
|
||||||
static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures");
|
static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures");
|
||||||
#define UIHASH(uid) (&uihashtbl[(uid) & uihash])
|
#define UIHASH(uid) (&uihashtbl[(uid) & uihash])
|
||||||
static struct rwlock uihashtbl_lock;
|
static struct rwlock uihashtbl_lock;
|
||||||
@ -80,6 +88,7 @@ static int donice(struct thread *td, struct proc *chgp, int n);
|
|||||||
static struct uidinfo *uilookup(uid_t uid);
|
static struct uidinfo *uilookup(uid_t uid);
|
||||||
static void ruxagg_locked(struct rusage_ext *rux, struct thread *td);
|
static void ruxagg_locked(struct rusage_ext *rux, struct thread *td);
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
/*
|
/*
|
||||||
* Resource controls and accounting.
|
* Resource controls and accounting.
|
||||||
*/
|
*/
|
||||||
@ -1303,6 +1312,7 @@ lim_rlimit_proc(struct proc *p, int which, struct rlimit *rlp)
|
|||||||
if (p->p_sysent->sv_fixlimit != NULL)
|
if (p->p_sysent->sv_fixlimit != NULL)
|
||||||
p->p_sysent->sv_fixlimit(rlp, which);
|
p->p_sysent->sv_fixlimit(rlp, which);
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
void
|
void
|
||||||
uihashinit()
|
uihashinit()
|
||||||
@ -1443,6 +1453,7 @@ uifree(struct uidinfo *uip)
|
|||||||
free(uip, M_UIDINFO);
|
free(uip, M_UIDINFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
#ifdef RACCT
|
#ifdef RACCT
|
||||||
void
|
void
|
||||||
ui_racct_foreach(void (*callback)(struct racct *racct,
|
ui_racct_foreach(void (*callback)(struct racct *racct,
|
||||||
@ -1537,3 +1548,4 @@ chgumtxcnt(struct uidinfo *uip, int diff, rlim_t max)
|
|||||||
|
|
||||||
return (chglimit(uip, &uip->ui_umtxcnt, diff, max, "umtxcnt"));
|
return (chglimit(uip, &uip->ui_umtxcnt, diff, max, "umtxcnt"));
|
||||||
}
|
}
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
@ -74,6 +74,7 @@
|
|||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef __rtems__
|
#ifdef __rtems__
|
||||||
|
#include <rtems/score/thread.h>
|
||||||
#include <sys/epoch.h>
|
#include <sys/epoch.h>
|
||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
@ -243,7 +244,9 @@ struct thread {
|
|||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
#ifndef __rtems__
|
#ifndef __rtems__
|
||||||
struct mtx *volatile td_lock; /* replaces sched lock */
|
struct mtx *volatile td_lock; /* replaces sched lock */
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct proc *td_proc; /* (*) Associated process. */
|
struct proc *td_proc; /* (*) Associated process. */
|
||||||
|
#ifndef __rtems__
|
||||||
TAILQ_ENTRY(thread) td_plist; /* (*) All threads in this proc. */
|
TAILQ_ENTRY(thread) td_plist; /* (*) All threads in this proc. */
|
||||||
TAILQ_ENTRY(thread) td_runq; /* (t) Run queue. */
|
TAILQ_ENTRY(thread) td_runq; /* (t) Run queue. */
|
||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
@ -261,6 +264,10 @@ struct thread {
|
|||||||
struct rl_q_entry *td_rlqe; /* (k) Associated range lock entry. */
|
struct rl_q_entry *td_rlqe; /* (k) Associated range lock entry. */
|
||||||
struct umtx_q *td_umtxq; /* (c?) Link for when we're blocked. */
|
struct umtx_q *td_umtxq; /* (c?) Link for when we're blocked. */
|
||||||
lwpid_t td_tid; /* (b) Thread ID. */
|
lwpid_t td_tid; /* (b) Thread ID. */
|
||||||
|
#else /* __rtems__ */
|
||||||
|
#define td_tid td_thread->Object.id
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
#ifndef __rtems__
|
||||||
sigqueue_t td_sigqueue; /* (c) Sigs arrived, not delivered. */
|
sigqueue_t td_sigqueue; /* (c) Sigs arrived, not delivered. */
|
||||||
#define td_siglist td_sigqueue.sq_signals
|
#define td_siglist td_sigqueue.sq_signals
|
||||||
u_char td_lend_user_pri; /* (t) Lend user pri. */
|
u_char td_lend_user_pri; /* (t) Lend user pri. */
|
||||||
@ -270,7 +277,9 @@ struct thread {
|
|||||||
u_char td_epochnest; /* (k) Epoch nest counter. */
|
u_char td_epochnest; /* (k) Epoch nest counter. */
|
||||||
int td_flags; /* (t) TDF_* flags. */
|
int td_flags; /* (t) TDF_* flags. */
|
||||||
int td_inhibitors; /* (t) Why can not run. */
|
int td_inhibitors; /* (t) Why can not run. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
int td_pflags; /* (k) Private thread (TDP_*) flags. */
|
int td_pflags; /* (k) Private thread (TDP_*) flags. */
|
||||||
|
#ifndef __rtems__
|
||||||
int td_dupfd; /* (k) Ret value from fdopen. XXX */
|
int td_dupfd; /* (k) Ret value from fdopen. XXX */
|
||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
#ifdef __rtems__
|
#ifdef __rtems__
|
||||||
@ -285,7 +294,9 @@ struct thread {
|
|||||||
short td_locks; /* (k) Debug: count of non-spin locks */
|
short td_locks; /* (k) Debug: count of non-spin locks */
|
||||||
short td_rw_rlocks; /* (k) Count of rwlock read locks. */
|
short td_rw_rlocks; /* (k) Count of rwlock read locks. */
|
||||||
short td_sx_slocks; /* (k) Count of sx shared locks. */
|
short td_sx_slocks; /* (k) Count of sx shared locks. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
short td_lk_slocks; /* (k) Count of lockmgr shared locks. */
|
short td_lk_slocks; /* (k) Count of lockmgr shared locks. */
|
||||||
|
#ifndef __rtems__
|
||||||
short td_stopsched; /* (k) Scheduler stopped. */
|
short td_stopsched; /* (k) Scheduler stopped. */
|
||||||
struct turnstile *td_blocked; /* (t) Lock thread is blocked on. */
|
struct turnstile *td_blocked; /* (t) Lock thread is blocked on. */
|
||||||
const char *td_lockname; /* (t) Name of lock blocked on. */
|
const char *td_lockname; /* (t) Name of lock blocked on. */
|
||||||
@ -319,6 +330,10 @@ struct thread {
|
|||||||
u_long td_profil_addr; /* (k) Temporary addr until AST. */
|
u_long td_profil_addr; /* (k) Temporary addr until AST. */
|
||||||
u_int td_profil_ticks; /* (k) Temporary ticks until AST. */
|
u_int td_profil_ticks; /* (k) Temporary ticks until AST. */
|
||||||
char td_name[MAXCOMLEN + 1]; /* (*) Thread name. */
|
char td_name[MAXCOMLEN + 1]; /* (*) Thread name. */
|
||||||
|
#else /* __rtems__ */
|
||||||
|
#if KTR
|
||||||
|
char td_name[MAXCOMLEN + 1]; /* (*) Thread name. */
|
||||||
|
#endif
|
||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
struct file *td_fpop; /* (k) file referencing cdev under op */
|
struct file *td_fpop; /* (k) file referencing cdev under op */
|
||||||
#ifndef __rtems__
|
#ifndef __rtems__
|
||||||
@ -328,7 +343,9 @@ struct thread {
|
|||||||
struct osd td_osd; /* (k) Object specific data. */
|
struct osd td_osd; /* (k) Object specific data. */
|
||||||
struct vm_map_entry *td_map_def_user; /* (k) Deferred entries. */
|
struct vm_map_entry *td_map_def_user; /* (k) Deferred entries. */
|
||||||
pid_t td_dbg_forked; /* (c) Child pid for debugger. */
|
pid_t td_dbg_forked; /* (c) Child pid for debugger. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
u_int td_vp_reserv; /* (k) Count of reserved vnodes. */
|
u_int td_vp_reserv; /* (k) Count of reserved vnodes. */
|
||||||
|
#ifndef __rtems__
|
||||||
int td_no_sleeping; /* (k) Sleeping disabled count. */
|
int td_no_sleeping; /* (k) Sleeping disabled count. */
|
||||||
void *td_su; /* (k) FFS SU private */
|
void *td_su; /* (k) FFS SU private */
|
||||||
sbintime_t td_sleeptimo; /* (t) Sleep timeout. */
|
sbintime_t td_sleeptimo; /* (t) Sleep timeout. */
|
||||||
@ -365,15 +382,13 @@ struct thread {
|
|||||||
TDS_RUNQ,
|
TDS_RUNQ,
|
||||||
TDS_RUNNING
|
TDS_RUNNING
|
||||||
} td_state; /* (t) thread state */
|
} td_state; /* (t) thread state */
|
||||||
|
#endif /* __rtems__ */
|
||||||
union {
|
union {
|
||||||
register_t tdu_retval[2];
|
register_t tdu_retval[2];
|
||||||
off_t tdu_off;
|
off_t tdu_off;
|
||||||
} td_uretoff; /* (k) Syscall aux returns. */
|
} td_uretoff; /* (k) Syscall aux returns. */
|
||||||
#else /* __rtems__ */
|
|
||||||
register_t td_retval[2]; /* (k) Syscall aux returns. */
|
|
||||||
#endif /* __rtems__ */
|
|
||||||
#ifndef __rtems__
|
|
||||||
#define td_retval td_uretoff.tdu_retval
|
#define td_retval td_uretoff.tdu_retval
|
||||||
|
#ifndef __rtems__
|
||||||
u_int td_cowgen; /* (k) Generation of COW pointers. */
|
u_int td_cowgen; /* (k) Generation of COW pointers. */
|
||||||
/* LP64 hole */
|
/* LP64 hole */
|
||||||
struct callout td_slpcallout; /* (h) Callout for sleep. */
|
struct callout td_slpcallout; /* (h) Callout for sleep. */
|
||||||
@ -615,9 +630,11 @@ struct proc {
|
|||||||
LIST_ENTRY(proc) p_list; /* (d) List of all processes. */
|
LIST_ENTRY(proc) p_list; /* (d) List of all processes. */
|
||||||
TAILQ_HEAD(, thread) p_threads; /* (c) all threads. */
|
TAILQ_HEAD(, thread) p_threads; /* (c) all threads. */
|
||||||
struct mtx p_slock; /* process spin lock */
|
struct mtx p_slock; /* process spin lock */
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct ucred *p_ucred; /* (c) Process owner's identity. */
|
struct ucred *p_ucred; /* (c) Process owner's identity. */
|
||||||
struct filedesc *p_fd; /* (b) Open files. */
|
struct filedesc *p_fd; /* (b) Open files. */
|
||||||
struct filedesc_to_leader *p_fdtol; /* (b) Tracking node */
|
struct filedesc_to_leader *p_fdtol; /* (b) Tracking node */
|
||||||
|
#ifndef __rtems__
|
||||||
struct pstats *p_stats; /* (b) Accounting/statistics (CPU). */
|
struct pstats *p_stats; /* (b) Accounting/statistics (CPU). */
|
||||||
struct plimit *p_limit; /* (c) Resource limits. */
|
struct plimit *p_limit; /* (c) Resource limits. */
|
||||||
struct callout p_limco; /* (c) Limit callout handle */
|
struct callout p_limco; /* (c) Limit callout handle */
|
||||||
@ -630,7 +647,9 @@ struct proc {
|
|||||||
PRS_NORMAL, /* threads can be run. */
|
PRS_NORMAL, /* threads can be run. */
|
||||||
PRS_ZOMBIE
|
PRS_ZOMBIE
|
||||||
} p_state; /* (j/c) Process status. */
|
} p_state; /* (j/c) Process status. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
pid_t p_pid; /* (b) Process identifier. */
|
pid_t p_pid; /* (b) Process identifier. */
|
||||||
|
#ifndef __rtems__
|
||||||
LIST_ENTRY(proc) p_hash; /* (d) Hash chain. */
|
LIST_ENTRY(proc) p_hash; /* (d) Hash chain. */
|
||||||
LIST_ENTRY(proc) p_pglist; /* (g + e) List of processes in pgrp. */
|
LIST_ENTRY(proc) p_pglist; /* (g + e) List of processes in pgrp. */
|
||||||
struct proc *p_pptr; /* (c + e) Pointer to parent process. */
|
struct proc *p_pptr; /* (c + e) Pointer to parent process. */
|
||||||
@ -675,7 +694,9 @@ struct proc {
|
|||||||
char p_step; /* (c) Process is stopped. */
|
char p_step; /* (c) Process is stopped. */
|
||||||
u_char p_pfsflags; /* (c) Procfs flags. */
|
u_char p_pfsflags; /* (c) Procfs flags. */
|
||||||
u_int p_ptevents; /* (c + e) ptrace() event mask. */
|
u_int p_ptevents; /* (c + e) ptrace() event mask. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct nlminfo *p_nlminfo; /* (?) Only used by/for lockd. */
|
struct nlminfo *p_nlminfo; /* (?) Only used by/for lockd. */
|
||||||
|
#ifndef __rtems__
|
||||||
struct kaioinfo *p_aioinfo; /* (y) ASYNC I/O info. */
|
struct kaioinfo *p_aioinfo; /* (y) ASYNC I/O info. */
|
||||||
struct thread *p_singlethread;/* (c + j) If single threading this is it */
|
struct thread *p_singlethread;/* (c + j) If single threading this is it */
|
||||||
int p_suspcount; /* (j) Num threads in suspended mode. */
|
int p_suspcount; /* (j) Num threads in suspended mode. */
|
||||||
@ -887,6 +908,7 @@ MALLOC_DECLARE(M_SUBPROC);
|
|||||||
#define NO_PID 100000
|
#define NO_PID 100000
|
||||||
extern pid_t pid_max;
|
extern pid_t pid_max;
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
#define SESS_LEADER(p) ((p)->p_session->s_leader == (p))
|
#define SESS_LEADER(p) ((p)->p_session->s_leader == (p))
|
||||||
|
|
||||||
|
|
||||||
@ -949,7 +971,6 @@ extern pid_t pid_max;
|
|||||||
* _PHOLD(), it only guarantees that exit1() is not executed,
|
* _PHOLD(), it only guarantees that exit1() is not executed,
|
||||||
* faultin() is not called.
|
* faultin() is not called.
|
||||||
*/
|
*/
|
||||||
#ifndef __rtems__
|
|
||||||
#define PHOLD(p) do { \
|
#define PHOLD(p) do { \
|
||||||
PROC_LOCK(p); \
|
PROC_LOCK(p); \
|
||||||
_PHOLD(p); \
|
_PHOLD(p); \
|
||||||
@ -994,8 +1015,28 @@ extern pid_t pid_max;
|
|||||||
(p)->p_cowgen++; \
|
(p)->p_cowgen++; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else /* __rtems__ */
|
#else /* __rtems__ */
|
||||||
|
#define SESS_LEADER(p) (1)
|
||||||
|
#define STOPEVENT(p, e, v) do { } while (0)
|
||||||
|
#define PROC_LOCK(p) do { } while (0)
|
||||||
|
#define PROC_TRYLOCK(p) do { } while (0)
|
||||||
|
#define PROC_UNLOCK(p) do { } while (0)
|
||||||
|
#define PROC_LOCKED(p) do { } while (0)
|
||||||
|
#define PROC_LOCK_ASSERT(p, type) do { } while (0)
|
||||||
|
#define PGRP_LOCK(pg) do { } while (0)
|
||||||
|
#define PGRP_UNLOCK(pg) do { } while (0)
|
||||||
|
#define PGRP_LOCKED(pg) do { } while (0)
|
||||||
|
#define PGRP_LOCK_ASSERT(pg, type) do { } while (0)
|
||||||
|
#define PGRP_LOCK_PGSIGNAL(pg) do { } while (0)
|
||||||
|
#define PGRP_UNLOCK_PGSIGNAL(pg) do { } while (0)
|
||||||
|
#define SESS_LOCK(s) do { } while (0)
|
||||||
|
#define SESS_UNLOCK(s) do { } while (0)
|
||||||
|
#define SESS_LOCKED(s) do { } while (0)
|
||||||
|
#define SESS_LOCK_ASSERT(s, type) do { } while (0)
|
||||||
#define PHOLD(x) do { } while (0)
|
#define PHOLD(x) do { } while (0)
|
||||||
|
#define _PHOLD(x) do { } while (0)
|
||||||
|
#define PROC_ASSERT_HELD(p) do { } while (0)
|
||||||
#define PRELE(x) do { } while (0)
|
#define PRELE(x) do { } while (0)
|
||||||
|
#define PROC_ASSERT_NOT_HELD(p) do { } while (0)
|
||||||
#endif /* __rtems__ */
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
/* Check whether a thread is safe to be swapped out. */
|
/* Check whether a thread is safe to be swapped out. */
|
||||||
|
@ -48,7 +48,6 @@ struct loginclass;
|
|||||||
* priv(9) interface should be used to check for privilege.
|
* priv(9) interface should be used to check for privilege.
|
||||||
*/
|
*/
|
||||||
#if defined(_KERNEL) || defined(_WANT_UCRED)
|
#if defined(_KERNEL) || defined(_WANT_UCRED)
|
||||||
#ifndef __rtems__
|
|
||||||
struct ucred {
|
struct ucred {
|
||||||
u_int cr_ref; /* reference count */
|
u_int cr_ref; /* reference count */
|
||||||
#define cr_startcopy cr_uid
|
#define cr_startcopy cr_uid
|
||||||
@ -60,20 +59,21 @@ struct ucred {
|
|||||||
gid_t cr_svgid; /* saved group id */
|
gid_t cr_svgid; /* saved group id */
|
||||||
struct uidinfo *cr_uidinfo; /* per euid resource consumption */
|
struct uidinfo *cr_uidinfo; /* per euid resource consumption */
|
||||||
struct uidinfo *cr_ruidinfo; /* per ruid resource consumption */
|
struct uidinfo *cr_ruidinfo; /* per ruid resource consumption */
|
||||||
|
#ifndef __rtems__
|
||||||
struct prison *cr_prison; /* jail(2) */
|
struct prison *cr_prison; /* jail(2) */
|
||||||
struct loginclass *cr_loginclass; /* login class */
|
struct loginclass *cr_loginclass; /* login class */
|
||||||
|
#endif /* __rtems__ */
|
||||||
u_int cr_flags; /* credential flags */
|
u_int cr_flags; /* credential flags */
|
||||||
void *cr_pspare2[2]; /* general use 2 */
|
void *cr_pspare2[2]; /* general use 2 */
|
||||||
#define cr_endcopy cr_label
|
#define cr_endcopy cr_label
|
||||||
struct label *cr_label; /* MAC label */
|
struct label *cr_label; /* MAC label */
|
||||||
|
#ifndef __rtems__
|
||||||
struct auditinfo_addr cr_audit; /* Audit properties. */
|
struct auditinfo_addr cr_audit; /* Audit properties. */
|
||||||
|
#endif /* __rtems__ */
|
||||||
gid_t *cr_groups; /* groups */
|
gid_t *cr_groups; /* groups */
|
||||||
int cr_agroups; /* Available groups */
|
int cr_agroups; /* Available groups */
|
||||||
gid_t cr_smallgroups[XU_NGROUPS]; /* storage for small groups */
|
gid_t cr_smallgroups[XU_NGROUPS]; /* storage for small groups */
|
||||||
};
|
};
|
||||||
#else /* __rtems__ */
|
|
||||||
struct ucred;
|
|
||||||
#endif /* __rtems__ */
|
|
||||||
#define NOCRED ((struct ucred *)0) /* no credential available */
|
#define NOCRED ((struct ucred *)0) /* no credential available */
|
||||||
#define FSCRED ((struct ucred *)-1) /* filesystem credential */
|
#define FSCRED ((struct ucred *)-1) /* filesystem credential */
|
||||||
#endif /* _KERNEL || _WANT_UCRED */
|
#endif /* _KERNEL || _WANT_UCRED */
|
||||||
@ -87,13 +87,11 @@ struct ucred;
|
|||||||
* This is the external representation of struct ucred.
|
* This is the external representation of struct ucred.
|
||||||
*/
|
*/
|
||||||
struct xucred {
|
struct xucred {
|
||||||
#ifndef __rtems__
|
|
||||||
u_int cr_version; /* structure layout version */
|
u_int cr_version; /* structure layout version */
|
||||||
uid_t cr_uid; /* effective user id */
|
uid_t cr_uid; /* effective user id */
|
||||||
short cr_ngroups; /* number of groups */
|
short cr_ngroups; /* number of groups */
|
||||||
gid_t cr_groups[XU_NGROUPS]; /* groups */
|
gid_t cr_groups[XU_NGROUPS]; /* groups */
|
||||||
void *_cr_unused1; /* compatibility with old ucred */
|
void *_cr_unused1; /* compatibility with old ucred */
|
||||||
#endif /* __rtems__ */
|
|
||||||
};
|
};
|
||||||
#define XUCRED_VERSION 0
|
#define XUCRED_VERSION 0
|
||||||
|
|
||||||
@ -104,7 +102,6 @@ struct xucred {
|
|||||||
struct proc;
|
struct proc;
|
||||||
struct thread;
|
struct thread;
|
||||||
|
|
||||||
#ifndef __rtems__
|
|
||||||
void change_egid(struct ucred *newcred, gid_t egid);
|
void change_egid(struct ucred *newcred, gid_t egid);
|
||||||
void change_euid(struct ucred *newcred, struct uidinfo *euip);
|
void change_euid(struct ucred *newcred, struct uidinfo *euip);
|
||||||
void change_rgid(struct ucred *newcred, gid_t rgid);
|
void change_rgid(struct ucred *newcred, gid_t rgid);
|
||||||
@ -115,20 +112,18 @@ void crcopy(struct ucred *dest, struct ucred *src);
|
|||||||
struct ucred *crcopysafe(struct proc *p, struct ucred *cr);
|
struct ucred *crcopysafe(struct proc *p, struct ucred *cr);
|
||||||
struct ucred *crdup(struct ucred *cr);
|
struct ucred *crdup(struct ucred *cr);
|
||||||
void crextend(struct ucred *cr, int n);
|
void crextend(struct ucred *cr, int n);
|
||||||
|
#ifndef __rtems__
|
||||||
void proc_set_cred_init(struct proc *p, struct ucred *cr);
|
void proc_set_cred_init(struct proc *p, struct ucred *cr);
|
||||||
struct ucred *proc_set_cred(struct proc *p, struct ucred *cr);
|
struct ucred *proc_set_cred(struct proc *p, struct ucred *cr);
|
||||||
|
#endif /* __rtems__ */
|
||||||
void crfree(struct ucred *cr);
|
void crfree(struct ucred *cr);
|
||||||
struct ucred *crget(void);
|
struct ucred *crget(void);
|
||||||
struct ucred *crhold(struct ucred *cr);
|
struct ucred *crhold(struct ucred *cr);
|
||||||
|
#ifndef __rtems__
|
||||||
void cru2x(struct ucred *cr, struct xucred *xcr);
|
void cru2x(struct ucred *cr, struct xucred *xcr);
|
||||||
|
#endif /* __rtems__ */
|
||||||
void crsetgroups(struct ucred *cr, int n, gid_t *groups);
|
void crsetgroups(struct ucred *cr, int n, gid_t *groups);
|
||||||
int groupmember(gid_t gid, struct ucred *cred);
|
int groupmember(gid_t gid, struct ucred *cred);
|
||||||
#else /* __rtems__ */
|
|
||||||
#define crfree(cr) do { } while (0)
|
|
||||||
#define crhold(cr) NULL
|
|
||||||
#define cru2x(cr, xcr) do { } while (0)
|
|
||||||
#define groupmember(gid, cred) 1
|
|
||||||
#endif /* __rtems__ */
|
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
#endif /* !_SYS_UCRED_H_ */
|
#endif /* !_SYS_UCRED_H_ */
|
||||||
|
@ -505,6 +505,8 @@ class base(builder.Module):
|
|||||||
'sys/kern/kern_module.c',
|
'sys/kern/kern_module.c',
|
||||||
'sys/kern/kern_mtxpool.c',
|
'sys/kern/kern_mtxpool.c',
|
||||||
'sys/kern/kern_osd.c',
|
'sys/kern/kern_osd.c',
|
||||||
|
'sys/kern/kern_prot.c',
|
||||||
|
'sys/kern/kern_resource.c',
|
||||||
'sys/kern/kern_synch.c',
|
'sys/kern/kern_synch.c',
|
||||||
'sys/kern/kern_sysctl.c',
|
'sys/kern/kern_sysctl.c',
|
||||||
'sys/kern/kern_time.c',
|
'sys/kern/kern_time.c',
|
||||||
|
@ -50,6 +50,9 @@
|
|||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/kbio.h>
|
#include <sys/kbio.h>
|
||||||
|
#include <sys/resourcevar.h>
|
||||||
|
#include <sys/jail.h>
|
||||||
|
#include <uuid/uuid.h>
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
@ -94,6 +97,7 @@ sbintime_t sbt_timethreshold;
|
|||||||
sbintime_t sbt_tickthreshold;
|
sbintime_t sbt_tickthreshold;
|
||||||
struct bintime tc_tick_bt;
|
struct bintime tc_tick_bt;
|
||||||
sbintime_t tc_tick_sbt;
|
sbintime_t tc_tick_sbt;
|
||||||
|
int maxproc;
|
||||||
int tc_precexp;
|
int tc_precexp;
|
||||||
|
|
||||||
static SYSCTL_NODE(_kern, OID_AUTO, smp, CTLFLAG_RD|CTLFLAG_CAPRD, NULL,
|
static SYSCTL_NODE(_kern, OID_AUTO, smp, CTLFLAG_RD|CTLFLAG_CAPRD, NULL,
|
||||||
@ -107,6 +111,38 @@ SYSCTL_INT(_kern_smp, OID_AUTO, maxid, CTLFLAG_RD|CTLFLAG_CAPRD,
|
|||||||
SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD|CTLFLAG_CAPRD,
|
SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD|CTLFLAG_CAPRD,
|
||||||
&maxid_maxcpus, 0, "Max number of CPUs that the system was compiled for.");
|
&maxid_maxcpus, 0, "Max number of CPUs that the system was compiled for.");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a single process. RTEMS is a single address, single process OS.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
proc0_init(void* dummy)
|
||||||
|
{
|
||||||
|
struct proc *p = &proc0;
|
||||||
|
struct ucred *newcred;
|
||||||
|
struct uidinfo tmpuinfo;
|
||||||
|
uuid_t uuid;
|
||||||
|
uihashinit();
|
||||||
|
/* Create the file descriptor table. */
|
||||||
|
newcred = crget();
|
||||||
|
newcred->cr_uid = 0;
|
||||||
|
newcred->cr_ruid = 0;
|
||||||
|
newcred->cr_ngroups = 1; /* group 0 */
|
||||||
|
newcred->cr_groups[0] = 0;
|
||||||
|
newcred->cr_rgid = 0;
|
||||||
|
tmpuinfo.ui_uid = 1;
|
||||||
|
curthread->td_ucred = newcred;
|
||||||
|
newcred->cr_uidinfo = newcred->cr_ruidinfo = &tmpuinfo;
|
||||||
|
newcred->cr_uidinfo = uifind(0);
|
||||||
|
newcred->cr_ruidinfo = uifind(0);
|
||||||
|
p->p_ucred = newcred;
|
||||||
|
p->p_pid = getpid();
|
||||||
|
p->p_fd = NULL;
|
||||||
|
p->p_fdtol = NULL;
|
||||||
|
uuid_generate(uuid);
|
||||||
|
uuid_unparse(uuid, prison0.pr_hostuuid);
|
||||||
|
}
|
||||||
|
SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL);
|
||||||
|
|
||||||
rtems_status_code
|
rtems_status_code
|
||||||
rtems_bsd_initialize(void)
|
rtems_bsd_initialize(void)
|
||||||
{
|
{
|
||||||
@ -135,6 +171,8 @@ rtems_bsd_initialize(void)
|
|||||||
sbt_tickthreshold = bttosbt(bt_tickthreshold);
|
sbt_tickthreshold = bttosbt(bt_tickthreshold);
|
||||||
maxid_maxcpus = (int) rtems_scheduler_get_processor_maximum();
|
maxid_maxcpus = (int) rtems_scheduler_get_processor_maximum();
|
||||||
|
|
||||||
|
maxproc = 16;
|
||||||
|
|
||||||
mkdir("/etc", S_IRWXU | S_IRWXG | S_IRWXO);
|
mkdir("/etc", S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
|
|
||||||
sc = rtems_timer_initiate_server(
|
sc = rtems_timer_initiate_server(
|
||||||
|
@ -90,15 +90,19 @@ struct thread *
|
|||||||
rtems_bsd_thread_create(Thread_Control *thread, int wait)
|
rtems_bsd_thread_create(Thread_Control *thread, int wait)
|
||||||
{
|
{
|
||||||
struct thread *td = malloc(sizeof(*td), M_TEMP, M_ZERO | wait);
|
struct thread *td = malloc(sizeof(*td), M_TEMP, M_ZERO | wait);
|
||||||
struct sleepqueue *sq = sleepq_alloc();
|
|
||||||
|
|
||||||
if (td != NULL && sq != NULL) {
|
if (td != NULL) {
|
||||||
td->td_thread = thread;
|
struct sleepqueue *sq = sleepq_alloc();
|
||||||
td->td_sleepqueue = sq;
|
if (sq != NULL) {
|
||||||
} else {
|
td->td_proc = &proc0;
|
||||||
free(td, M_TEMP);
|
td->td_ucred = proc0.p_ucred;
|
||||||
sleepq_free(sq);
|
td->td_thread = thread;
|
||||||
td = NULL;
|
td->td_sleepqueue = sq;
|
||||||
|
crhold(td->td_ucred);
|
||||||
|
} else {
|
||||||
|
free(td, M_TEMP);
|
||||||
|
td = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->extensions[rtems_bsd_extension_index] = td;
|
thread->extensions[rtems_bsd_extension_index] = td;
|
||||||
@ -167,6 +171,7 @@ rtems_bsd_extension_thread_delete(
|
|||||||
if (td != NULL) {
|
if (td != NULL) {
|
||||||
seltdfini(td);
|
seltdfini(td);
|
||||||
sleepq_free(td->td_sleepqueue);
|
sleepq_free(td->td_sleepqueue);
|
||||||
|
crfree(td->td_ucred);
|
||||||
free(td, M_TEMP);
|
free(td, M_TEMP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -303,7 +308,7 @@ kproc_create(void (*func)(void *), void *arg, struct proc **newpp, int flags, in
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
eno = rtems_bsd_thread_start(newpp, func, arg, flags, pages, fmt, ap);
|
eno = rtems_bsd_thread_start((struct thread**) newpp, func, arg, flags, pages, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
return eno;
|
return eno;
|
||||||
@ -331,6 +336,8 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p, struct thread **new
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
/* the cast here is a hack but passing a proc as a thread struct is just wrong and I
|
||||||
|
* have no idea why it is like this */
|
||||||
eno = rtems_bsd_thread_start(newtdp, func, arg, flags, pages, fmt, ap);
|
eno = rtems_bsd_thread_start(newtdp, func, arg, flags, pages, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user