+/* Routine io_async_user_client_method */
+kern_return_t is_io_connect_async_method
+(
+ io_connect_t connection,
+ mach_port_t wake_port,
+ io_async_ref64_t reference,
+ mach_msg_type_number_t referenceCnt,
+ uint32_t selector,
+ io_scalar_inband64_t scalar_input,
+ mach_msg_type_number_t scalar_inputCnt,
+ io_struct_inband_t inband_input,
+ mach_msg_type_number_t inband_inputCnt,
+ mach_vm_address_t ool_input,
+ mach_vm_size_t ool_input_size,
+ io_struct_inband_t inband_output,
+ mach_msg_type_number_t *inband_outputCnt,
+ io_scalar_inband64_t scalar_output,
+ mach_msg_type_number_t *scalar_outputCnt,
+ mach_vm_address_t ool_output,
+ mach_vm_size_t * ool_output_size
+)
+{
+ CHECK( IOUserClient, connection, client );
+
+ IOExternalMethodArguments args;
+ IOReturn ret;
+ IOMemoryDescriptor * inputMD = 0;
+ IOMemoryDescriptor * outputMD = 0;
+
+ bzero(&args.__reserved[0], sizeof(args.__reserved));
+ args.version = kIOExternalMethodArgumentsCurrentVersion;
+
+ reference[0] = (io_user_reference_t) wake_port;
+ if (vm_map_is_64bit(get_task_map(current_task())))
+ reference[0] |= kIOUCAsync64Flag;
+
+ args.selector = selector;
+
+ args.asyncWakePort = wake_port;
+ args.asyncReference = reference;
+ args.asyncReferenceCount = referenceCnt;
+
+ args.scalarInput = scalar_input;
+ args.scalarInputCount = scalar_inputCnt;
+ args.structureInput = inband_input;
+ args.structureInputSize = inband_inputCnt;
+
+ if (ool_input)
+ inputMD = IOMemoryDescriptor::withAddressRange(ool_input, ool_input_size,
+ kIODirectionOut, current_task());
+
+ args.structureInputDescriptor = inputMD;
+
+ args.scalarOutput = scalar_output;
+ args.scalarOutputCount = *scalar_outputCnt;
+ bzero(&scalar_output[0], *scalar_outputCnt * sizeof(scalar_output[0]));
+ args.structureOutput = inband_output;
+ args.structureOutputSize = *inband_outputCnt;
+
+ if (ool_output)
+ {
+ outputMD = IOMemoryDescriptor::withAddressRange(ool_output, *ool_output_size,
+ kIODirectionIn, current_task());
+ }
+
+ args.structureOutputDescriptor = outputMD;
+ args.structureOutputDescriptorSize = *ool_output_size;
+
+ IOStatisticsClientCall();
+ ret = client->externalMethod( selector, &args );
+
+ *inband_outputCnt = args.structureOutputSize;
+ *ool_output_size = args.structureOutputDescriptorSize;
+
+ if (inputMD)
+ inputMD->release();
+ if (outputMD)
+ outputMD->release();
+
+ return (ret);
+}
+
+/* Routine io_connect_method_scalarI_scalarO */
+kern_return_t is_io_connect_method_scalarI_scalarO(
+ io_object_t connect,
+ uint32_t index,
+ io_scalar_inband_t input,
+ mach_msg_type_number_t inputCount,
+ io_scalar_inband_t output,
+ mach_msg_type_number_t * outputCount )
+{
+ IOReturn err;
+ uint32_t i;
+ io_scalar_inband64_t _input;
+ io_scalar_inband64_t _output;
+
+ mach_msg_type_number_t struct_outputCnt = 0;
+ mach_vm_size_t ool_output_size = 0;
+
+ bzero(&_output[0], sizeof(_output));
+ for (i = 0; i < inputCount; i++)
+ _input[i] = SCALAR64(input[i]);
+
+ err = is_io_connect_method(connect, index,
+ _input, inputCount,
+ NULL, 0,
+ 0, 0,
+ NULL, &struct_outputCnt,
+ _output, outputCount,
+ 0, &ool_output_size);
+
+ for (i = 0; i < *outputCount; i++)
+ output[i] = SCALAR32(_output[i]);
+
+ return (err);
+}
+
+kern_return_t shim_io_connect_method_scalarI_scalarO(
+ IOExternalMethod * method,
+ IOService * object,
+ const io_user_scalar_t * input,
+ mach_msg_type_number_t inputCount,
+ io_user_scalar_t * output,
+ mach_msg_type_number_t * outputCount )