~ubuntu-branches/ubuntu/feisty/basilisk2/feisty

« back to all changes in this revision

Viewing changes to src/Unix/vm_alloc.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2006-06-01 01:11:16 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060601011116-xjhegbgyfsxag5fl
Tags: 0.9.20060529-1
* New upstream CVS snapshot.
* Update local cdbs snippet copyright-check.mk:
  + Broaden scan to also look for "(c)" by default.
  + Make egrep options configurable.
  + Ignore auto-tools files.
* Bump up standards-version to 3.7.2 (no changes needed).
* Let dh_strip do the stripping (not the make install target).

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
#define MAP_EXTRA_FLAGS (MAP_32BIT)
66
66
 
67
67
#ifdef HAVE_MMAP_VM
68
 
#if defined(__linux__) && defined(__i386__)
 
68
#if (defined(__linux__) && defined(__i386__)) || HAVE_LINKER_SCRIPT
69
69
/* Force a reasonnable address below 0x80000000 on x86 so that we
70
70
   don't get addresses above when the program is run on AMD64.
71
71
   NOTE: this is empirically determined on Linux/x86.  */
274
274
 
275
275
                if (ftruncate(fd, size) < 0)
276
276
                        return VM_MAP_FAILED;
277
 
 
278
 
                the_map_flags |= MAP_SHARED;
279
277
        }
280
278
#endif
281
279
 
287
285
                return VM_MAP_FAILED;
288
286
 
289
287
        next_address = (char *)addr + size;
290
 
        
291
 
        // Since I don't know the standard behavior of mmap(), zero-fill here
292
 
        if (memset(addr, 0, size) != addr)
293
 
                return VM_MAP_FAILED;
294
288
 
295
289
        // Remap to 33-bit space
296
290
#ifdef USE_33BIT_ADDRESSING
307
301
#ifdef HAVE_WIN32_VM
308
302
        if ((addr = VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == NULL)
309
303
                return VM_MAP_FAILED;
310
 
 
311
 
        // Zero newly allocated memory
312
 
        if (memset(addr, 0, size) != addr)
313
 
                return VM_MAP_FAILED;
314
304
#else
315
305
        if ((addr = calloc(size, 1)) == 0)
316
306
                return VM_MAP_FAILED;
344
334
                return -1;
345
335
#else
346
336
#ifdef HAVE_MMAP_VM
347
 
        const int extra_map_flags = translate_map_flags(options);
348
 
 
349
 
        if (mmap((caddr_t)addr, size, VM_PAGE_DEFAULT, extra_map_flags | map_flags | MAP_FIXED, zero_fd, 0) == (void *)MAP_FAILED)
350
 
                return -1;
351
 
        
352
 
        // Since I don't know the standard behavior of mmap(), zero-fill here
353
 
        if (memset(addr, 0, size) != addr)
354
 
                return -1;
 
337
        int fd = zero_fd;
 
338
        int the_map_flags = translate_map_flags(options) | map_flags | MAP_FIXED;
 
339
 
 
340
#ifdef USE_33BIT_ADDRESSING
 
341
        const char *shm_file = NULL;
 
342
        if (sizeof(void *) == 8 && (options & VM_MAP_33BIT)) {
 
343
                the_map_flags &= ~(MAP_PRIVATE | MAP_ANON | MAP_ANONYMOUS);
 
344
                the_map_flags |= MAP_SHARED;
 
345
 
 
346
                if ((shm_file = build_shm_filename()) == NULL)
 
347
                        return -1;
 
348
 
 
349
                if ((fd = shm_open(shm_file, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0)
 
350
                        return -1;
 
351
 
 
352
                if (ftruncate(fd, size) < 0)
 
353
                        return -1;
 
354
        }
 
355
#endif
 
356
 
 
357
        if (mmap((caddr_t)addr, size, VM_PAGE_DEFAULT, the_map_flags, fd, 0) == (void *)MAP_FAILED)
 
358
                return -1;
 
359
 
 
360
        // Remap to 33-bit space
 
361
#ifdef USE_33BIT_ADDRESSING
 
362
        if (sizeof(void *) == 8 && (options & VM_MAP_33BIT)) {
 
363
                if (!add_shm_range(strdup(shm_file), addr, size))
 
364
                        return -1;
 
365
 
 
366
                if (mmap((char *)addr + (1L << 32), size, VM_PAGE_DEFAULT, the_map_flags, fd, 0) == (void *)MAP_FAILED)
 
367
                        return -1;
 
368
                close(fd);
 
369
        }
 
370
#endif
355
371
#else
356
372
#ifdef HAVE_WIN32_VM
357
373
        // Windows cannot allocate Low Memory
364
380
        LPVOID ret_addr = VirtualAlloc(req_addr, req_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
365
381
        if (ret_addr != req_addr)
366
382
                return -1;
367
 
 
368
 
        // Zero newly allocated memory
369
 
        if (memset(addr, 0, size) != addr)
370
 
                return -1;
371
383
#else
372
384
        // Unsupported
373
385
        return -1;