Lines Matching refs:context
149 SDK_INLINE u32 CARDi_GetHashSectorIndex(const CARDRomHashContext *context, u32 offset) in CARDi_GetHashSectorIndex() argument
151 offset -= context->area_ntr.offset; in CARDi_GetHashSectorIndex()
152 if (offset >= context->area_ntr.length) in CARDi_GetHashSectorIndex()
154 offset += (context->area_ntr.offset - context->area_ltd.offset); in CARDi_GetHashSectorIndex()
155 if (offset < context->area_ltd.length) in CARDi_GetHashSectorIndex()
157 offset += context->area_ntr.length; in CARDi_GetHashSectorIndex()
164 return offset / context->bytes_per_sector; in CARDi_GetHashSectorIndex()
176 static void CARDi_StartLoading(CARDRomHashContext *context) in CARDi_StartLoading() argument
183 if (context->recent_load == NULL) in CARDi_StartLoading()
185 if (context->loading_block) in CARDi_StartLoading()
189 CARDRomHashBlock *block = context->loading_block; in CARDi_StartLoading()
193 context->recent_load = block; in CARDi_StartLoading()
196 … length = MATH_ROUNDUP(mod + CARD_ROM_HASH_SIZE * context->sectors_per_block, CARD_ROM_PAGE_SIZE); in CARDi_StartLoading()
198 else if (context->loading_sector) in CARDi_StartLoading()
200 CARDRomHashSector *sector = context->loading_sector; in CARDi_StartLoading()
201 context->recent_load = sector; in CARDi_StartLoading()
204 length = context->bytes_per_sector; in CARDi_StartLoading()
211 if ((*context->ReadAsync)(context->userdata, buffer, offset, length) == 0) in CARDi_StartLoading()
213 (void)(*context->ReadSync)(context->userdata, buffer, offset, length); in CARDi_StartLoading()
214 CARD_NotifyRomHashReadAsync(context); in CARDi_StartLoading()
228 void CARD_NotifyRomHashReadAsync(CARDRomHashContext *context) in CARD_NotifyRomHashReadAsync() argument
232 if (context->recent_load == context->loading_sector) in CARD_NotifyRomHashReadAsync()
234 CARDRomHashSector *sector = context->loading_sector; in CARD_NotifyRomHashReadAsync()
235 context->loading_sector = sector->next; in CARD_NotifyRomHashReadAsync()
236 sector->next = context->loaded_sector; in CARD_NotifyRomHashReadAsync()
237 context->loaded_sector = sector; in CARD_NotifyRomHashReadAsync()
241 CARDRomHashBlock *block = context->loading_block; in CARD_NotifyRomHashReadAsync()
242 context->loading_block = block->next; in CARD_NotifyRomHashReadAsync()
243 block->next = context->loaded_block; in CARD_NotifyRomHashReadAsync()
244 context->loaded_block = block; in CARD_NotifyRomHashReadAsync()
246 context->recent_load = NULL; in CARD_NotifyRomHashReadAsync()
249 OS_WakeupThreadDirect(context->loader); in CARD_NotifyRomHashReadAsync()
251 CARDi_StartLoading(context); in CARD_NotifyRomHashReadAsync()
265 static CARDRomHashBlock* CARDi_TouchRomHashBlock(CARDRomHashContext *context, u32 sector) in CARDi_TouchRomHashBlock() argument
269 u32 index = sector / context->sectors_per_block; in CARDi_TouchRomHashBlock()
271 CARDRomHashBlock **pp = &context->valid_block; in CARDi_TouchRomHashBlock()
280 block->next = context->valid_block; in CARDi_TouchRomHashBlock()
281 context->valid_block = block; in CARDi_TouchRomHashBlock()
292 for (pp = &context->loaded_block; *pp; pp = &(*pp)->next) in CARDi_TouchRomHashBlock()
303 for (pp = &context->loading_block; *pp; pp = &(*pp)->next) in CARDi_TouchRomHashBlock()
317 …loading->offset = context->sector_hash.offset + index * (CARD_ROM_HASH_SIZE * context->sectors_per… in CARDi_TouchRomHashBlock()
324 CARDi_StartLoading(context); in CARDi_TouchRomHashBlock()
344 static void* CARDi_TouchRomHashSector(CARDRomHashContext *context, u32 offset) in CARDi_TouchRomHashSector() argument
347 CARDRomHashSector **pp = &context->valid_sector; in CARDi_TouchRomHashSector()
349 u32 index = CARDi_GetHashSectorIndex(context, offset); in CARDi_TouchRomHashSector()
350 for (pp = &context->valid_sector; ; pp = &(*pp)->next) in CARDi_TouchRomHashSector()
358 sector->next = context->valid_sector; in CARDi_TouchRomHashSector()
359 context->valid_sector = sector; in CARDi_TouchRomHashSector()
370 for (pp = &context->loading_sector; *pp; pp = &(*pp)->next) in CARDi_TouchRomHashSector()
375 loading->offset = MATH_ROUNDDOWN(offset, context->bytes_per_sector); in CARDi_TouchRomHashSector()
378 (void)CARDi_TouchRomHashBlock(context, index); in CARDi_TouchRomHashSector()
380 CARDi_StartLoading(context); in CARDi_TouchRomHashSector()
404 void CARD_InitRomHashContext(CARDRomHashContext *context, const CARDRomHeaderTWL *header, in CARD_InitRomHashContext() argument
418 context->master_hash = (u8 *)cur; in CARD_InitRomHashContext()
420 context->images = (u8 *)cur; in CARD_InitRomHashContext()
422 context->hashes = (u8 *)cur; in CARD_InitRomHashContext()
424 context->sectors = (CARDRomHashSector *)cur; in CARD_InitRomHashContext()
425 cur += MATH_ROUNDUP(sizeof(*context->sectors) * CARD_ROM_HASH_SECTOR_MAX, 32); in CARD_InitRomHashContext()
426 context->blocks = (CARDRomHashBlock *)cur; in CARD_InitRomHashContext()
427 cur += MATH_ROUNDUP(sizeof(*context->blocks) * CARD_ROM_HASH_BLOCK_MAX, 32); in CARD_InitRomHashContext()
436 context->area_ntr = header->digest_area_ntr; in CARD_InitRomHashContext()
437 context->area_ltd = header->digest_area_ltd; in CARD_InitRomHashContext()
438 context->sector_hash = header->digest_tabel1; in CARD_InitRomHashContext()
439 context->block_hash = header->digest_tabel2; in CARD_InitRomHashContext()
440 context->bytes_per_sector = bytes_per_sector; in CARD_InitRomHashContext()
441 context->sectors_per_block = sectors_per_block; in CARD_InitRomHashContext()
442 context->block_max = CARD_ROM_HASH_BLOCK_MAX; in CARD_InitRomHashContext()
443 context->sector_max = CARD_ROM_HASH_SECTOR_MAX; in CARD_InitRomHashContext()
445 context->ReadSync = sync; in CARD_InitRomHashContext()
446 context->ReadAsync = async; in CARD_InitRomHashContext()
447 context->userdata = userdata; in CARD_InitRomHashContext()
466 …(void)(*context->ReadSync)(context->userdata, context->master_hash, context->block_hash.offset, co… in CARD_InitRomHashContext()
467 … CARDi_CompareHash(header->digest_tabel2_digest, context->master_hash, context->block_hash.length); in CARD_InitRomHashContext()
470 CARDRomHashSector *sectors = context->sectors; in CARD_InitRomHashContext()
473 for (i = 0; i < context->sector_max; ++i) in CARD_InitRomHashContext()
476 sectors[i].image = &context->images[i * context->bytes_per_sector]; in CARD_InitRomHashContext()
479 context->sectors[0].next = NULL; in CARD_InitRomHashContext()
480 context->valid_sector = &context->sectors[context->sector_max - 1]; in CARD_InitRomHashContext()
481 context->loading_sector = NULL; in CARD_InitRomHashContext()
482 context->loaded_sector = NULL; in CARD_InitRomHashContext()
486 CARDRomHashBlock *blocks = context->blocks; in CARD_InitRomHashContext()
489 for (i = 0; i < context->block_max; ++i) in CARD_InitRomHashContext()
493 blocks[i].hash_aligned = &context->hashes[i * unit]; in CARD_InitRomHashContext()
495 context->valid_block = &context->blocks[0]; in CARD_InitRomHashContext()
496 context->blocks[context->block_max - 1].next = NULL; in CARD_InitRomHashContext()
497 context->loading_block = NULL; in CARD_InitRomHashContext()
498 context->loaded_block = NULL; in CARD_InitRomHashContext()
515 static void CARDi_ReadRomHashImageDirect(CARDRomHashContext *context, void *buffer, u32 offset, u32… in CARDi_ReadRomHashImageDirect() argument
517 const u32 sectunit = context->bytes_per_sector; in CARDi_ReadRomHashImageDirect()
518 const u32 blckunit = context->sectors_per_block; in CARDi_ReadRomHashImageDirect()
521 u32 sector = CARDi_GetHashSectorIndex(context, position); in CARDi_ReadRomHashImageDirect()
525 …u32 available = (u32)(*context->ReadSync)(context->userdata, buffer, position, end - position); in CARDi_ReadRomHashImageDirect()
527 (void)CARDi_TouchRomHashBlock(context, sector); in CARDi_ReadRomHashImageDirect()
529 if (context->ReadAsync && (position + available < end)) in CARDi_ReadRomHashImageDirect()
531 …(void)(*context->ReadAsync)(context->userdata, NULL, position + available, end - (position + avail… in CARDi_ReadRomHashImageDirect()
536 CARDRomHashBlock *block = CARDi_TouchRomHashBlock(context, sector); in CARDi_ReadRomHashImageDirect()
541 if (block != context->valid_block) in CARDi_ReadRomHashImageDirect()
544 while (context->loading_block) in CARDi_ReadRomHashImageDirect()
548 if (block == context->loaded_block) in CARDi_ReadRomHashImageDirect()
550 context->loaded_block = block->next; in CARDi_ReadRomHashImageDirect()
553 CARDi_CompareHash(&context->master_hash[block->index * CARD_ROM_HASH_SIZE], in CARDi_ReadRomHashImageDirect()
555 block->next = context->valid_block; in CARDi_ReadRomHashImageDirect()
556 context->valid_block = block; in CARDi_ReadRomHashImageDirect()
582 static void CARDi_ReadRomHashImageCaching(CARDRomHashContext *context, void *buffer, u32 offset, u3… in CARDi_ReadRomHashImageCaching() argument
587 void *image = CARDi_TouchRomHashSector(context, offset); in CARDi_ReadRomHashImageCaching()
591 u32 max = context->bytes_per_sector; in CARDi_ReadRomHashImageCaching()
605 u32 hit = MATH_ROUNDDOWN(offset, context->bytes_per_sector); in CARDi_ReadRomHashImageCaching()
606 while (context->valid_sector && context->valid_block) in CARDi_ReadRomHashImageCaching()
608 hit += context->bytes_per_sector; in CARDi_ReadRomHashImageCaching()
613 (void)CARDi_TouchRomHashSector(context, hit); in CARDi_ReadRomHashImageCaching()
621 while ((context->loading_sector && !context->loaded_sector) || in CARDi_ReadRomHashImageCaching()
622 (context->loading_block && !context->loaded_block)) in CARDi_ReadRomHashImageCaching()
627 block = context->loaded_block; in CARDi_ReadRomHashImageCaching()
630 context->loaded_block = block->next; in CARDi_ReadRomHashImageCaching()
634 sector = context->loaded_sector; in CARDi_ReadRomHashImageCaching()
637 context->loaded_sector = sector->next; in CARDi_ReadRomHashImageCaching()
644 u32 len = CARD_ROM_HASH_SIZE * context->sectors_per_block; in CARDi_ReadRomHashImageCaching()
645 … CARDi_CompareHash(&context->master_hash[block->index * CARD_ROM_HASH_SIZE], block->hash, len); in CARDi_ReadRomHashImageCaching()
647 block->next = context->valid_block; in CARDi_ReadRomHashImageCaching()
648 context->valid_block = block; in CARDi_ReadRomHashImageCaching()
652 CARDRomHashBlock *block = CARDi_TouchRomHashBlock(context, sector->index); in CARDi_ReadRomHashImageCaching()
653 … u32 slot = sector->index - block->index * context->sectors_per_block; in CARDi_ReadRomHashImageCaching()
654 …ARDi_CompareHash(&block->hash[slot * CARD_ROM_HASH_SIZE], sector->image, context->bytes_per_sector… in CARDi_ReadRomHashImageCaching()
656 sector->next = context->valid_sector; in CARDi_ReadRomHashImageCaching()
657 context->valid_sector = sector; in CARDi_ReadRomHashImageCaching()
679 void CARD_ReadRomHashImage(CARDRomHashContext *context, void *buffer, u32 offset, u32 length) in CARD_ReadRomHashImage() argument
682 context->loader = OS_GetCurrentThread(); in CARD_ReadRomHashImage()
683 context->recent_load = NULL; in CARD_ReadRomHashImage()
686 if ((length >= context->bytes_per_sector * (CARD_ROM_HASH_SECTOR_MAX / 2)) in CARD_ReadRomHashImage()
695 const u32 sectmask = (u32)(context->bytes_per_sector - 1UL); in CARD_ReadRomHashImage()
696 const u32 headlen = (u32)((context->bytes_per_sector - offset) & sectmask); in CARD_ReadRomHashImage()
701 CARDi_ReadRomHashImageCaching(context, buffer, offset, headlen); in CARD_ReadRomHashImage()
709 CARDi_ReadRomHashImageDirect(context, buffer, offset, bodylen); in CARD_ReadRomHashImage()
716 CARDi_ReadRomHashImageCaching(context, buffer, offset, length); in CARD_ReadRomHashImage()