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
405299Sgblack@eecs.umich.edu#include "arch/x86/linux/system.hh"
4111793Sbrandon.potter@amd.com
4211793Sbrandon.potter@amd.com#include "arch/vtophys.hh"
4311793Sbrandon.potter@amd.com#include "arch/x86/isa_traits.hh"
447629Sgblack@eecs.umich.edu#include "arch/x86/regs/int.hh"
455299Sgblack@eecs.umich.edu#include "base/trace.hh"
465303Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
478706Sandreas.hansson@arm.com#include "mem/port_proxy.hh"
485299Sgblack@eecs.umich.edu#include "params/LinuxX86System.hh"
497737Sgblack@eecs.umich.edu#include "sim/byteswap.hh"
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    /*
725303Sgblack@eecs.umich.edu     * Deal with the command line stuff.
735303Sgblack@eecs.umich.edu     */
745303Sgblack@eecs.umich.edu
755303Sgblack@eecs.umich.edu    // A buffer to store the command line.
765303Sgblack@eecs.umich.edu    const Addr commandLineBuff = 0x90000;
775303Sgblack@eecs.umich.edu    // A pointer to the commandLineBuff stored in the real mode data.
785303Sgblack@eecs.umich.edu    const Addr commandLinePointer = realModeData + 0x228;
795303Sgblack@eecs.umich.edu
805303Sgblack@eecs.umich.edu    if (commandLine.length() + 1 > realModeData - commandLineBuff)
815303Sgblack@eecs.umich.edu        panic("Command line \"%s\" is longer than %d characters.\n",
825303Sgblack@eecs.umich.edu                commandLine, realModeData - commandLineBuff - 1);
8314010Sgabeblack@google.com    physProxy.writeBlob(commandLineBuff, commandLine.c_str(),
848852Sandreas.hansson@arm.com                        commandLine.length() + 1);
855303Sgblack@eecs.umich.edu
865303Sgblack@eecs.umich.edu    // Generate a pointer of the right size and endianness to put into
875303Sgblack@eecs.umich.edu    // commandLinePointer.
885303Sgblack@eecs.umich.edu    uint32_t guestCommandLineBuff =
895303Sgblack@eecs.umich.edu        X86ISA::htog((uint32_t)commandLineBuff);
9014010Sgabeblack@google.com    physProxy.writeBlob(commandLinePointer, &guestCommandLineBuff,
918852Sandreas.hansson@arm.com                        sizeof(guestCommandLineBuff));
925303Sgblack@eecs.umich.edu
935303Sgblack@eecs.umich.edu    /*
945303Sgblack@eecs.umich.edu     * Screen Info.
955303Sgblack@eecs.umich.edu     */
965303Sgblack@eecs.umich.edu
975303Sgblack@eecs.umich.edu    // We'll skip on this for now because it's only needed for framebuffers,
985303Sgblack@eecs.umich.edu    // something we don't support at the moment.
995303Sgblack@eecs.umich.edu
1005303Sgblack@eecs.umich.edu    /*
1015303Sgblack@eecs.umich.edu     * EDID info
1025303Sgblack@eecs.umich.edu     */
1035303Sgblack@eecs.umich.edu
1045303Sgblack@eecs.umich.edu    // Skipping for now.
1055303Sgblack@eecs.umich.edu
1065303Sgblack@eecs.umich.edu    /*
1075303Sgblack@eecs.umich.edu     * Saved video mode
1085303Sgblack@eecs.umich.edu     */
1095303Sgblack@eecs.umich.edu
1105303Sgblack@eecs.umich.edu    // Skipping for now.
1115303Sgblack@eecs.umich.edu
1125303Sgblack@eecs.umich.edu    /*
1135303Sgblack@eecs.umich.edu     * Loader type.
1145303Sgblack@eecs.umich.edu     */
1155303Sgblack@eecs.umich.edu
1165303Sgblack@eecs.umich.edu    // Skipping for now.
1175303Sgblack@eecs.umich.edu
1185303Sgblack@eecs.umich.edu    /*
1195303Sgblack@eecs.umich.edu     * E820 memory map
1205303Sgblack@eecs.umich.edu     */
1215303Sgblack@eecs.umich.edu
1225303Sgblack@eecs.umich.edu    // A pointer to the number of E820 entries there are.
1235303Sgblack@eecs.umich.edu    const Addr e820MapNrPointer = realModeData + 0x1e8;
1245303Sgblack@eecs.umich.edu
1255303Sgblack@eecs.umich.edu    // A pointer to the buffer for E820 entries.
1265303Sgblack@eecs.umich.edu    const Addr e820MapPointer = realModeData + 0x2d0;
1275303Sgblack@eecs.umich.edu
1288852Sandreas.hansson@arm.com    e820Table->writeTo(physProxy, e820MapNrPointer, e820MapPointer);
1295303Sgblack@eecs.umich.edu
1305303Sgblack@eecs.umich.edu    /*
1315303Sgblack@eecs.umich.edu     * Pass the location of the real mode data structure to the kernel
1325303Sgblack@eecs.umich.edu     * using register %esi. We'll use %rsi which should be equivalent.
1335303Sgblack@eecs.umich.edu     */
1345303Sgblack@eecs.umich.edu    threadContexts[0]->setIntReg(INTREG_RSI, realModeData);
1355299Sgblack@eecs.umich.edu}
1365299Sgblack@eecs.umich.edu
1375299Sgblack@eecs.umich.eduLinuxX86System *
1385299Sgblack@eecs.umich.eduLinuxX86SystemParams::create()
1395299Sgblack@eecs.umich.edu{
1405299Sgblack@eecs.umich.edu    return new LinuxX86System(this);
1415299Sgblack@eecs.umich.edu}
142