Пример #1
0
/*
 *	Only one processor set, the default processor set, in this case.
 */
kern_return_t
host_processor_sets(
	host_t				host,
	processor_set_name_array_t	*pset_list,
	natural_t			*count)
{
	vm_offset_t addr;

	if (host == HOST_NULL)
		return KERN_INVALID_ARGUMENT;

	/*
	 *	Allocate memory.  Can be pageable because it won't be
	 *	touched while holding a lock.
	 */

	addr = kalloc((vm_size_t) sizeof(mach_port_t));
	if (addr == 0)
		return KERN_RESOURCE_SHORTAGE;

	/* take for for convert_pset_name_to_port */
	pset_reference(&default_pset);
	/* do the conversion that Mig should handle */
	*((mach_port_t *) addr) = 
			(mach_port_t) convert_pset_name_to_port(&default_pset);

	*pset_list = (mach_port_t *) addr;
	*count = 1;

	return KERN_SUCCESS;
}
Пример #2
0
/*
 *	Only one processor set, the default processor set, in this case.
 */
kern_return_t
host_processor_sets(
    host_t				host,
    processor_set_name_array_t	*pset_list,
    mach_msg_type_number_t		*count)
{
    vm_offset_t addr;
    boolean_t rt = FALSE; /* ### This boolean is FALSE, because there
			       * currently exists no mechanism to determine
			       * whether or not the reply port is an RT port
			       */

    if (host == HOST_NULL)
        return KERN_INVALID_ARGUMENT;

    /*
     *	Allocate memory.  Can be pageable because it won't be
     *	touched while holding a lock.
     */

    addr = KALLOC((vm_size_t) sizeof(mach_port_t), rt);
    if (addr == 0)
        return KERN_RESOURCE_SHORTAGE;

    /* take ref for convert_pset_name_to_port */
    pset_reference(&default_pset);
    /* do the conversion that Mig should handle */
    *((ipc_port_t *) addr) = convert_pset_name_to_port(&default_pset);

    *pset_list = (mach_port_t *) addr;
    *count = 1;

    return KERN_SUCCESS;
}
Пример #3
0
/*
 *	host_processor_sets:
 *
 *	List all processor sets on the host.
 */
