Commit 7f7f98734192824c3899458963861f2f62b9ed2c

Authored by bellard
1 parent aebcb60e

endianness and portability fixes


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@434 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 56 additions and 34 deletions
@@ -3319,6 +3319,12 @@ static void host_alarm_handler(int host_signum, siginfo_t *info, @@ -3319,6 +3319,12 @@ static void host_alarm_handler(int host_signum, siginfo_t *info,
3319 } 3319 }
3320 } 3320 }
3321 3321
  3322 +#ifdef CONFIG_SOFTMMU
  3323 +void *get_mmap_addr(unsigned long size)
  3324 +{
  3325 + return NULL;
  3326 +}
  3327 +#else
3322 unsigned long mmap_addr = PHYS_RAM_BASE; 3328 unsigned long mmap_addr = PHYS_RAM_BASE;
3323 3329
3324 void *get_mmap_addr(unsigned long size) 3330 void *get_mmap_addr(unsigned long size)
@@ -3328,6 +3334,7 @@ void *get_mmap_addr(unsigned long size) @@ -3328,6 +3334,7 @@ void *get_mmap_addr(unsigned long size)
3328 mmap_addr += ((size + 4095) & ~4095) + 4096; 3334 mmap_addr += ((size + 4095) & ~4095) + 4096;
3329 return (void *)addr; 3335 return (void *)addr;
3330 } 3336 }
  3337 +#endif
3331 3338
3332 /* main execution loop */ 3339 /* main execution loop */
3333 3340
@@ -3522,7 +3529,7 @@ int main(int argc, char **argv) @@ -3522,7 +3529,7 @@ int main(int argc, char **argv)
3522 struct sigaction act; 3529 struct sigaction act;
3523 struct itimerval itv; 3530 struct itimerval itv;
3524 CPUX86State *env; 3531 CPUX86State *env;
3525 - const char *tmpdir, *initrd_filename; 3532 + const char *initrd_filename;
3526 const char *hd_filename[MAX_DISKS]; 3533 const char *hd_filename[MAX_DISKS];
3527 const char *kernel_filename, *kernel_cmdline; 3534 const char *kernel_filename, *kernel_cmdline;
3528 DisplayState *ds = &display_state; 3535 DisplayState *ds = &display_state;
@@ -3644,32 +3651,47 @@ int main(int argc, char **argv) @@ -3644,32 +3651,47 @@ int main(int argc, char **argv)
3644 net_init(); 3651 net_init();
3645 3652
3646 /* init the memory */ 3653 /* init the memory */
3647 - tmpdir = getenv("QEMU_TMPDIR");  
3648 - if (!tmpdir)  
3649 - tmpdir = "/tmp";  
3650 - snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);  
3651 - if (mkstemp(phys_ram_file) < 0) {  
3652 - fprintf(stderr, "Could not create temporary memory file '%s'\n",  
3653 - phys_ram_file);  
3654 - exit(1);  
3655 - }  
3656 - phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);  
3657 - if (phys_ram_fd < 0) {  
3658 - fprintf(stderr, "Could not open temporary memory file '%s'\n",  
3659 - phys_ram_file);  
3660 - exit(1);  
3661 - }  
3662 total_ram_size = phys_ram_size + vga_ram_size; 3654 total_ram_size = phys_ram_size + vga_ram_size;
3663 - ftruncate(phys_ram_fd, total_ram_size);  
3664 - unlink(phys_ram_file);  
3665 - phys_ram_base = mmap(get_mmap_addr(total_ram_size),  
3666 - total_ram_size,  
3667 - PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED,  
3668 - phys_ram_fd, 0);  
3669 - if (phys_ram_base == MAP_FAILED) {  
3670 - fprintf(stderr, "Could not map physical memory\n"); 3655 +
  3656 +#ifdef CONFIG_SOFTMMU
  3657 + phys_ram_base = malloc(total_ram_size);
  3658 + if (!phys_ram_base) {
  3659 + fprintf(stderr, "Could not allocate physical memory\n");
3671 exit(1); 3660 exit(1);
3672 } 3661 }
  3662 +#else
  3663 + /* as we must map the same page at several addresses, we must use
  3664 + a fd */
  3665 + {
  3666 + const char *tmpdir;
  3667 +
  3668 + tmpdir = getenv("QEMU_TMPDIR");
  3669 + if (!tmpdir)
  3670 + tmpdir = "/tmp";
  3671 + snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
  3672 + if (mkstemp(phys_ram_file) < 0) {
  3673 + fprintf(stderr, "Could not create temporary memory file '%s'\n",
  3674 + phys_ram_file);
  3675 + exit(1);
  3676 + }
  3677 + phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
  3678 + if (phys_ram_fd < 0) {
  3679 + fprintf(stderr, "Could not open temporary memory file '%s'\n",
  3680 + phys_ram_file);
  3681 + exit(1);
  3682 + }
  3683 + ftruncate(phys_ram_fd, total_ram_size);
  3684 + unlink(phys_ram_file);
  3685 + phys_ram_base = mmap(get_mmap_addr(total_ram_size),
  3686 + total_ram_size,
  3687 + PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED,
  3688 + phys_ram_fd, 0);
  3689 + if (phys_ram_base == MAP_FAILED) {
  3690 + fprintf(stderr, "Could not map physical memory\n");
  3691 + exit(1);
  3692 + }
  3693 + }
  3694 +#endif
