Rev 1048 | Rev 1196 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1048 | Rev 1070 | ||
|---|---|---|---|
| Line 163... | Line 163... | ||
| 163 | if ((entry->p_offset % entry->p_align) != (entry->p_vaddr % entry->p_align)) { |
163 | if ((entry->p_offset % entry->p_align) != (entry->p_vaddr % entry->p_align)) { |
| 164 | return EE_INVALID; |
164 | return EE_INVALID; |
| 165 | } |
165 | } |
| 166 | } |
166 | } |
| 167 | 167 | ||
| 168 | /* |
- | |
| 169 | * Check if the segment doesn't interfere with kernel address space. |
- | |
| 170 | */ |
- | |
| 171 | if (entry->p_vaddr + ALIGN_UP(entry->p_memsz, PAGE_SIZE) >= USER_ADDRESS_SPACE_END) |
- | |
| 172 | return EE_MEMORY; |
- | |
| 173 | - | ||
| 174 | if (entry->p_flags & PF_X) |
168 | if (entry->p_flags & PF_X) |
| 175 | flags |= AS_AREA_EXEC; |
169 | flags |= AS_AREA_EXEC; |
| 176 | if (entry->p_flags & PF_W) |
170 | if (entry->p_flags & PF_W) |
| 177 | flags |= AS_AREA_WRITE; |
171 | flags |= AS_AREA_WRITE; |
| 178 | if (entry->p_flags & PF_R) |
172 | if (entry->p_flags & PF_R) |
| Line 193... | Line 187... | ||
| 193 | } else /* Map identically original data */ |
187 | } else /* Map identically original data */ |
| 194 | segment = ((void *) elf) + entry->p_offset; |
188 | segment = ((void *) elf) + entry->p_offset; |
| 195 | 189 | ||
| 196 | a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr); |
190 | a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr); |
| 197 | if (!a) |
191 | if (!a) |
| 198 | return EE_IRRECOVERABLE; |
192 | return EE_MEMORY; |
| 199 | 193 | ||
| 200 | for (i = 0; i < SIZE2FRAMES(entry->p_filesz); i++) { |
194 | for (i = 0; i < SIZE2FRAMES(entry->p_filesz); i++) { |
| 201 | as_set_mapping(as, entry->p_vaddr + i*PAGE_SIZE, KA2PA(((__address) segment) + i*PAGE_SIZE)); |
195 | as_set_mapping(as, entry->p_vaddr + i*PAGE_SIZE, KA2PA(((__address) segment) + i*PAGE_SIZE)); |
| 202 | } |
196 | } |
| 203 | 197 | ||