Subversion Repositories HelenOS

Rev

Rev 1977 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1977 Rev 2048
Line 231... Line 231...
231
 
231
 
232
    return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt,
232
    return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt,
233
        phys_hi, phys_lo);
233
        phys_hi, phys_lo);
234
}
234
}
235
 
235
 
-
 
236
/** Save OpenFirmware physical memory map.
-
 
237
 *
-
 
238
 * @param map Memory map structure where the map will be saved.
236
 
239
 *
-
 
240
 * @return Zero on failure, non-zero on success.
-
 
241
 */
237
int ofw_memmap(memmap_t *map)
242
int ofw_memmap(memmap_t *map)
238
{
243
{
239
    unsigned int ac = ofw_get_address_cells(ofw_memory);
244
    unsigned int ac = ofw_get_address_cells(ofw_memory);
240
    unsigned int sc = ofw_get_size_cells(ofw_memory);
245
    unsigned int sc = ofw_get_size_cells(ofw_memory);
241
 
246
 
242
    uint32_t buf[((ac+sc)*MEMMAP_MAX_RECORDS)];
247
    uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)];
243
    int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf));
248
    int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf));
244
    if (ret <= 0)       /* ret is the number of written bytes */
249
    if (ret <= 0)       /* ret is the number of written bytes */
245
        return false;
250
        return false;
246
 
251
 
247
    int pos;
252
    int pos;
248
    map->total = 0;
253
    map->total = 0;
249
    map->count = 0;
254
    map->count = 0;
250
    for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) {
255
    for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count <
-
 
256
        MEMMAP_MAX_RECORDS); pos += ac + sc) {
251
        void * start = (void *) ((uintptr_t) buf[pos + ac - 1]);
257
        void * start = (void *) ((uintptr_t) buf[pos + ac - 1]);
252
        unsigned int size = buf[pos + ac + sc - 1];
258
        unsigned int size = buf[pos + ac + sc - 1];
253
       
259
       
254
        if (size > 0) {
260
        if (size > 0) {
255
            map->zones[map->count].start = start;
261
            map->zones[map->count].start = start;