FileSystemConfig.py revision 13883
14561Sgblack@eecs.umich.edu# Copyright (c) 2015 Advanced Micro Devices, Inc.
24561Sgblack@eecs.umich.edu# All rights reserved
34561Sgblack@eecs.umich.edu#
44561Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
54561Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are
64561Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright
74561Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
84561Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
94561Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
104561Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution;
114561Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its
124561Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
134561Sgblack@eecs.umich.edu# this software without specific prior written permission.
144561Sgblack@eecs.umich.edu#
154561Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
164561Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
174561Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
184561Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
194561Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204561Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
214561Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
224561Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
234561Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
244561Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
254561Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264561Sgblack@eecs.umich.edu#
274561Sgblack@eecs.umich.edu# Authors: David Hashe
284561Sgblack@eecs.umich.edu
294561Sgblack@eecs.umich.edufrom __future__ import print_function
304561Sgblack@eecs.umich.edu
314561Sgblack@eecs.umich.eduimport m5
324561Sgblack@eecs.umich.edufrom m5.objects import *
334561Sgblack@eecs.umich.edufrom m5.util.convert import *
344561Sgblack@eecs.umich.edu
354561Sgblack@eecs.umich.eduimport operator, os, platform, getpass
364561Sgblack@eecs.umich.edufrom os import mkdir, makedirs, getpid, listdir, stat, access
374561Sgblack@eecs.umich.edufrom pwd import getpwuid
384561Sgblack@eecs.umich.edufrom os.path import join as joinpath
394561Sgblack@eecs.umich.edufrom os.path import isdir
404561Sgblack@eecs.umich.edufrom shutil import rmtree, copyfile
414561Sgblack@eecs.umich.edu
424561Sgblack@eecs.umich.edudef hex_mask(terms):
434561Sgblack@eecs.umich.edu    dec_mask = reduce(operator.or_, [2**i for i in terms], 0)
444561Sgblack@eecs.umich.edu    return "%08x" % dec_mask
454561Sgblack@eecs.umich.edu
464561Sgblack@eecs.umich.edudef file_append(path, contents):
474561Sgblack@eecs.umich.edu    with open(joinpath(*path), 'a') as f:
484561Sgblack@eecs.umich.edu        f.write(str(contents))
494561Sgblack@eecs.umich.edu
504561Sgblack@eecs.umich.edudef replace_tree(path):
514561Sgblack@eecs.umich.edu    if isdir(path):
524561Sgblack@eecs.umich.edu        rmtree(path)
534561Sgblack@eecs.umich.edu    mkdir(path)
544561Sgblack@eecs.umich.edu
554561Sgblack@eecs.umich.edudef config_filesystem(options):
564561Sgblack@eecs.umich.edu    fsdir = joinpath(m5.options.outdir, 'fs')
574561Sgblack@eecs.umich.edu    replace_tree(fsdir)
584561Sgblack@eecs.umich.edu
594561Sgblack@eecs.umich.edu    # Set up /proc
604561Sgblack@eecs.umich.edu    procdir = joinpath(fsdir, 'proc')
614561Sgblack@eecs.umich.edu    mkdir(procdir)
624561Sgblack@eecs.umich.edu
634561Sgblack@eecs.umich.edu    for i in xrange(options.num_cpus):
644561Sgblack@eecs.umich.edu        one_cpu = 'processor       : 0\n'                         + \
654561Sgblack@eecs.umich.edu                  'vendor_id       : Generic\n'                   + \
664561Sgblack@eecs.umich.edu                  'cpu family      : 0\n'                         + \
674561Sgblack@eecs.umich.edu                  'model           : 0\n'                         + \
684561Sgblack@eecs.umich.edu                  'model name      : Generic\n'                   + \
694561Sgblack@eecs.umich.edu                  'stepping        : 0\n'                         + \
704561Sgblack@eecs.umich.edu                  'cpu MHz         : %0.3d\n'                       \
714561Sgblack@eecs.umich.edu                        % (toFrequency(options.cpu_clock)/mega)   + \
724561Sgblack@eecs.umich.edu                  'cache size:     : %dK\n'                         \
734561Sgblack@eecs.umich.edu                        % (toMemorySize(options.l2_size)/kibi)    + \
744561Sgblack@eecs.umich.edu                  'physical id     : 0\n'                         + \
754561Sgblack@eecs.umich.edu                  'siblings        : %s\n'                          \
764561Sgblack@eecs.umich.edu                        % options.num_cpus                        + \
774561Sgblack@eecs.umich.edu                  'core id         : %d\n'                          \
784561Sgblack@eecs.umich.edu                        % i                                       + \
794561Sgblack@eecs.umich.edu                  'cpu cores       : %d\n'                          \
804561Sgblack@eecs.umich.edu                        % options.num_cpus                        + \
814561Sgblack@eecs.umich.edu                  'fpu             : yes\n'                       + \
824561Sgblack@eecs.umich.edu                  'fpu exception   : yes\n'                       + \
834561Sgblack@eecs.umich.edu                  'cpuid level     : 1\n'                         + \
844561Sgblack@eecs.umich.edu                  'wp              : yes\n'                       + \
854561Sgblack@eecs.umich.edu                  'flags           : fpu\n'                       + \
864561Sgblack@eecs.umich.edu                  'cache alignment : %d\n'                          \
874561Sgblack@eecs.umich.edu                        % options.cacheline_size                  + \
884561Sgblack@eecs.umich.edu                  '\n'
894561Sgblack@eecs.umich.edu        file_append((procdir, 'cpuinfo'), one_cpu)
904561Sgblack@eecs.umich.edu
914561Sgblack@eecs.umich.edu    file_append((procdir, 'stat'), 'cpu 0 0 0 0 0 0 0\n')
924561Sgblack@eecs.umich.edu    for i in xrange(options.num_cpus):
934561Sgblack@eecs.umich.edu        file_append((procdir, 'stat'), 'cpu%d 0 0 0 0 0 0 0\n' % i)
944561Sgblack@eecs.umich.edu
954561Sgblack@eecs.umich.edu    # Set up /sys
964561Sgblack@eecs.umich.edu    sysdir = joinpath(fsdir, 'sys')
974561Sgblack@eecs.umich.edu    mkdir(sysdir)
984561Sgblack@eecs.umich.edu
994561Sgblack@eecs.umich.edu    # Set up /sys/devices/system/cpu
1004561Sgblack@eecs.umich.edu    cpudir = joinpath(sysdir, 'devices', 'system', 'cpu')
1014561Sgblack@eecs.umich.edu    makedirs(cpudir)
1024561Sgblack@eecs.umich.edu
1034561Sgblack@eecs.umich.edu    file_append((cpudir, 'online'), '0-%d' % (options.num_cpus-1))
1044561Sgblack@eecs.umich.edu    file_append((cpudir, 'possible'), '0-%d' % (options.num_cpus-1))
1054561Sgblack@eecs.umich.edu
1064561Sgblack@eecs.umich.edu    # Set up /tmp
1074561Sgblack@eecs.umich.edu    tmpdir = joinpath(fsdir, 'tmp')
1084561Sgblack@eecs.umich.edu    replace_tree(tmpdir)
1094561Sgblack@eecs.umich.edu
1104561Sgblack@eecs.umich.edudef register_node(cpu_list, mem, node_number):
1114561Sgblack@eecs.umich.edu    nodebasedir = joinpath(m5.options.outdir, 'fs', 'sys', 'devices',
1124561Sgblack@eecs.umich.edu                           'system', 'node')
1134561Sgblack@eecs.umich.edu
1144561Sgblack@eecs.umich.edu    nodedir = joinpath(nodebasedir,'node%d' % node_number)
1154561Sgblack@eecs.umich.edu    makedirs(nodedir)
1164561Sgblack@eecs.umich.edu
1174561Sgblack@eecs.umich.edu    file_append((nodedir, 'cpumap'), hex_mask(cpu_list))
1184561Sgblack@eecs.umich.edu    file_append((nodedir, 'meminfo'),
1194561Sgblack@eecs.umich.edu                'Node %d MemTotal: %dkB' % (node_number,
1204561Sgblack@eecs.umich.edu                toMemorySize(str(mem))/kibi))
1214561Sgblack@eecs.umich.edu
1224561Sgblack@eecs.umich.edudef register_cpu(physical_package_id, core_siblings,
1234561Sgblack@eecs.umich.edu                 core_id, thread_siblings):
1244561Sgblack@eecs.umich.edu    cpudir = joinpath(m5.options.outdir, 'fs',  'sys', 'devices', 'system',
1254561Sgblack@eecs.umich.edu                      'cpu', 'cpu%d' % core_id)
1264561Sgblack@eecs.umich.edu
1274561Sgblack@eecs.umich.edu    if not isdir(joinpath(cpudir, 'topology')):
1284561Sgblack@eecs.umich.edu        makedirs(joinpath(cpudir, 'topology'))
1294561Sgblack@eecs.umich.edu    if not isdir(joinpath(cpudir, 'cache')):
1304561Sgblack@eecs.umich.edu        makedirs(joinpath(cpudir, 'cache'))
1314561Sgblack@eecs.umich.edu
1324561Sgblack@eecs.umich.edu    file_append((cpudir, 'online'), '1')
1334561Sgblack@eecs.umich.edu    file_append((cpudir, 'topology', 'physical_package_id'),
1344561Sgblack@eecs.umich.edu                physical_package_id)
1354561Sgblack@eecs.umich.edu    file_append((cpudir, 'topology', 'core_siblings'),
1364561Sgblack@eecs.umich.edu                hex_mask(core_siblings))
137    file_append((cpudir, 'topology', 'core_id'), core_id)
138    file_append((cpudir, 'topology', 'thread_siblings'),
139                hex_mask(thread_siblings))
140
141def register_cache(level, idu_type, size, line_size, assoc, cpus):
142    fsdir = joinpath(m5.options.outdir, 'fs')
143    for i in cpus:
144        cachedir = joinpath(fsdir, 'sys', 'devices', 'system', 'cpu',
145                            'cpu%d' % i, 'cache')
146
147        j = 0
148        while isdir(joinpath(cachedir, 'index%d' % j)):
149            j += 1
150        indexdir = joinpath(cachedir, 'index%d' % j)
151        makedirs(indexdir)
152
153        file_append((indexdir, 'level'), level)
154        file_append((indexdir, 'type'), idu_type)
155        file_append((indexdir, 'size'), "%dK" % (toMemorySize(size)/kibi))
156        file_append((indexdir, 'coherency_line_size'), line_size)
157
158        # Since cache size = number of indices * associativity * block size
159        num_sets = toMemorySize(size) / int(assoc) * int(line_size)
160
161        file_append((indexdir, 'number_of_sets'), num_sets)
162        file_append((indexdir, 'physical_line_partition'), '1')
163        file_append((indexdir, 'shared_cpu_map'), hex_mask(cpus))
164
165def redirect_paths(chroot):
166    # Redirect filesystem syscalls from src to the first matching dests
167    redirect_paths = [RedirectPath(app_path = "/proc",
168                          host_paths = ["%s/fs/proc" % m5.options.outdir]),
169                      RedirectPath(app_path = "/sys",
170                          host_paths = ["%s/fs/sys"  % m5.options.outdir]),
171                      RedirectPath(app_path = "/tmp",
172                          host_paths = ["%s/fs/tmp"  % m5.options.outdir]),
173                      RedirectPath(app_path = "/",
174                          host_paths = ["%s"         % chroot])]
175    return redirect_paths
176