process.cc (11813:d0586994a10e) | process.cc (11851:824055fe6b30) |
---|---|
1/* 2 * Copyright (c) 2014 Advanced Micro Devices, Inc. 3 * Copyright (c) 2012 ARM Limited 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 47 unchanged lines hidden (view full) --- 56#include "base/intmath.hh" 57#include "base/loader/object_file.hh" 58#include "base/loader/symtab.hh" 59#include "base/statistics.hh" 60#include "config/the_isa.hh" 61#include "cpu/thread_context.hh" 62#include "mem/page_table.hh" 63#include "mem/se_translating_port_proxy.hh" | 1/* 2 * Copyright (c) 2014 Advanced Micro Devices, Inc. 3 * Copyright (c) 2012 ARM Limited 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 47 unchanged lines hidden (view full) --- 56#include "base/intmath.hh" 57#include "base/loader/object_file.hh" 58#include "base/loader/symtab.hh" 59#include "base/statistics.hh" 60#include "config/the_isa.hh" 61#include "cpu/thread_context.hh" 62#include "mem/page_table.hh" 63#include "mem/se_translating_port_proxy.hh" |
64#include "params/LiveProcess.hh" | |
65#include "params/Process.hh" 66#include "sim/emul_driver.hh" 67#include "sim/syscall_desc.hh" 68#include "sim/system.hh" 69 70#if THE_ISA == ALPHA_ISA 71#include "arch/alpha/linux/process.hh" 72#elif THE_ISA == SPARC_ISA --- 48 unchanged lines hidden (view full) --- 121} 122 123static int 124openOutputFile(const string &filename) 125{ 126 return openFile(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664); 127} 128 | 64#include "params/Process.hh" 65#include "sim/emul_driver.hh" 66#include "sim/syscall_desc.hh" 67#include "sim/system.hh" 68 69#if THE_ISA == ALPHA_ISA 70#include "arch/alpha/linux/process.hh" 71#elif THE_ISA == SPARC_ISA --- 48 unchanged lines hidden (view full) --- 120} 121 122static int 123openOutputFile(const string &filename) 124{ 125 return openFile(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664); 126} 127 |
129Process::Process(ProcessParams * params) | 128Process::Process(ProcessParams * params, ObjectFile * obj_file) |
130 : SimObject(params), system(params->system), 131 brk_point(0), stack_base(0), stack_size(0), stack_min(0), 132 max_stack_size(params->max_stack_size), 133 next_thread_stack_base(0), 134 useArchPT(params->useArchPT), 135 kvmInSE(params->kvmInSE), 136 pTable(useArchPT ? 137 static_cast<PageTableBase *>(new ArchPageTable(name(), params->pid, --- 5 unchanged lines hidden (view full) --- 143 imap {{"", -1}, 144 {"cin", STDIN_FILENO}, 145 {"stdin", STDIN_FILENO}}, 146 oemap{{"", -1}, 147 {"cout", STDOUT_FILENO}, 148 {"stdout", STDOUT_FILENO}, 149 {"cerr", STDERR_FILENO}, 150 {"stderr", STDERR_FILENO}}, | 129 : SimObject(params), system(params->system), 130 brk_point(0), stack_base(0), stack_size(0), stack_min(0), 131 max_stack_size(params->max_stack_size), 132 next_thread_stack_base(0), 133 useArchPT(params->useArchPT), 134 kvmInSE(params->kvmInSE), 135 pTable(useArchPT ? 136 static_cast<PageTableBase *>(new ArchPageTable(name(), params->pid, --- 5 unchanged lines hidden (view full) --- 142 imap {{"", -1}, 143 {"cin", STDIN_FILENO}, 144 {"stdin", STDIN_FILENO}}, 145 oemap{{"", -1}, 146 {"cout", STDOUT_FILENO}, 147 {"stdout", STDOUT_FILENO}, 148 {"cerr", STDERR_FILENO}, 149 {"stderr", STDERR_FILENO}}, |
150 objFile(obj_file), 151 argv(params->cmd), envp(params->env), cwd(params->cwd), 152 executable(params->executable), |
|
151 _uid(params->uid), _euid(params->euid), 152 _gid(params->gid), _egid(params->egid), | 153 _uid(params->uid), _euid(params->euid), 154 _gid(params->gid), _egid(params->egid), |
153 _pid(params->pid), _ppid(params->ppid) | 155 _pid(params->pid), _ppid(params->ppid), 156 drivers(params->drivers) |
154{ 155 int sim_fd; 156 std::map<string,int>::iterator it; 157 158 // Search through the input options and set fd if match is found; 159 // otherwise, open an input file and seek to location. 160 FDEntry *fde_stdin = getFDEntry(STDIN_FILENO); 161 if ((it = imap.find(params->input)) != imap.end()) --- 21 unchanged lines hidden (view full) --- 183 else 184 sim_fd = openOutputFile(params->errout); 185 fde_stderr->set(sim_fd, params->errout, O_WRONLY | O_CREAT | O_TRUNC, 186 0664, false); 187 188 mmap_end = 0; 189 nxm_start = nxm_end = 0; 190 // other parameters will be initialized when the program is loaded | 157{ 158 int sim_fd; 159 std::map<string,int>::iterator it; 160 161 // Search through the input options and set fd if match is found; 162 // otherwise, open an input file and seek to location. 163 FDEntry *fde_stdin = getFDEntry(STDIN_FILENO); 164 if ((it = imap.find(params->input)) != imap.end()) --- 21 unchanged lines hidden (view full) --- 186 else 187 sim_fd = openOutputFile(params->errout); 188 fde_stderr->set(sim_fd, params->errout, O_WRONLY | O_CREAT | O_TRUNC, 189 0664, false); 190 191 mmap_end = 0; 192 nxm_start = nxm_end = 0; 193 // other parameters will be initialized when the program is loaded |
194 195 // load up symbols, if any... these may be used for debugging or 196 // profiling. 197 if (!debugSymbolTable) { 198 debugSymbolTable = new SymbolTable(); 199 if (!objFile->loadGlobalSymbols(debugSymbolTable) || 200 !objFile->loadLocalSymbols(debugSymbolTable) || 201 !objFile->loadWeakSymbols(debugSymbolTable)) { 202 // didn't load any symbols 203 delete debugSymbolTable; 204 debugSymbolTable = NULL; 205 } 206 } |
|
191} 192 193 194void 195Process::regStats() 196{ 197 SimObject::regStats(); 198 --- 292 unchanged lines hidden (view full) --- 491Process::map(Addr vaddr, Addr paddr, int size, bool cacheable) 492{ 493 pTable->map(vaddr, paddr, size, 494 cacheable ? PageTableBase::Zero : PageTableBase::Uncacheable); 495 return true; 496} 497 498 | 207} 208 209 210void 211Process::regStats() 212{ 213 SimObject::regStats(); 214 --- 292 unchanged lines hidden (view full) --- 507Process::map(Addr vaddr, Addr paddr, int size, bool cacheable) 508{ 509 pTable->map(vaddr, paddr, size, 510 cacheable ? PageTableBase::Zero : PageTableBase::Uncacheable); 511 return true; 512} 513 514 |
499//////////////////////////////////////////////////////////////////////// 500// 501// LiveProcess member definitions 502// 503//////////////////////////////////////////////////////////////////////// 504 505 506LiveProcess::LiveProcess(LiveProcessParams *params, ObjectFile *_objFile) 507 : Process(params), objFile(_objFile), 508 argv(params->cmd), envp(params->env), cwd(params->cwd), 509 executable(params->executable), 510 drivers(params->drivers) 511{ 512 513 // load up symbols, if any... these may be used for debugging or 514 // profiling. 515 if (!debugSymbolTable) { 516 debugSymbolTable = new SymbolTable(); 517 if (!objFile->loadGlobalSymbols(debugSymbolTable) || 518 !objFile->loadLocalSymbols(debugSymbolTable) || 519 !objFile->loadWeakSymbols(debugSymbolTable)) { 520 // didn't load any symbols 521 delete debugSymbolTable; 522 debugSymbolTable = NULL; 523 } 524 } 525} 526 | |
527void | 515void |
528LiveProcess::syscall(int64_t callnum, ThreadContext *tc) | 516Process::syscall(int64_t callnum, ThreadContext *tc) |
529{ 530 num_syscalls++; 531 532 SyscallDesc *desc = getDesc(callnum); 533 if (desc == NULL) 534 fatal("Syscall %d out of range", callnum); 535 536 desc->doSyscall(callnum, this, tc); 537} 538 539IntReg | 517{ 518 num_syscalls++; 519 520 SyscallDesc *desc = getDesc(callnum); 521 if (desc == NULL) 522 fatal("Syscall %d out of range", callnum); 523 524 desc->doSyscall(callnum, this, tc); 525} 526 527IntReg |
540LiveProcess::getSyscallArg(ThreadContext *tc, int &i, int width) | 528Process::getSyscallArg(ThreadContext *tc, int &i, int width) |
541{ 542 return getSyscallArg(tc, i); 543} 544 545 546EmulatedDriver * | 529{ 530 return getSyscallArg(tc, i); 531} 532 533 534EmulatedDriver * |
547LiveProcess::findDriver(std::string filename) | 535Process::findDriver(std::string filename) |
548{ 549 for (EmulatedDriver *d : drivers) { 550 if (d->match(filename)) 551 return d; 552 } 553 554 return NULL; 555} 556 557void | 536{ 537 for (EmulatedDriver *d : drivers) { 538 if (d->match(filename)) 539 return d; 540 } 541 542 return NULL; 543} 544 545void |
558LiveProcess::updateBias() | 546Process::updateBias() |
559{ 560 ObjectFile *interp = objFile->getInterpreter(); 561 562 if (!interp || !interp->relocatable()) 563 return; 564 565 // Determine how large the interpreters footprint will be in the process 566 // address space. --- 8 unchanged lines hidden (view full) --- 575 // functions to make these adjustments. 576 mmap_end = mmapGrowsDown() ? ld_bias : mmap_end + interp_mapsize; 577 578 interp->updateBias(ld_bias); 579} 580 581 582ObjectFile * | 547{ 548 ObjectFile *interp = objFile->getInterpreter(); 549 550 if (!interp || !interp->relocatable()) 551 return; 552 553 // Determine how large the interpreters footprint will be in the process 554 // address space. --- 8 unchanged lines hidden (view full) --- 563 // functions to make these adjustments. 564 mmap_end = mmapGrowsDown() ? ld_bias : mmap_end + interp_mapsize; 565 566 interp->updateBias(ld_bias); 567} 568 569 570ObjectFile * |
583LiveProcess::getInterpreter() | 571Process::getInterpreter() |
584{ 585 return objFile->getInterpreter(); 586} 587 588 589Addr | 572{ 573 return objFile->getInterpreter(); 574} 575 576 577Addr |
590LiveProcess::getBias() | 578Process::getBias() |
591{ 592 ObjectFile *interp = getInterpreter(); 593 594 return interp ? interp->bias() : objFile->bias(); 595} 596 597 598Addr | 579{ 580 ObjectFile *interp = getInterpreter(); 581 582 return interp ? interp->bias() : objFile->bias(); 583} 584 585 586Addr |
599LiveProcess::getStartPC() | 587Process::getStartPC() |
600{ 601 ObjectFile *interp = getInterpreter(); 602 603 return interp ? interp->entryPoint() : objFile->entryPoint(); 604} 605 606 | 588{ 589 ObjectFile *interp = getInterpreter(); 590 591 return interp ? interp->entryPoint() : objFile->entryPoint(); 592} 593 594 |
607LiveProcess * 608LiveProcess::create(LiveProcessParams * params) | 595Process * 596ProcessParams::create() |
609{ | 597{ |
610 LiveProcess *process = NULL; | 598 Process *process = NULL; |
611 612 // If not specified, set the executable parameter equal to the 613 // simulated system's zeroth command line parameter | 599 600 // If not specified, set the executable parameter equal to the 601 // simulated system's zeroth command line parameter |
614 if (params->executable == "") { 615 params->executable = params->cmd[0]; | 602 if (executable == "") { 603 executable = cmd[0]; |
616 } 617 | 604 } 605 |
618 ObjectFile *objFile = createObjectFile(params->executable); 619 if (objFile == NULL) { 620 fatal("Can't load object file %s", params->executable); | 606 ObjectFile *obj_file = createObjectFile(executable); 607 if (obj_file == NULL) { 608 fatal("Can't load object file %s", executable); |
621 } 622 623#if THE_ISA == ALPHA_ISA | 609 } 610 611#if THE_ISA == ALPHA_ISA |
624 if (objFile->getArch() != ObjectFile::Alpha) | 612 if (obj_file->getArch() != ObjectFile::Alpha) |
625 fatal("Object file architecture does not match compiled ISA (Alpha)."); 626 | 613 fatal("Object file architecture does not match compiled ISA (Alpha)."); 614 |
627 switch (objFile->getOpSys()) { | 615 switch (obj_file->getOpSys()) { |
628 case ObjectFile::UnknownOpSys: 629 warn("Unknown operating system; assuming Linux."); 630 // fall through 631 case ObjectFile::Linux: | 616 case ObjectFile::UnknownOpSys: 617 warn("Unknown operating system; assuming Linux."); 618 // fall through 619 case ObjectFile::Linux: |
632 process = new AlphaLinuxProcess(params, objFile); | 620 process = new AlphaLinuxProcess(this, obj_file); |
633 break; 634 635 default: 636 fatal("Unknown/unsupported operating system."); 637 } 638#elif THE_ISA == SPARC_ISA | 621 break; 622 623 default: 624 fatal("Unknown/unsupported operating system."); 625 } 626#elif THE_ISA == SPARC_ISA |
639 if (objFile->getArch() != ObjectFile::SPARC64 && 640 objFile->getArch() != ObjectFile::SPARC32) | 627 if (obj_file->getArch() != ObjectFile::SPARC64 && 628 obj_file->getArch() != ObjectFile::SPARC32) |
641 fatal("Object file architecture does not match compiled ISA (SPARC)."); | 629 fatal("Object file architecture does not match compiled ISA (SPARC)."); |
642 switch (objFile->getOpSys()) { | 630 switch (obj_file->getOpSys()) { |
643 case ObjectFile::UnknownOpSys: 644 warn("Unknown operating system; assuming Linux."); 645 // fall through 646 case ObjectFile::Linux: | 631 case ObjectFile::UnknownOpSys: 632 warn("Unknown operating system; assuming Linux."); 633 // fall through 634 case ObjectFile::Linux: |
647 if (objFile->getArch() == ObjectFile::SPARC64) { 648 process = new Sparc64LinuxProcess(params, objFile); | 635 if (obj_file->getArch() == ObjectFile::SPARC64) { 636 process = new Sparc64LinuxProcess(this, obj_file); |
649 } else { | 637 } else { |
650 process = new Sparc32LinuxProcess(params, objFile); | 638 process = new Sparc32LinuxProcess(this, obj_file); |
651 } 652 break; 653 654 655 case ObjectFile::Solaris: | 639 } 640 break; 641 642 643 case ObjectFile::Solaris: |
656 process = new SparcSolarisProcess(params, objFile); | 644 process = new SparcSolarisProcess(this, obj_file); |
657 break; 658 659 default: 660 fatal("Unknown/unsupported operating system."); 661 } 662#elif THE_ISA == X86_ISA | 645 break; 646 647 default: 648 fatal("Unknown/unsupported operating system."); 649 } 650#elif THE_ISA == X86_ISA |
663 if (objFile->getArch() != ObjectFile::X86_64 && 664 objFile->getArch() != ObjectFile::I386) | 651 if (obj_file->getArch() != ObjectFile::X86_64 && 652 obj_file->getArch() != ObjectFile::I386) |
665 fatal("Object file architecture does not match compiled ISA (x86)."); | 653 fatal("Object file architecture does not match compiled ISA (x86)."); |
666 switch (objFile->getOpSys()) { | 654 switch (obj_file->getOpSys()) { |
667 case ObjectFile::UnknownOpSys: 668 warn("Unknown operating system; assuming Linux."); 669 // fall through 670 case ObjectFile::Linux: | 655 case ObjectFile::UnknownOpSys: 656 warn("Unknown operating system; assuming Linux."); 657 // fall through 658 case ObjectFile::Linux: |
671 if (objFile->getArch() == ObjectFile::X86_64) { 672 process = new X86_64LinuxProcess(params, objFile); | 659 if (obj_file->getArch() == ObjectFile::X86_64) { 660 process = new X86_64LinuxProcess(this, obj_file); |
673 } else { | 661 } else { |
674 process = new I386LinuxProcess(params, objFile); | 662 process = new I386LinuxProcess(this, obj_file); |
675 } 676 break; 677 678 default: 679 fatal("Unknown/unsupported operating system."); 680 } 681#elif THE_ISA == MIPS_ISA | 663 } 664 break; 665 666 default: 667 fatal("Unknown/unsupported operating system."); 668 } 669#elif THE_ISA == MIPS_ISA |
682 if (objFile->getArch() != ObjectFile::Mips) | 670 if (obj_file->getArch() != ObjectFile::Mips) |
683 fatal("Object file architecture does not match compiled ISA (MIPS)."); | 671 fatal("Object file architecture does not match compiled ISA (MIPS)."); |
684 switch (objFile->getOpSys()) { | 672 switch (obj_file->getOpSys()) { |
685 case ObjectFile::UnknownOpSys: 686 warn("Unknown operating system; assuming Linux."); 687 // fall through 688 case ObjectFile::Linux: | 673 case ObjectFile::UnknownOpSys: 674 warn("Unknown operating system; assuming Linux."); 675 // fall through 676 case ObjectFile::Linux: |
689 process = new MipsLinuxProcess(params, objFile); | 677 process = new MipsLinuxProcess(this, obj_file); |
690 break; 691 692 default: 693 fatal("Unknown/unsupported operating system."); 694 } 695#elif THE_ISA == ARM_ISA | 678 break; 679 680 default: 681 fatal("Unknown/unsupported operating system."); 682 } 683#elif THE_ISA == ARM_ISA |
696 ObjectFile::Arch arch = objFile->getArch(); | 684 ObjectFile::Arch arch = obj_file->getArch(); |
697 if (arch != ObjectFile::Arm && arch != ObjectFile::Thumb && 698 arch != ObjectFile::Arm64) 699 fatal("Object file architecture does not match compiled ISA (ARM)."); | 685 if (arch != ObjectFile::Arm && arch != ObjectFile::Thumb && 686 arch != ObjectFile::Arm64) 687 fatal("Object file architecture does not match compiled ISA (ARM)."); |
700 switch (objFile->getOpSys()) { | 688 switch (obj_file->getOpSys()) { |
701 case ObjectFile::UnknownOpSys: 702 warn("Unknown operating system; assuming Linux."); 703 // fall through 704 case ObjectFile::Linux: 705 if (arch == ObjectFile::Arm64) { | 689 case ObjectFile::UnknownOpSys: 690 warn("Unknown operating system; assuming Linux."); 691 // fall through 692 case ObjectFile::Linux: 693 if (arch == ObjectFile::Arm64) { |
706 process = new ArmLinuxProcess64(params, objFile, 707 objFile->getArch()); | 694 process = new ArmLinuxProcess64(this, obj_file, 695 obj_file->getArch()); |
708 } else { | 696 } else { |
709 process = new ArmLinuxProcess32(params, objFile, 710 objFile->getArch()); | 697 process = new ArmLinuxProcess32(this, obj_file, 698 obj_file->getArch()); |
711 } 712 break; 713 case ObjectFile::FreeBSD: 714 if (arch == ObjectFile::Arm64) { | 699 } 700 break; 701 case ObjectFile::FreeBSD: 702 if (arch == ObjectFile::Arm64) { |
715 process = new ArmFreebsdProcess64(params, objFile, 716 objFile->getArch()); | 703 process = new ArmFreebsdProcess64(this, obj_file, 704 obj_file->getArch()); |
717 } else { | 705 } else { |
718 process = new ArmFreebsdProcess32(params, objFile, 719 objFile->getArch()); | 706 process = new ArmFreebsdProcess32(this, obj_file, 707 obj_file->getArch()); |
720 } 721 break; 722 case ObjectFile::LinuxArmOABI: 723 fatal("M5 does not support ARM OABI binaries. Please recompile with an" 724 " EABI compiler."); 725 default: 726 fatal("Unknown/unsupported operating system."); 727 } 728#elif THE_ISA == POWER_ISA | 708 } 709 break; 710 case ObjectFile::LinuxArmOABI: 711 fatal("M5 does not support ARM OABI binaries. Please recompile with an" 712 " EABI compiler."); 713 default: 714 fatal("Unknown/unsupported operating system."); 715 } 716#elif THE_ISA == POWER_ISA |
729 if (objFile->getArch() != ObjectFile::Power) | 717 if (obj_file->getArch() != ObjectFile::Power) |
730 fatal("Object file architecture does not match compiled ISA (Power)."); | 718 fatal("Object file architecture does not match compiled ISA (Power)."); |
731 switch (objFile->getOpSys()) { | 719 switch (obj_file->getOpSys()) { |
732 case ObjectFile::UnknownOpSys: 733 warn("Unknown operating system; assuming Linux."); 734 // fall through 735 case ObjectFile::Linux: | 720 case ObjectFile::UnknownOpSys: 721 warn("Unknown operating system; assuming Linux."); 722 // fall through 723 case ObjectFile::Linux: |
736 process = new PowerLinuxProcess(params, objFile); | 724 process = new PowerLinuxProcess(this, obj_file); |
737 break; 738 739 default: 740 fatal("Unknown/unsupported operating system."); 741 } 742#elif THE_ISA == RISCV_ISA | 725 break; 726 727 default: 728 fatal("Unknown/unsupported operating system."); 729 } 730#elif THE_ISA == RISCV_ISA |
743 if (objFile->getArch() != ObjectFile::Riscv) | 731 if (obj_file->getArch() != ObjectFile::Riscv) |
744 fatal("Object file architecture does not match compiled ISA (RISCV)."); | 732 fatal("Object file architecture does not match compiled ISA (RISCV)."); |
745 switch (objFile->getOpSys()) { | 733 switch (obj_file->getOpSys()) { |
746 case ObjectFile::UnknownOpSys: 747 warn("Unknown operating system; assuming Linux."); 748 // fall through 749 case ObjectFile::Linux: | 734 case ObjectFile::UnknownOpSys: 735 warn("Unknown operating system; assuming Linux."); 736 // fall through 737 case ObjectFile::Linux: |
750 process = new RiscvLinuxProcess(params, objFile); | 738 process = new RiscvLinuxProcess(this, obj_file); |
751 break; 752 default: 753 fatal("Unknown/unsupported operating system."); 754 } 755#else 756#error "THE_ISA not set" 757#endif 758 759 if (process == NULL) 760 fatal("Unknown error creating process object."); 761 return process; 762} | 739 break; 740 default: 741 fatal("Unknown/unsupported operating system."); 742 } 743#else 744#error "THE_ISA not set" 745#endif 746 747 if (process == NULL) 748 fatal("Unknown error creating process object."); 749 return process; 750} |
763 764LiveProcess * 765LiveProcessParams::create() 766{ 767 return LiveProcess::create(this); 768} | |