system.cc revision 7087
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
405303Sgblack@eecs.umich.edu#include "arch/x86/intregs.hh"
415299Sgblack@eecs.umich.edu#include "arch/x86/linux/system.hh"
425299Sgblack@eecs.umich.edu#include "arch/vtophys.hh"
435299Sgblack@eecs.umich.edu#include "base/trace.hh"
445303Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
455299Sgblack@eecs.umich.edu#include "mem/physical.hh"
465299Sgblack@eecs.umich.edu#include "params/LinuxX86System.hh"
475299Sgblack@eecs.umich.edu
485299Sgblack@eecs.umich.edu
495299Sgblack@eecs.umich.eduusing namespace LittleEndianGuest;
505299Sgblack@eecs.umich.eduusing namespace X86ISA;
515299Sgblack@eecs.umich.edu
525299Sgblack@eecs.umich.eduLinuxX86System::LinuxX86System(Params *p)
535450Sgblack@eecs.umich.edu    : X86System(p), commandLine(p->boot_osflags), e820Table(p->e820_table)
545299Sgblack@eecs.umich.edu{
555299Sgblack@eecs.umich.edu}
565299Sgblack@eecs.umich.edu
575299Sgblack@eecs.umich.eduLinuxX86System::~LinuxX86System()
585299Sgblack@eecs.umich.edu{
595299Sgblack@eecs.umich.edu}
605299Sgblack@eecs.umich.edu
615299Sgblack@eecs.umich.eduvoid
625299Sgblack@eecs.umich.eduLinuxX86System::startup()
635299Sgblack@eecs.umich.edu{
645299Sgblack@eecs.umich.edu    X86System::startup();
655303Sgblack@eecs.umich.edu
665303Sgblack@eecs.umich.edu    // The location of the real mode data structure.
675303Sgblack@eecs.umich.edu    const Addr realModeData = 0x90200;
685303Sgblack@eecs.umich.edu
695303Sgblack@eecs.umich.edu    // A port to write to memory.
705303Sgblack@eecs.umich.edu    FunctionalPort * physPort = threadContexts[0]->getPhysPort();
715303Sgblack@eecs.umich.edu
725303Sgblack@eecs.umich.edu    /*
735303Sgblack@eecs.umich.edu     * Deal with the command line stuff.
745303Sgblack@eecs.umich.edu     */
755303Sgblack@eecs.umich.edu
765303Sgblack@eecs.umich.edu    // A buffer to store the command line.
775303Sgblack@eecs.umich.edu    const Addr commandLineBuff = 0x90000;
785303Sgblack@eecs.umich.edu    // A pointer to the commandLineBuff stored in the real mode data.
795303Sgblack@eecs.umich.edu    const Addr commandLinePointer = realModeData + 0x228;
805303Sgblack@eecs.umich.edu
815303Sgblack@eecs.umich.edu    if (commandLine.length() + 1 > realModeData - commandLineBuff)
825303Sgblack@eecs.umich.edu        panic("Command line \"%s\" is longer than %d characters.\n",
835303Sgblack@eecs.umich.edu                commandLine, realModeData - commandLineBuff - 1);
845303Sgblack@eecs.umich.edu    physPort->writeBlob(commandLineBuff,
855303Sgblack@eecs.umich.edu            (uint8_t *)commandLine.c_str(), commandLine.length() + 1);
865303Sgblack@eecs.umich.edu
875303Sgblack@eecs.umich.edu    // Generate a pointer of the right size and endianness to put into
885303Sgblack@eecs.umich.edu    // commandLinePointer.
895303Sgblack@eecs.umich.edu    uint32_t guestCommandLineBuff =
905303Sgblack@eecs.umich.edu        X86ISA::htog((uint32_t)commandLineBuff);
915303Sgblack@eecs.umich.edu    physPort->writeBlob(commandLinePointer,
925303Sgblack@eecs.umich.edu            (uint8_t *)&guestCommandLineBuff, sizeof(guestCommandLineBuff));
935303Sgblack@eecs.umich.edu
945303Sgblack@eecs.umich.edu    /*
955303Sgblack@eecs.umich.edu     * Screen Info.
965303Sgblack@eecs.umich.edu     */
975303Sgblack@eecs.umich.edu
985303Sgblack@eecs.umich.edu    // We'll skip on this for now because it's only needed for framebuffers,
995303Sgblack@eecs.umich.edu    // something we don't support at the moment.
1005303Sgblack@eecs.umich.edu
1015303Sgblack@eecs.umich.edu    /*
1025303Sgblack@eecs.umich.edu     * EDID info
1035303Sgblack@eecs.umich.edu     */
1045303Sgblack@eecs.umich.edu
1055303Sgblack@eecs.umich.edu    // Skipping for now.
1065303Sgblack@eecs.umich.edu
1075303Sgblack@eecs.umich.edu    /*
1085303Sgblack@eecs.umich.edu     * Saved video mode
1095303Sgblack@eecs.umich.edu     */
1105303Sgblack@eecs.umich.edu
1115303Sgblack@eecs.umich.edu    // Skipping for now.
1125303Sgblack@eecs.umich.edu
1135303Sgblack@eecs.umich.edu    /*
1145303Sgblack@eecs.umich.edu     * Loader type.
1155303Sgblack@eecs.umich.edu     */
1165303Sgblack@eecs.umich.edu
1175303Sgblack@eecs.umich.edu    // Skipping for now.
1185303Sgblack@eecs.umich.edu
1195303Sgblack@eecs.umich.edu    /*
1205303Sgblack@eecs.umich.edu     * E820 memory map
1215303Sgblack@eecs.umich.edu     */
1225303Sgblack@eecs.umich.edu
1235303Sgblack@eecs.umich.edu    // A pointer to the number of E820 entries there are.
1245303Sgblack@eecs.umich.edu    const Addr e820MapNrPointer = realModeData + 0x1e8;
1255303Sgblack@eecs.umich.edu
1265303Sgblack@eecs.umich.edu    // A pointer to the buffer for E820 entries.
1275303Sgblack@eecs.umich.edu    const Addr e820MapPointer = realModeData + 0x2d0;
1285303Sgblack@eecs.umich.edu
1295450Sgblack@eecs.umich.edu    e820Table->writeTo(physPort, e820MapNrPointer, e820MapPointer);
1305303Sgblack@eecs.umich.edu
1315303Sgblack@eecs.umich.edu    /*
1325303Sgblack@eecs.umich.edu     * Pass the location of the real mode data structure to the kernel
1335303Sgblack@eecs.umich.edu     * using register %esi. We'll use %rsi which should be equivalent.
1345303Sgblack@eecs.umich.edu     */
1355303Sgblack@eecs.umich.edu    threadContexts[0]->setIntReg(INTREG_RSI, realModeData);
1365299Sgblack@eecs.umich.edu}
1375299Sgblack@eecs.umich.edu
1385299Sgblack@eecs.umich.eduLinuxX86System *
1395299Sgblack@eecs.umich.eduLinuxX86SystemParams::create()
1405299Sgblack@eecs.umich.edu{
1415299Sgblack@eecs.umich.edu    return new LinuxX86System(this);
1425299Sgblack@eecs.umich.edu}
143