diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-23 19:28:40 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-23 19:28:40 +0100 |
| commit | 9a13aedd4ef04711fc5139c86025272e9648cc4c (patch) | |
| tree | 49cf0f4e6923df17f023abd5dbb50bd8fa53e8e5 /fs | |
| parent | 6b8c02a9cf4ac36e42d07c668a2be27d2bf1a733 (diff) | |
double indirect block support to ELF and check sum calc
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext2.c | 59 |
1 files changed, 51 insertions, 8 deletions
@@ -153,6 +153,31 @@ ext2_inode ext2_get_inode(uint8_t *ram,int inode_num) } +void* ext2_get_blockstart(void* start, uint32_t block_size, uint32_t block_idx) +{ + return (start+block_size*block_idx); +} + +void* ext2_get_indirectstart(void *start, uint32_t block_size, uint32_t indirect1_idx, uint32_t block_idx) +{ + uint32_t *indirect_ptr=ext2_get_blockstart(start,block_size,indirect1_idx); + void *ptr=ext2_get_blockstart(start,block_size,indirect_ptr[block_idx]); + return ptr; +} + +void* ext2_get_indirectstart_double(void *start, uint32_t block_size, uint32_t indirect2_idx, uint32_t block_idx) +{ + + //doubly indirect list + uint32_t *dil=ext2_get_blockstart(start,block_size,indirect2_idx); + + int indirect1_idx=block_idx/(block_size/4); + int idx=block_idx%(block_size/4); + + //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bl: %d : %d / %d",block_idx,indirect1_idx, idx); + + return ext2_get_indirectstart(start,block_size,dil[indirect1_idx],idx); +} int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) { @@ -162,31 +187,48 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) int block=0; int block_size=1024; int block_counter=0; - uint8_t *ptr=ram+block_size*inode.direct_pointer[0]; + uint8_t *ptr=ext2_get_blockstart(ram,block_size,inode.direct_pointer[0]); + int sum=0; + int count=0; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Loading %d %d bytes",inode.size_high, inode.size_low); - while(pos<inode.size_low) // use size high? + + while(pos<inode.size_low) // TODO: use size high! { ramdest[pos]=*ptr; + + sum = (sum >> 1) + ((sum & 1) << 15); + sum+=(int)*ptr; + sum&=0xffff; + count++; ptr++; block_counter++; pos++; + if(block_counter>=block_size) { block++; - if(block>=12) + if(block<12) { - int indirect_block=block-12; - uint32_t *indirect_ptr=ram+block_size*inode.indirect1; - ptr=ram+block_size*indirect_ptr[indirect_block]; + ptr=ext2_get_blockstart(ram,block_size,inode.direct_pointer[block]); } + else if(block-12<block_size/4) + { + ptr=ext2_get_indirectstart(ram,block_size,inode.indirect1,block-12); + } + + else if(block-12-block_size/4<1024/4*1024/4) + { + ptr=ext2_get_indirectstart_double(ram,block_size,inode.indirect2,block-12-block_size/4); + } else { - ptr=ram+block_size*inode.direct_pointer[block]; + panic(FOOLOS_MODULE_NAME,"Triplu Indirect Block Pointers not supported yet, file is too big to load, sorry!"); } + block_counter=0; } @@ -194,7 +236,8 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) } -// if(block>=12)panic(FOOLOS_MODULE_NAME,"such big files unsupported yet"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Fool Check Sum: 0x%08X for %d bytes",sum,count); + } int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max) |
