- if( (phtab[i].FileSize & 0xFFF) < 0x1000 - (phtab[i].VAddr & 0xFFF) )\r
- lastSize = phtab[i].FileSize;\r
- else\r
- lastSize = (phtab[i].FileSize & 0xFFF) + (phtab[i].VAddr & 0xFFF);\r
- lastSize &= 0xFFF;\r
- \r
- LOG("lastSize = 0x%x", lastSize);\r
- \r
- // Get Pages\r
- count = ( (phtab[i].VAddr&0xFFF) + phtab[i].FileSize + 0xFFF) >> 12;\r
- for( k = 0; k < count; k ++ )\r
- {\r
- ret->Pages[j+k].Virtual = phtab[i].VAddr + (k<<12);\r
- ret->Pages[j+k].Physical = phtab[i].Offset + (k<<12); // Store the offset in the physical address\r
- if(k != 0) {\r
- ret->Pages[j+k].Physical -= ret->Pages[j+k].Virtual&0xFFF;\r
- ret->Pages[j+k].Virtual &= ~0xFFF;\r
- }\r
- if(k == count-1)\r
- ret->Pages[j+k].Size = lastSize; // Byte count in page\r
- else if(k == 0)\r
- ret->Pages[j+k].Size = 4096 - (phtab[i].VAddr&0xFFF);\r
- else\r
- ret->Pages[j+k].Size = 4096;\r
- LOG("ret->Pages[%i].Size = 0x%x", j+k, ret->Pages[j+k].Size);\r
- ret->Pages[j+k].Flags = 0;\r
- }\r
- count = (phtab[i].MemSize + 0xFFF) >> 12;\r
- for(;k<count;k++)\r
- {\r
- ret->Pages[j+k].Virtual = phtab[i].VAddr + (k<<12);\r
- ret->Pages[j+k].Physical = -1; // -1 = Fill with zeros\r
- if(k != 0) ret->Pages[j+k].Virtual &= ~0xFFF;\r
- if(k == count-1 && (phtab[i].MemSize & 0xFFF))\r
- ret->Pages[j+k].Size = phtab[i].MemSize & 0xFFF; // Byte count in page\r
- else\r
- ret->Pages[j+k].Size = 4096;\r
- ret->Pages[j+k].Flags = 0;\r
- LOG("%i - 0x%x => 0x%x - 0x%x", j+k,\r
- ret->Pages[j+k].Physical, ret->Pages[j+k].Virtual, ret->Pages[j+k].Size);\r
- }\r
- j += count;\r
- }\r
- \r
- #if 0\r
- LOG("Cleaning up overlaps");\r
- // Clear up Overlaps\r
- {\r
- struct {\r
- Uint V;\r
- Uint P;\r
- Uint S;\r
- Uint F;\r
- } *tmpRgns;\r
- count = j;\r
- tmpRgns = malloc(sizeof(*tmpRgns)*count);\r
- // Copy\r
- for(i=0;i<count;i++) {\r
- tmpRgns[i].V = ret->Pages[i].Virtual;\r
- tmpRgns[i].P = ret->Pages[i].Physical;\r
- tmpRgns[i].S = ret->Pages[i].Size;\r
- tmpRgns[i].F = ret->Pages[i].Flags;\r
- }\r
- // Compact\r
- for(i=1,j=0; i < count; i++)\r
- { \r
- if( tmpRgns[j].F == tmpRgns[i].F\r
- && tmpRgns[j].V + tmpRgns[j].S == tmpRgns[i].V\r
- && ((tmpRgns[j].P == -1 && tmpRgns[i].P == -1)\r
- || (tmpRgns[j].P + tmpRgns[j].S == tmpRgns[i].P)) )\r
- {\r
- tmpRgns[j].S += tmpRgns[i].S;\r
- } else {\r
- j ++;\r
- tmpRgns[j].V = tmpRgns[i].V;\r
- tmpRgns[j].P = tmpRgns[i].P;\r
- tmpRgns[j].F = tmpRgns[i].F;\r
- tmpRgns[j].S = tmpRgns[i].S;\r
- }\r
- }\r
+ ret->LoadSections[j].Offset = phtab[i].Offset;\r
+ ret->LoadSections[j].FileSize = phtab[i].FileSize;\r
+ ret->LoadSections[j].Virtual = phtab[i].VAddr;\r
+ ret->LoadSections[j].MemSize = phtab[i].MemSize;\r
+ ret->LoadSections[j].Flags = 0;\r
+ if( !(phtab[i].Flags & PF_W) )\r
+ ret->LoadSections[j].Flags |= BIN_SECTFLAG_RO;\r
+ if( phtab[i].Flags & PF_X )\r
+ ret->LoadSections[j].Flags |= BIN_SECTFLAG_EXEC;\r