summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-23 19:28:40 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-23 19:28:40 +0100
commit9a13aedd4ef04711fc5139c86025272e9648cc4c (patch)
tree49cf0f4e6923df17f023abd5dbb50bd8fa53e8e5 /fs
parent6b8c02a9cf4ac36e42d07c668a2be27d2bf1a733 (diff)
double indirect block support to ELF and check sum calc
Diffstat (limited to 'fs')
-rw-r--r--fs/ext2.c59
1 files changed, 51 insertions, 8 deletions
diff --git a/fs/ext2.c b/fs/ext2.c
index 27fe31e..7322da2 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -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)