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