system.cc revision 7737
15299Sgblack@eecs.umich.edu/*
25450Sgblack@eecs.umich.edu * Copyright (c) 2007-2008 The Hewlett-Packard Development Company
35299Sgblack@eecs.umich.edu * All rights reserved.
45299Sgblack@eecs.umich.edu *
57087Snate@binkert.org * The license below extends only to copyright in the software and shall
67087Snate@binkert.org * not be construed as granting a license to any other intellectual
77087Snate@binkert.org * property including but not limited to intellectual property relating
87087Snate@binkert.org * to a hardware implementation of the functionality of the software
97087Snate@binkert.org * licensed hereunder.  You may use the software subject to the license
107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated
117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software,
127087Snate@binkert.org * modified or unmodified, in source code or in binary form.
135299Sgblack@eecs.umich.edu *
147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
157087Snate@binkert.org * modification, are permitted provided that the following conditions are
167087Snate@binkert.org * met: redistributions of source code must retain the above copyright
177087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
207087Snate@binkert.org * documentation and/or other materials provided with the distribution;
217087Snate@binkert.org * neither the name of the copyright holders nor the names of its
225299Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237087Snate@binkert.org * this software without specific prior written permission.
245299Sgblack@eecs.umich.edu *
255299Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
265299Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
275299Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
285299Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
295299Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
305299Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
315299Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
325299Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
335299Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
345299Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
355299Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
365299Sgblack@eecs.umich.edu *
375299Sgblack@eecs.umich.edu * Authors: Gabe Black
385299Sgblack@eecs.umich.edu */
395299Sgblack@eecs.umich.edu
407737Sgblack@eecs.umich.edu#include "arch/x86/isa_traits.hh"
415299Sgblack@eecs.umich.edu#include "arch/x86/linux/system.hh"
427629Sgblack@eecs.umich.edu#include "arch/x86/regs/int.hh"
435299Sgblack@eecs.umich.edu#include "arch/vtophys.hh"
445299Sgblack@eecs.umich.edu#include "base/trace.hh"
455303Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
465299Sgblack@eecs.umich.edu#include "mem/physical.hh"
475299Sgblack@eecs.umich.edu#include "params/LinuxX86System.hh"
487737Sgblack@eecs.umich.edu#include "sim/byteswap.hh"
495299Sgblack@eecs.umich.edu
505299Sgblack@eecs.umich.edu
515299Sgblack@eecs.umich.eduusing namespace LittleEndianGuest;
525299Sgblack@eecs.umich.eduusing namespace X86ISA;
535299Sgblack@eecs.umich.edu
545299Sgblack@eecs.umich.eduLinuxX86System::LinuxX86System(Params *p)
555450Sgblack@eecs.umich.edu    : X86System(p), commandLine(p->boot_osflags), e820Table(p->e820_table)
565299Sgblack@eecs.umich.edu{
575299Sgblack@eecs.umich.edu}
585299Sgblack@eecs.umich.edu
595299Sgblack@eecs.umich.eduLinuxX86System::~LinuxX86System()
605299Sgblack@eecs.umich.edu{
615299Sgblack@eecs.umich.edu}
625299Sgblack@eecs.umich.edu
635299Sgblack@eecs.umich.eduvoid
647532Ssteve.reinhardt@amd.comLinuxX86System::initState()
655299Sgblack@eecs.umich.edu{
667532Ssteve.reinhardt@amd.com    X86System::initState();
675303Sgblack@eecs.umich.edu
685303Sgblack@eecs.umich.edu    // The location of the real mode data structure.
695303Sgblack@eecs.umich.edu    const Addr realModeData = 0x90200;
705303Sgblack@eecs.umich.edu
715303Sgblack@eecs.umich.edu    // A port to write to memory.
725303Sgblack@eecs.umich.edu    FunctionalPort * physPort = threadContexts[0]->getPhysPort();
735303Sgblack@eecs.umich.edu
745303Sgblack@eecs.umich.edu    /*
755303Sgblack@eecs.umich.edu     * Deal with the command line stuff.
765303Sgblack@eecs.umich.edu     */
775303Sgblack@eecs.umich.edu
785303Sgblack@eecs.umich.edu    // A buffer to store the command line.
795303Sgblack@eecs.umich.edu    const Addr commandLineBuff = 0x90000;
805303Sgblack@eecs.umich.edu    // A pointer to the commandLineBuff stored in the real mode data.
815303Sgblack@eecs.umich.edu    const Addr commandLinePointer = realModeData + 0x228;
825303Sgblack@eecs.umich.edu
835303Sgblack@eecs.umich.edu    if (commandLine.length() + 1 > realModeData - commandLineBuff)
845303Sgblack@eecs.umich.edu        panic("Command line \"%s\" is longer than %d characters.\n",
855303Sgblack@eecs.umich.edu                commandLine, realModeData - commandLineBuff - 1);
865303Sgblack@eecs.umich.edu    physPort->writeBlob(commandLineBuff,
875303Sgblack@eecs.umich.edu            (uint8_t *)commandLine.c_str(), commandLine.length() + 1);
885303Sgblack@eecs.umich.edu
895303Sgblack@eecs.umich.edu    // Generate a pointer of the right size and endianness to put into
905303Sgblack@eecs.umich.edu    // commandLinePointer.
915303Sgblack@eecs.umich.edu    uint32_t guestCommandLineBuff =
925303Sgblack@eecs.umich.edu        X86ISA::htog((uint32_t)commandLineBuff);
935303Sgblack@eecs.umich.edu    physPort->writeBlob(commandLinePointer,
945303Sgblack@eecs.umich.edu            (uint8_t *)&guestCommandLineBuff, sizeof(guestCommandLineBuff));
955303Sgblack@eecs.umich.edu
965303Sgblack@eecs.umich.edu    /*
975303Sgblack@eecs.umich.edu     * Screen Info.
985303Sgblack@eecs.umich.edu     */
995303Sgblack@eecs.umich.edu
1005303Sgblack@eecs.umich.edu    // We'll skip on this for now because it's only needed for framebuffers,
1015303Sgblack@eecs.umich.edu    // something we don't support at the moment.
1025303Sgblack@eecs.umich.edu
1035303Sgblack@eecs.umich.edu    /*
1045303Sgblack@eecs.umich.edu     * EDID info
1055303Sgblack@eecs.umich.edu     */
1065303Sgblack@eecs.umich.edu
1075303Sgblack@eecs.umich.edu    // Skipping for now.
1085303Sgblack@eecs.umich.edu
1095303Sgblack@eecs.umich.edu    /*
1105303Sgblack@eecs.umich.edu     * Saved video mode
1115303Sgblack@eecs.umich.edu     */
1125303Sgblack@eecs.umich.edu
1135303Sgblack@eecs.umich.edu    // Skipping for now.
1145303Sgblack@eecs.umich.edu
1155303Sgblack@eecs.umich.edu    /*
1165303Sgblack@eecs.umich.edu     * Loader type.
1175303Sgblack@eecs.umich.edu     */
1185303Sgblack@eecs.umich.edu
1195303Sgblack@eecs.umich.edu    // Skipping for now.
1205303Sgblack@eecs.umich.edu
1215303Sgblack@eecs.umich.edu    /*
1225303Sgblack@eecs.umich.edu     * E820 memory map
1235303Sgblack@eecs.umich.edu     */
1245303Sgblack@eecs.umich.edu
1255303Sgblack@eecs.umich.edu    // A pointer to the number of E820 entries there are.
1265303Sgblack@eecs.umich.edu    const Addr e820MapNrPointer = realModeData + 0x1e8;
1275303Sgblack@eecs.umich.edu
1285303Sgblack@eecs.umich.edu    // A pointer to the buffer for E820 entries.
1295303Sgblack@eecs.umich.edu    const Addr e820MapPointer = realModeData + 0x2d0;
1305303Sgblack@eecs.umich.edu
1315450Sgblack@eecs.umich.edu    e820Table->writeTo(physPort, e820MapNrPointer, e820MapPointer);
1325303Sgblack@eecs.umich.edu
1335303Sgblack@eecs.umich.edu    /*
1345303Sgblack@eecs.umich.edu     * Pass the location of the real mode data structure to the kernel
1355303Sgblack@eecs.umich.edu     * using register %esi. We'll use %rsi which should be equivalent.
1365303Sgblack@eecs.umich.edu     */
1375303Sgblack@eecs.umich.edu    threadContexts[0]->setIntReg(INTREG_RSI, realModeData);
1385299Sgblack@eecs.umich.edu}
1395299Sgblack@eecs.umich.edu
1405299Sgblack@eecs.umich.eduLinuxX86System *
1415299Sgblack@eecs.umich.eduLinuxX86SystemParams::create()
1425299Sgblack@eecs.umich.edu{
1435299Sgblack@eecs.umich.edu    return new LinuxX86System(this);
1445299Sgblack@eecs.umich.edu}
145