diskio: Improve emmc xts, double sector cache
This commit is contained in:
		@@ -40,14 +40,14 @@ extern emmc_part_t *system_part;
 | 
			
		||||
typedef struct {
 | 
			
		||||
    u32 sector;
 | 
			
		||||
    u32 visit_count;
 | 
			
		||||
    u8  align[8];
 | 
			
		||||
    u8  tweak[0x10];
 | 
			
		||||
    u8  cached_sector[0x200];
 | 
			
		||||
    u8  align[8];
 | 
			
		||||
} sector_cache_t;
 | 
			
		||||
 | 
			
		||||
#define MAX_SEC_CACHE_ENTRIES 64
 | 
			
		||||
#define MAX_SEC_CACHE_ENTRIES 128
 | 
			
		||||
static sector_cache_t *sector_cache = NULL;
 | 
			
		||||
static u32 secindex = 0;
 | 
			
		||||
u32 secindex = 0;
 | 
			
		||||
bool clear_sector_cache = false;
 | 
			
		||||
 | 
			
		||||
DSTATUS disk_status (
 | 
			
		||||
@@ -80,8 +80,10 @@ static inline void _gf256_mul_x_le(void *block) {
 | 
			
		||||
 | 
			
		||||
static inline int _emmc_xts(u32 ks1, u32 ks2, u32 enc, u8 *tweak, bool regen_tweak, u32 tweak_exp, u64 sec, void *dst, void *src, u32 secsize) {
 | 
			
		||||
    int res = 0;
 | 
			
		||||
    u8 *pdst = (u8 *)dst;
 | 
			
		||||
    u8 *psrc = (u8 *)src;
 | 
			
		||||
    u8 *temptweak = (u8 *)malloc(0x10);
 | 
			
		||||
	u32 *pdst = (u32 *)dst;
 | 
			
		||||
    u32 *psrc = (u32 *)src;
 | 
			
		||||
    u32 *ptweak = (u32 *)tweak;
 | 
			
		||||
 | 
			
		||||
    if (regen_tweak) {
 | 
			
		||||
        for (int i = 0xF; i >= 0; i--) {
 | 
			
		||||
@@ -95,34 +97,33 @@ static inline int _emmc_xts(u32 ks1, u32 ks2, u32 enc, u8 *tweak, bool regen_twe
 | 
			
		||||
    for (u32 i = 0; i < tweak_exp * 0x20; i++)
 | 
			
		||||
        _gf256_mul_x_le(tweak);
 | 
			
		||||
 | 
			
		||||
    u8 temptweak[0x10];
 | 
			
		||||
    memcpy(temptweak, tweak, 0x10);
 | 
			
		||||
 | 
			
		||||
    //We are assuming a 0x10-aligned sector size in this implementation.
 | 
			
		||||
    for (u32 i = 0; i < secsize / 0x10; i++) {
 | 
			
		||||
        for (u32 j = 0; j < 0x10; j++)
 | 
			
		||||
            pdst[j] = psrc[j] ^ tweak[j];
 | 
			
		||||
        for (u32 j = 0; j < 4; j++)
 | 
			
		||||
            pdst[j] = psrc[j] ^ ptweak[j];
 | 
			
		||||
        _gf256_mul_x_le(tweak);
 | 
			
		||||
        psrc += 0x10;
 | 
			
		||||
        pdst += 0x10;
 | 
			
		||||
        psrc += 4;
 | 
			
		||||
        pdst += 4;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    se_aes_crypt_ecb(ks2, enc, dst, secsize, src, secsize);
 | 
			
		||||
    se_aes_crypt_ecb(ks2, enc, dst, secsize, dst, secsize);
 | 
			
		||||
 | 
			
		||||
    pdst = (u8 *)dst;
 | 
			
		||||
    pdst = (u32 *)dst;
 | 
			
		||||
 | 
			
		||||
    memcpy(tweak, temptweak, 0x10);
 | 
			
		||||
    for (u32 i = 0; i < secsize / 0x10; i++) {
 | 
			
		||||
        for (u32 j = 0; j < 0x10; j++)
 | 
			
		||||
            pdst[j] = pdst[j] ^ tweak[j];
 | 
			
		||||
        for (u32 j = 0; j < 4; j++)
 | 
			
		||||
            pdst[j] = pdst[j] ^ ptweak[j];
 | 
			
		||||
        _gf256_mul_x_le(tweak);
 | 
			
		||||
        pdst += 0x10;
 | 
			
		||||
        pdst += 4;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    res = 1;
 | 
			
		||||
 | 
			
		||||
out:;
 | 
			
		||||
    free(temptweak);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user