+ }
+ while( false);
+
+ for (i = 0; i < *outputCount; i++)
+ output[i] = SCALAR32(_output[i]);
+
+ return( err);
+}
+
+
+/* Routine io_connect_method_scalarI_structureO */
+kern_return_t is_io_connect_method_scalarI_structureO(
+ io_object_t connect,
+ uint32_t index,
+ io_scalar_inband_t input,
+ mach_msg_type_number_t inputCount,
+ io_struct_inband_t output,
+ mach_msg_type_number_t * outputCount )
+{
+ uint32_t i;
+ io_scalar_inband64_t _input;
+
+ mach_msg_type_number_t scalar_outputCnt = 0;
+ mach_vm_size_t ool_output_size = 0;
+
+ for (i = 0; i < inputCount; i++)
+ _input[i] = SCALAR64(input[i]);
+
+ return (is_io_connect_method(connect, index,
+ _input, inputCount,
+ NULL, 0,
+ 0, 0,
+ output, outputCount,
+ NULL, &scalar_outputCnt,
+ 0, &ool_output_size));
+}
+
+kern_return_t shim_io_connect_method_scalarI_structureO(
+
+ IOExternalMethod * method,
+ IOService * object,
+ const io_user_scalar_t * input,
+ mach_msg_type_number_t inputCount,
+ io_struct_inband_t output,
+ IOByteCount * outputCount )
+{
+ IOMethod func;
+ IOReturn err;
+
+ err = kIOReturnBadArgument;
+
+ do {
+ if( inputCount != method->count0)
+ {
+ IOLog("%s: IOUserClient inputCount count mismatch\n", object->getName());
+ continue;
+ }
+ if( (kIOUCVariableStructureSize != method->count1)
+ && (*outputCount != method->count1))
+ {
+ IOLog("%s: IOUserClient outputCount count mismatch\n", object->getName());
+ continue;
+ }
+
+ func = method->func;
+
+ switch( inputCount) {
+
+ case 5:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ ARG32(input[3]), ARG32(input[4]),
+ output );
+ break;
+ case 4:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ ARG32(input[3]),
+ output, (void *)outputCount );
+ break;
+ case 3:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ output, (void *)outputCount, 0 );
+ break;
+ case 2:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]),
+ output, (void *)outputCount, 0, 0 );
+ break;
+ case 1:
+ err = (object->*func)( ARG32(input[0]),
+ output, (void *)outputCount, 0, 0, 0 );
+ break;
+ case 0:
+ err = (object->*func)( output, (void *)outputCount, 0, 0, 0, 0 );
+ break;
+
+ default:
+ IOLog("%s: Bad method table\n", object->getName());
+ }
+ }
+ while( false);
+
+ return( err);
+}
+
+
+kern_return_t shim_io_async_method_scalarI_structureO(
+ IOExternalAsyncMethod * method,
+ IOService * object,
+ mach_port_t asyncWakePort,
+ io_user_reference_t * asyncReference,
+ uint32_t asyncReferenceCount,
+ const io_user_scalar_t * input,
+ mach_msg_type_number_t inputCount,
+ io_struct_inband_t output,
+ mach_msg_type_number_t * outputCount )
+{
+ IOAsyncMethod func;
+ uint32_t i;
+ IOReturn err;
+ io_async_ref_t reference;
+
+ for (i = 0; i < asyncReferenceCount; i++)
+ reference[i] = REF32(asyncReference[i]);
+
+ err = kIOReturnBadArgument;
+ do {
+ if( inputCount != method->count0)
+ {
+ IOLog("%s: IOUserClient inputCount count mismatch\n", object->getName());
+ continue;
+ }
+ if( (kIOUCVariableStructureSize != method->count1)
+ && (*outputCount != method->count1))
+ {
+ IOLog("%s: IOUserClient outputCount count mismatch\n", object->getName());
+ continue;
+ }
+
+ func = method->func;
+
+ switch( inputCount) {
+
+ case 5:
+ err = (object->*func)( reference,
+ ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ ARG32(input[3]), ARG32(input[4]),
+ output );
+ break;
+ case 4:
+ err = (object->*func)( reference,
+ ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ ARG32(input[3]),
+ output, (void *)outputCount );
+ break;
+ case 3:
+ err = (object->*func)( reference,
+ ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ output, (void *)outputCount, 0 );
+ break;
+ case 2:
+ err = (object->*func)( reference,
+ ARG32(input[0]), ARG32(input[1]),
+ output, (void *)outputCount, 0, 0 );
+ break;
+ case 1:
+ err = (object->*func)( reference,
+ ARG32(input[0]),
+ output, (void *)outputCount, 0, 0, 0 );
+ break;
+ case 0:
+ err = (object->*func)( reference,
+ output, (void *)outputCount, 0, 0, 0, 0 );
+ break;
+
+ default:
+ IOLog("%s: Bad method table\n", object->getName());
+ }
+ }
+ while( false);
+
+ return( err);
+}
+
+/* Routine io_connect_method_scalarI_structureI */
+kern_return_t is_io_connect_method_scalarI_structureI(
+ io_connect_t connect,
+ uint32_t index,
+ io_scalar_inband_t input,
+ mach_msg_type_number_t inputCount,
+ io_struct_inband_t inputStruct,
+ mach_msg_type_number_t inputStructCount )
+{
+ uint32_t i;
+ io_scalar_inband64_t _input;
+
+ mach_msg_type_number_t scalar_outputCnt = 0;
+ mach_msg_type_number_t inband_outputCnt = 0;
+ mach_vm_size_t ool_output_size = 0;
+
+ for (i = 0; i < inputCount; i++)
+ _input[i] = SCALAR64(input[i]);
+
+ return (is_io_connect_method(connect, index,
+ _input, inputCount,
+ inputStruct, inputStructCount,
+ 0, 0,
+ NULL, &inband_outputCnt,
+ NULL, &scalar_outputCnt,
+ 0, &ool_output_size));
+}
+
+kern_return_t shim_io_connect_method_scalarI_structureI(
+ IOExternalMethod * method,
+ IOService * object,
+ const io_user_scalar_t * input,
+ mach_msg_type_number_t inputCount,
+ io_struct_inband_t inputStruct,
+ mach_msg_type_number_t inputStructCount )
+{
+ IOMethod func;
+ IOReturn err = kIOReturnBadArgument;
+
+ do
+ {
+ if( (kIOUCVariableStructureSize != method->count0)
+ && (inputCount != method->count0))
+ {
+ IOLog("%s: IOUserClient inputCount count mismatch\n", object->getName());
+ continue;
+ }
+ if( (kIOUCVariableStructureSize != method->count1)
+ && (inputStructCount != method->count1))
+ {
+ IOLog("%s: IOUserClient outputCount count mismatch\n", object->getName());
+ continue;
+ }
+
+ func = method->func;
+
+ switch( inputCount) {
+
+ case 5:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ ARG32(input[3]), ARG32(input[4]),
+ inputStruct );
+ break;
+ case 4:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), (void *) input[2],
+ ARG32(input[3]),
+ inputStruct, (void *)(uintptr_t)inputStructCount );
+ break;
+ case 3:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]), ARG32(input[2]),
+ inputStruct, (void *)(uintptr_t)inputStructCount,
+ 0 );
+ break;
+ case 2:
+ err = (object->*func)( ARG32(input[0]), ARG32(input[1]),
+ inputStruct, (void *)(uintptr_t)inputStructCount,
+ 0, 0 );
+ break;
+ case 1:
+ err = (object->*func)( ARG32(input[0]),
+ inputStruct, (void *)(uintptr_t)inputStructCount,
+ 0, 0, 0 );
+ break;
+ case 0:
+ err = (object->*func)( inputStruct, (void *)(uintptr_t)inputStructCount,
+ 0, 0, 0, 0 );
+ break;