-tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule)
-{
- tUDI_DriverInstance *inst = NEW_wA(tUDI_DriverInstance, Regions, DriverModule->nRegions);
- udi_primary_init_t *pri_init = DriverModule->InitInfo->primary_init_info;
- inst->Module = DriverModule;
- inst->Regions[0] = UDI_InitRegion(inst, 0, 0, pri_init->rdata_size);
- udi_secondary_init_t *sec_init = DriverModule->InitInfo->secondary_init_list;
- if( sec_init )
- {
- for( int i = 0; sec_init[i].region_idx; i ++ )
- {
- inst->Regions[1+i] = UDI_InitRegion(inst, i,
- sec_init[i].region_idx, sec_init[i].rdata_size);
- }
- }
-
- inst->ManagementChannel = UDI_CreateChannel_Blank(&cMetaLang_Management);
- UDI_BindChannel_Raw(inst->ManagementChannel, true,
- 0, inst->Regions[0]->InitContext, pri_init->mgmt_ops);
-// UDI_BindChannel_Raw(inst->ManagementChannel, false,
-// 1, inst, &cUDI_ManagementMetaagent_Ops); // TODO: ops list for management
-
- for( int i = 0; i < DriverModule->nRegions; i ++ )
- Log("Rgn %i: %p", i, inst->Regions[i]);
-
- // Send usage indication
- char scratch[pri_init->mgmt_scratch_requirement];
- {
- udi_usage_cb_t ucb;
- memset(&ucb, 0, sizeof(ucb));
- ucb.gcb.scratch = scratch;
- ucb.gcb.channel = inst->ManagementChannel;
- udi_usage_ind(&ucb, UDI_RESOURCES_NORMAL);
- // TODO: Ensure that udi_usage_res is called
- }
-
- for( int i = 1; i < DriverModule->nRegions; i ++ )
- {
- //inst->Regions[i]->PriChannel = UDI_CreateChannel_Blank(
- // TODO: Bind secondaries to primary
- }
-
- return inst;
-}
-
-tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize)
-{
-// ASSERTCR( RDataSize, <=, UDI_MIN_ALLOC_LIMIT, NULL );
- ASSERTCR( RDataSize, >=, sizeof(udi_init_context_t), NULL );
- tUDI_DriverRegion *rgn = NEW(tUDI_DriverRegion,+RDataSize);
- rgn->InitContext = (void*)(rgn+1);
- rgn->InitContext->region_idx = Type;
-// rgn->InitContext->limits
- return rgn;
-}
-
-void UDI_int_BeginEnumeration(tUDI_DriverInstance *Inst)
-{
- udi_primary_init_t *pri_init = Inst->Module->InitInfo->primary_init_info;
- char scratch[pri_init->mgmt_scratch_requirement];
- udi_enumerate_cb_t ecb;
- memset(&ecb, 0, sizeof(ecb));
- ecb.gcb.scratch = scratch;
- ecb.gcb.channel = Inst->ManagementChannel;
- ecb.child_data = malloc( pri_init->child_data_size);
- ecb.attr_list = NEW(udi_instance_attr_list_t, *pri_init->enumeration_attr_list_length);
- ecb.attr_valid_length = 0;
- udi_enumerate_req(&ecb, UDI_ENUMERATE_START);
-}
-