#include <mach/vm_prot.h>
#include <mach/vm_inherit.h>
#include <mach/kern_return.h>
-#include <mach/memory_object_control.h>
#include <vm/vm_map.h>
#include <vm/vm_protos.h>
-#define f_flag f_fglob->fg_flag
-#define f_type f_fglob->fg_ops->fo_type
-#define f_msgcount f_fglob->fg_msgcount
-#define f_cred f_fglob->fg_cred
-#define f_ops f_fglob->fg_ops
-#define f_offset f_fglob->fg_offset
-#define f_data f_fglob->fg_data
+#define f_flag fp_glob->fg_flag
+#define f_ops fp_glob->fg_ops
+#define f_data fp_glob->fg_data
/*
* Used to construct the list of memory objects
/*
* Everything here is protected by a single mutex.
*/
-static lck_grp_t *psx_shm_subsys_lck_grp;
-static lck_grp_attr_t *psx_shm_subsys_lck_grp_attr;
-static lck_attr_t *psx_shm_subsys_lck_attr;
-static lck_mtx_t psx_shm_subsys_mutex;
+static LCK_GRP_DECLARE(psx_shm_subsys_lck_grp, "posix shared memory");
+static LCK_MTX_DECLARE(psx_shm_subsys_mutex, &psx_shm_subsys_lck_grp);
#define PSHM_SUBSYS_LOCK() lck_mtx_lock(& psx_shm_subsys_mutex)
#define PSHM_SUBSYS_UNLOCK() lck_mtx_unlock(& psx_shm_subsys_mutex)
#define PSHM_SUBSYS_ASSERT_HELD() LCK_MTX_ASSERT(&psx_shm_subsys_mutex, LCK_MTX_ASSERT_OWNED)
-
-__private_extern__ void
-pshm_lock_init( void )
-{
- psx_shm_subsys_lck_grp_attr = lck_grp_attr_alloc_init();
-
- psx_shm_subsys_lck_grp =
- lck_grp_alloc_init("posix shared memory", psx_shm_subsys_lck_grp_attr);
-
- psx_shm_subsys_lck_attr = lck_attr_alloc_init();
- lck_mtx_init(&psx_shm_subsys_mutex, psx_shm_subsys_lck_grp, psx_shm_subsys_lck_attr);
-}
-
/*
* Lookup an entry in the cache. Only the name is used from "look".
*/
pshmnode_t *new_pnode = NULL;
struct fileproc *fp = NULL;
int fmode;
- int cmode = uap->mode;
+ mode_t cmode = (mode_t)uap->mode;
bool incache = false;
bool have_label = false;
AUDIT_ARG(fflags, uap->oflag);
- AUDIT_ARG(mode, uap->mode);
+ AUDIT_ARG(mode, cmode);
/*
* Allocate data structures we need. We parse the userspace name into
* a pshm_info_t, even when we don't need to O_CREAT.
*/
- MALLOC(new_pinfo, pshm_info_t *, sizeof(pshm_info_t), M_SHM, M_WAITOK | M_ZERO);
+ new_pinfo = kheap_alloc(KM_SHM, sizeof(pshm_info_t), Z_WAITOK | Z_ZERO);
if (new_pinfo == NULL) {
error = ENOSPC;
goto bad;
/*
* Will need a new pnode for the file pointer
*/
- MALLOC(new_pnode, pshmnode_t *, sizeof(pshmnode_t), M_SHM, M_WAITOK | M_ZERO);
+ new_pnode = kheap_alloc(KM_SHM, sizeof(pshmnode_t),
+ Z_WAITOK | Z_ZERO);
if (new_pnode == NULL) {
error = ENOSPC;
goto bad;
/*
* Delete any allocated unused data structures.
*/
- if (new_pnode != NULL) {
- FREE(new_pnode, M_SHM);
- }
+ kheap_free(KM_SHM, new_pnode, sizeof(pshmnode_t));
if (fp != NULL) {
fp_free(p, indx, fp);
mac_posixshm_label_destroy(&new_pinfo->pshm_hdr);
}
#endif
- FREE(new_pinfo, M_SHM);
+ kheap_free(KM_SHM, new_pinfo, sizeof(pshm_info_t));
}
return error;
}
user_map = current_map();
- if (fp->f_type != DTYPE_PSXSHM) {
+ if (FILEGLOB_DTYPE(fp->fp_glob) != DTYPE_PSXSHM) {
return EINVAL;
}
}
/* get a list entry to track the memory object */
- MALLOC(pshmobj, pshm_mobj_t *, sizeof(pshm_mobj_t), M_SHM, M_WAITOK);
+ pshmobj = kheap_alloc(KM_SHM, sizeof(pshm_mobj_t), Z_WAITOK);
if (pshmobj == NULL) {
kret = KERN_NO_SPACE;
mach_memory_entry_port_release(mem_object);
SLIST_REMOVE_HEAD(&pinfo->pshm_mobjs, pshmo_next);
PSHM_SUBSYS_UNLOCK();
mach_memory_entry_port_release(pshmobj->pshmo_memobject);
- FREE(pshmobj, M_SHM);
+ kheap_free(KM_SHM, pshmobj, sizeof(pshm_mobj_t));
PSHM_SUBSYS_LOCK();
}
pinfo->pshm_flags &= ~PSHM_ALLOCATING;
static int
pshm_access(pshm_info_t *pinfo, int mode, kauth_cred_t cred, __unused proc_t p)
{
- int mode_req = ((mode & FREAD) ? S_IRUSR : 0) |
+ mode_t mode_req = ((mode & FREAD) ? S_IRUSR : 0) |
((mode & FWRITE) ? S_IWUSR : 0);
/* Otherwise, user id 0 always gets access. */
if (file_pos >= map_pos + pshmobj->pshmo_size) {
continue;
}
- map_size = pshmobj->pshmo_size - (file_pos - map_pos);
+ map_size = (vm_map_size_t)(pshmobj->pshmo_size - (file_pos - map_pos));
if (map_size > user_size) {
map_size = user_size;
}
switch (kret) {
case KERN_SUCCESS:
- *retval = (user_start_addr + pageoff);
+ *retval = (user_addr_t)(user_start_addr + pageoff);
return 0;
case KERN_INVALID_ADDRESS:
case KERN_NO_SPACE:
/*
* Get the name from user args.
*/
- MALLOC(name_pinfo, pshm_info_t *, sizeof(pshm_info_t), M_SHM, M_WAITOK | M_ZERO);
+ name_pinfo = kheap_alloc(KHEAP_TEMP, sizeof(pshm_info_t),
+ Z_WAITOK | Z_ZERO);
if (name_pinfo == NULL) {
error = ENOSPC;
goto bad;
bad_unlock:
PSHM_SUBSYS_UNLOCK();
bad:
- if (name_pinfo != NULL) {
- FREE(name_pinfo, M_SHM);
- }
+ kheap_free(KHEAP_TEMP, name_pinfo, sizeof(pshm_info_t));
return error;
}
while ((pshmobj = SLIST_FIRST(&pinfo->pshm_mobjs)) != NULL) {
SLIST_REMOVE_HEAD(&pinfo->pshm_mobjs, pshmo_next);
mach_memory_entry_port_release(pshmobj->pshmo_memobject);
- FREE(pshmobj, M_SHM);
+ kheap_free(KM_SHM, pshmobj, sizeof(pshm_mobj_t));
}
/* free the pinfo itself */
- FREE(pinfo, M_SHM);
+ kheap_free(KM_SHM, pinfo, sizeof(pshm_info_t));
PSHM_SUBSYS_LOCK();
}
}
PSHM_SUBSYS_UNLOCK();
- if (pnode != NULL) {
- FREE(pnode, M_SHM);
- }
+ kheap_free(KM_SHM, pnode, sizeof(pshmnode_t));
return error;
}