kern_return_t
host_processor_sets(
	host_priv_t			host_priv,
	processor_set_name_array_t	*pset_list,
	mach_msg_type_number_t		*count)
{
	void *addr;

	if (host_priv == HOST_PRIV_NULL)
		return (KERN_INVALID_ARGUMENT);

	/*
	 *	Allocate memory.  Can be pageable because it won't be
	 *	touched while holding a lock.
	 */

	addr = kalloc((vm_size_t) sizeof(mach_port_t));
	if (addr == 0)
		return (KERN_RESOURCE_SHORTAGE);

	/* do the conversion that Mig should handle */
	*((ipc_port_t *) addr) = convert_pset_name_to_port(&pset0);

	*pset_list = (processor_set_array_t)addr;
	*count = 1;

	return (KERN_SUCCESS);
}
Пример #4
0
kern_return_t
host_processor_sets(
	host_t				host,
	processor_set_name_array_t	*pset_list,
	natural_t			*count)
{
	unsigned int actual;	/* this many psets */
	processor_set_t pset;
	processor_set_t *psets;
	int i;

	vm_size_t size;
	vm_size_t size_needed;
	vm_offset_t addr;

	if (host == HOST_NULL)
		return KERN_INVALID_ARGUMENT;

	size = 0; addr = 0;

	for (;;) {
		simple_lock(&all_psets_lock);
		actual = all_psets_count;

		/* do we have the memory we need? */

		size_needed = actual * sizeof(mach_port_t);
		if (size_needed <= size)
			break;

		/* unlock and allocate more memory */
		simple_unlock(&all_psets_lock);

		if (size != 0)
			kfree(addr, size);

		assert(size_needed > 0);
		size = size_needed;

		addr = kalloc(size);
		if (addr == 0)
			return KERN_RESOURCE_SHORTAGE;
	}

	/* OK, have memory and the all_psets_lock */

	psets = (processor_set_t *) addr;

	for (i = 0, pset = (processor_set_t) queue_first(&all_psets);
	     i < actual;
	     i++, pset = (processor_set_t) queue_next(&pset->all_psets)) {
		/* take ref for convert_pset_name_to_port */
		pset_reference(pset);
		psets[i] = pset;
	}
	assert(queue_end(&all_psets, (queue_entry_t) pset));

	/* can unlock now that we've got the pset refs */
	simple_unlock(&all_psets_lock);

	/*
	 *	Always have default port.
	 */

	assert(actual > 0);

	/* if we allocated too much, must copy */

	if (size_needed < size) {
		vm_offset_t newaddr;

		newaddr = kalloc(size_needed);
		if (newaddr == 0) {
			for (i = 0; i < actual; i++)
				pset_deallocate(psets[i]);
			kfree(addr, size);
			return KERN_RESOURCE_SHORTAGE;
		}

		bcopy((char *) addr, (char *) newaddr, size_needed);
		kfree(addr, size);
		psets = (processor_set_t *) newaddr;
	}

	*pset_list = (mach_port_t *) psets;
	*count = actual;

	/* do the conversion that Mig should handle */

	for (i = 0; i < actual; i++)
		((mach_port_t *) psets)[i] =
			(mach_port_t)convert_pset_name_to_port(psets[i]);

	return KERN_SUCCESS;
}
Пример #5
0
kern_return_t
host_processor_sets(
    host_t				host,
    processor_set_name_array_t	*pset_list,
    mach_msg_type_number_t		*count)
{
    unsigned int actual;	/* this many psets */
    processor_set_t pset;
    processor_set_t *psets;
    int i;
    boolean_t rt = FALSE; /* ### This boolean is FALSE, because there
			       * currently exists no mechanism to determine
			       * whether or not the reply port is an RT port
			       */

    vm_size_t size;
    vm_size_t size_needed;
    vm_offset_t addr;

    if (host == HOST_NULL)
        return KERN_INVALID_ARGUMENT;

    size = 0;
    addr = 0;

    for (;;) {
        mutex_lock(&all_psets_lock);
        actual = all_psets_count;

        /* do we have the memory we need? */

        size_needed = actual * sizeof(mach_port_t);
        if (size_needed <= size)
            break;

        /* unlock and allocate more memory */
        mutex_unlock(&all_psets_lock);

        if (size != 0)
            KFREE(addr, size, rt);

        assert(size_needed > 0);
        size = size_needed;

        addr = KALLOC(size, rt);
        if (addr == 0)
            return KERN_RESOURCE_SHORTAGE;
    }

    /* OK, have memory and the all_psets_lock */

    psets = (processor_set_t *) addr;

    for (i = 0, pset = (processor_set_t) queue_first(&all_psets);
            i < actual;
            i++, pset = (processor_set_t) queue_next(&pset->all_psets)) {
        /* take ref for convert_pset_name_to_port */
        pset_reference(pset);
        psets[i] = pset;
    }
    assert(queue_end(&all_psets, (queue_entry_t) pset));

    /* can unlock now that we've got the pset refs */
    mutex_unlock(&all_psets_lock);

    /*
     *	Always have default port.
     */

    assert(actual > 0);

    /* if we allocated too much, must copy */

    if (size_needed < size) {
        vm_offset_t newaddr;

        newaddr = KALLOC(size_needed, rt);
        if (newaddr == 0) {
            for (i = 0; i < actual; i++)
                pset_deallocate(psets[i]);
            KFREE(addr, size, rt);
            return KERN_RESOURCE_SHORTAGE;
        }

        bcopy((char *) addr, (char *) newaddr, size_needed);
        KFREE(addr, size, rt);
        psets = (processor_set_t *) newaddr;
    }

    *pset_list = (mach_port_t *) psets;
    *count = actual;

    /* do the conversion that Mig should handle */

    for (i = 0; i < actual; i++)
        ((ipc_port_t *) psets)[i] = convert_pset_name_to_port(psets[i]);

    return KERN_SUCCESS;
}