3673 3695
3674 /* open the virtual block devices */ 3696 /* open the virtual block devices */
3675 for(i = 0; i < MAX_DISKS; i++) { 3697 for(i = 0; i < MAX_DISKS; i++) {
@@ -3717,14 +3739,14 @@ int main(int argc, char **argv) @@ -3717,14 +3739,14 @@ int main(int argc, char **argv)
3717 params = (void *)(phys_ram_base + KERNEL_PARAMS_ADDR); 3739 params = (void *)(phys_ram_base + KERNEL_PARAMS_ADDR);
3718 memset(params, 0, sizeof(struct linux_params)); 3740 memset(params, 0, sizeof(struct linux_params));
3719 params->mount_root_rdonly = 0; 3741 params->mount_root_rdonly = 0;
3720 - params->cl_magic = 0xA33F;  
3721 - params->cl_offset = params->commandline - (uint8_t *)params;  
3722 - params->alt_mem_k = (phys_ram_size / 1024) - 1024; 3742 + stw_raw(&params->cl_magic, 0xA33F);
  3743 + stw_raw(&params->cl_offset, params->commandline - (uint8_t *)params);
  3744 + stl_raw(&params->alt_mem_k, (phys_ram_size / 1024) - 1024);
3723 pstrcat(params->commandline, sizeof(params->commandline), kernel_cmdline); 3745 pstrcat(params->commandline, sizeof(params->commandline), kernel_cmdline);
3724 params->loader_type = 0x01; 3746 params->loader_type = 0x01;
3725 if (initrd_size > 0) { 3747 if (initrd_size > 0) {
3726 - params->initrd_start = INITRD_LOAD_ADDR;  
3727 - params->initrd_size = initrd_size; 3748 + stl_raw(&params->initrd_start, INITRD_LOAD_ADDR);
  3749 + stl_raw(&params->initrd_size, initrd_size);
3728 } 3750 }
3729 params->orig_video_lines = 25; 3751 params->orig_video_lines = 25;
3730 params->orig_video_cols = 80; 3752 params->orig_video_cols = 80;
@@ -3735,11 +3757,11 @@ int main(int argc, char **argv) @@ -3735,11 +3757,11 @@ int main(int argc, char **argv)
3735 3757
3736 memset(params->idt_table, 0, sizeof(params->idt_table)); 3758 memset(params->idt_table, 0, sizeof(params->idt_table));
3737 3759
3738 - params->gdt_table[2] = 0x00cf9a000000ffffLL; /* KERNEL_CS */  
3739 - params->gdt_table[3] = 0x00cf92000000ffffLL; /* KERNEL_DS */ 3760 + stq_raw(&params->gdt_table[2], 0x00cf9a000000ffffLL); /* KERNEL_CS */
  3761 + stq_raw(&params->gdt_table[3], 0x00cf92000000ffffLL); /* KERNEL_DS */
3740 /* for newer kernels (2.6.0) CS/DS are at different addresses */ 3762 /* for newer kernels (2.6.0) CS/DS are at different addresses */
3741 - params->gdt_table[12] = 0x00cf9a000000ffffLL; /* KERNEL_CS */  
3742 - params->gdt_table[13] = 0x00cf92000000ffffLL; /* KERNEL_DS */ 3763 + stq_raw(&params->gdt_table[12], 0x00cf9a000000ffffLL); /* KERNEL_CS */
  3764 + stq_raw(&params->gdt_table[13], 0x00cf92000000ffffLL); /* KERNEL_DS */
3743 3765
3744 env->idt.base = (void *)((uint8_t *)params->idt_table - phys_ram_base); 3766 env->idt.base = (void *)((uint8_t *)params->idt_table - phys_ram_base);
3745 env->idt.limit = sizeof(params->idt_table) - 1; 3767 env->idt.limit = sizeof(params->idt_table) - 1;
@@ -3844,7 +3866,7 @@ int main(int argc, char **argv) @@ -3844,7 +3866,7 @@ int main(int argc, char **argv)
3844 timer_ms = itv.it_interval.tv_usec / 1000; 3866 timer_ms = itv.it_interval.tv_usec / 1000;
3845 pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) / 3867 pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) /
3846 1000000; 3868 1000000;
3847 - 3869 +
3848 if (use_gdbstub) { 3870 if (use_gdbstub) {
3849 cpu_gdbstub(NULL, main_loop, gdbstub_port); 3871 cpu_gdbstub(NULL, main_loop, gdbstub_port);
3850 } else { 3872 } else {