linux.cc revision 5795
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2009 The Regents of The University of Michigan
34120Sgblack@eecs.umich.edu * All rights reserved.
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
64120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
74120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
84120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
94120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
104120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
114120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
124120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
134120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
144120Sgblack@eecs.umich.edu * this software without specific prior written permission.
154120Sgblack@eecs.umich.edu *
164120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274120Sgblack@eecs.umich.edu *
284120Sgblack@eecs.umich.edu * Authors: Ali Saidi
294120Sgblack@eecs.umich.edu */
304120Sgblack@eecs.umich.edu
314120Sgblack@eecs.umich.edu#include <string>
324120Sgblack@eecs.umich.edu
334120Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
344120Sgblack@eecs.umich.edu#include "kern/linux/linux.hh"
354120Sgblack@eecs.umich.edu#include "sim/process.hh"
364120Sgblack@eecs.umich.edu#include "sim/system.hh"
374120Sgblack@eecs.umich.edu
384120Sgblack@eecs.umich.eduint
394120Sgblack@eecs.umich.eduLinux::openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc)
404120Sgblack@eecs.umich.edu{
414120Sgblack@eecs.umich.edu    DPRINTF(SyscallVerbose, "Opening special file: %s\n", path.c_str());
424120Sgblack@eecs.umich.edu    if (path.compare(0, 13, "/proc/meminfo") == 0) {
434120Sgblack@eecs.umich.edu        std::string data = Linux::procMeminfo(process, tc);
444120Sgblack@eecs.umich.edu        FILE *f = tmpfile();
454120Sgblack@eecs.umich.edu        int fd = fileno(f);
464120Sgblack@eecs.umich.edu        int ret M5_VAR_USED = fwrite(data.c_str(), 1, data.size(), f);
474120Sgblack@eecs.umich.edu        assert(ret == data.size());
484120Sgblack@eecs.umich.edu        rewind(f);
494120Sgblack@eecs.umich.edu        return fd;
504120Sgblack@eecs.umich.edu    }
514120Sgblack@eecs.umich.edu
524120Sgblack@eecs.umich.edu    warn("Attempting to open special file: %s. Ignorning. Simulation may"
534120Sgblack@eecs.umich.edu            " take un-expected code path or be non-deterministic until proper"
544120Sgblack@eecs.umich.edu            "  handling is implemented.\n", path.c_str());
554120Sgblack@eecs.umich.edu    return -1;
564120Sgblack@eecs.umich.edu}
574120Sgblack@eecs.umich.edu
584120Sgblack@eecs.umich.edustd::string
594120Sgblack@eecs.umich.eduLinux::procMeminfo(LiveProcess *process, ThreadContext *tc)
604120Sgblack@eecs.umich.edu{
614166Sgblack@eecs.umich.edu    return csprintf("MemTotal:%12d kB\nMemFree: %12d kB\n",
624141Sgblack@eecs.umich.edu            process->system->memSize() >> 10,
634136Sgblack@eecs.umich.edu            process->system->freeMemSize() >> 10);
645086Sgblack@eecs.umich.edu}
654136Sgblack@eecs.umich.edu
664141Sgblack@eecs.umich.edu