summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py43
-rw-r--r--IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py121
2 files changed, 150 insertions, 14 deletions
diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py
index 008c7d7a16..680b90e09d 100644
--- a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py
+++ b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py
@@ -807,12 +807,12 @@ class application(tkinter.Frame):
self.page_id = ''
self.page_list = {}
self.conf_list = {}
+ self.cfg_page_dict = {}
self.cfg_data_obj = None
self.org_cfg_data_bin = None
self.in_left = state()
self.in_right = state()
self.search_text = ''
- self.binseg_dict = {}
# Check if current directory contains a file with a .yaml extension
# if not default self.last_dir to a Platform directory where it is
@@ -1009,10 +1009,17 @@ class application(tkinter.Frame):
return visible
if self.cfg_data_obj.binseg_dict:
str_split = item['path'].split('.')
- if self.cfg_data_obj.binseg_dict[str_split[-2]] == -1:
- visible = False
- widget.grid_remove()
- return visible
+ if str_split[-2] not in CGenYamlCfg.available_fv and \
+ str_split[-2] not in CGenYamlCfg.missing_fv:
+ if self.cfg_data_obj.binseg_dict[str_split[-3]] == -1:
+ visible = False
+ widget.grid_remove()
+ return visible
+ else:
+ if self.cfg_data_obj.binseg_dict[str_split[-2]] == -1:
+ visible = False
+ widget.grid_remove()
+ return visible
result = 1
if item['condition']:
result = self.evaluate_condition(item)
@@ -1371,8 +1378,34 @@ class application(tkinter.Frame):
self.clear_widgets_inLayout()
self.on_config_page_select_change(None)
+ def set_config_data_page(self):
+ page_id_list = []
+ for idx, page in enumerate(
+ self.cfg_data_obj._cfg_page['root']['child']):
+ page_id_list.append(list(page.keys())[0])
+ page_list = self.cfg_data_obj.get_cfg_list(page_id_list[idx])
+ self.cfg_page_dict[page_id_list[idx]] = 0
+ for item in page_list:
+ str_split = item['path'].split('.')
+ if str_split[-2] not in CGenYamlCfg.available_fv and \
+ str_split[-2] not in CGenYamlCfg.missing_fv:
+ if self.cfg_data_obj.binseg_dict[str_split[-3]] != -1:
+ self.cfg_page_dict[page_id_list[idx]] += 1
+ else:
+ if self.cfg_data_obj.binseg_dict[str_split[-2]] != -1:
+ self.cfg_page_dict[page_id_list[idx]] += 1
+ removed_page = 0
+ for idx, id in enumerate(page_id_list):
+ if self.cfg_page_dict[id] == 0:
+ del self.cfg_data_obj._cfg_page['root']['child'][idx-removed_page] # noqa: E501
+ removed_page += 1
+
def reload_config_data_from_bin(self, bin_dat):
self.cfg_data_obj.load_default_from_bin(bin_dat)
+ self.set_config_data_page()
+ self.left.delete(*self.left.get_children())
+ self.build_config_page_tree(self.cfg_data_obj.get_cfg_page()['root'],
+ '')
self.refresh_config_data_page()
def set_config_item_value(self, item, value_str):
diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py
index 611a9a9c72..b593885807 100644
--- a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py
+++ b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py
@@ -13,6 +13,7 @@ import string
import operator as op
import ast
import tkinter.messagebox as messagebox
+import tkinter
from datetime import date
from collections import OrderedDict
@@ -583,7 +584,6 @@ class CGenYamlCfg:
self._mode = ''
self._debug = False
self._macro_dict = {}
- self.bin_offset = []
self.binseg_dict = {}
self.initialize()
@@ -1046,6 +1046,7 @@ option format '%s' !" % option)
try:
value = self.reformat_value_str(act_cfg['value'],
act_cfg['length'])
+
except Exception:
value = act_cfg['value']
length = bit_len // 8
@@ -1298,18 +1299,85 @@ option format '%s' !" % option)
self.traverse_cfg_tree(_get_field_value, top)
return result
+ data_diff = ''
+
+ def find_data_difference(self, act_val, act_cfg):
+ # checks for any difference between BSF and Binary file
+ config_val = ''
+ if act_val != act_cfg['value']:
+
+ if 'DEC' in act_cfg['type']:
+ bsf_val = '0x%x' % int(act_val)
+ if bsf_val != act_cfg['value']:
+ config_val = bsf_val
+ else:
+ config_val = ''
+ else:
+ config_val = act_val
+
+ available_fv1 = 'none'
+ available_fv2 = 'none'
+
+ if self.detect_fsp():
+ if len(self.available_fv) >= 1:
+ if len(self.available_fv) > 1:
+ available_fv1 = self.available_fv[1]
+ if self.available_fv[2]:
+ available_fv2 = self.available_fv[2]
+ else:
+ available_fv1 = self.available_fv[1]
+ if act_cfg['length'] == 16:
+ config_val = int(config_val, 16)
+ config_val = '0x%x' % config_val
+ act_cfg['value'] = int(
+ act_cfg['value'], 16)
+ act_cfg['value'] = '0x%x' % \
+ act_cfg['value']
+
+ if config_val:
+ string = ('.' + act_cfg['cname'])
+ if (act_cfg['path'].endswith(self.available_fv[0] + string)
+ or act_cfg['path'].endswith(available_fv1 + string)
+ or act_cfg['path'].endswith(available_fv2 + string)) \
+ and 'BsfSkip' not in act_cfg['cname'] \
+ and 'Reserved' not in act_cfg['name']:
+ if act_cfg['option'] != '':
+ if act_cfg['length'] == 8:
+ config_val = int(config_val, 16)
+ config_val = '0x%x' % config_val
+ act_cfg['value'] = int(
+ act_cfg['value'], 16)
+ act_cfg['value'] = '0x%x' % \
+ act_cfg['value']
+ option = act_cfg['option']
+
+ cfg_val = ''
+ bin_val = ''
+ for i in option.split(','):
+ if act_cfg['value'] in i:
+ bin_val = i
+ elif config_val in i:
+ cfg_val = i
+ if cfg_val != '' and bin_val != '':
+ self.data_diff += '\n\nBinary: ' \
+ + act_cfg['name'] \
+ + ': ' + bin_val.replace(' ', '') \
+ + '\nConfig file: ' \
+ + act_cfg['name'] + ': ' \
+ + cfg_val.replace(' ', '') + '\n'
+ else:
+ self.data_diff += '\n\nBinary: ' \
+ + act_cfg['name'] + ': ' + act_cfg['value'] \
+ + '\nConfig file: ' + act_cfg['name'] \
+ + ': ' + config_val + '\n'
+
def set_field_value(self, top, value_bytes, force=False):
def _set_field_value(name, cfgs, level):
if 'indx' not in cfgs:
return
act_cfg = self.get_item_by_index(cfgs['indx'])
actual_offset = act_cfg['offset'] - struct_info['offset']
- set_value = True
- for each in self.bin_offset:
- if actual_offset in range(each[0], (each[0] + each[2]) * 8):
- if each[1] < 0:
- set_value = False
- if set_value and force or act_cfg['value'] == '':
+ if force or act_cfg['value'] == '':
value = get_bits_from_bytes(full_bytes,
actual_offset,
act_cfg['length'])
@@ -1321,6 +1389,7 @@ option format '%s' !" % option)
act_val)
act_cfg['value'] = self.format_value_to_str(
value, act_cfg['length'], act_val)
+ self.find_data_difference(act_val, act_cfg)
if 'indx' in top:
# it is config option
@@ -1438,6 +1507,9 @@ for '%s' !" % (act_cfg['value'], act_cfg['path']))
return bin_segs
+ available_fv = []
+ missing_fv = []
+
def extract_cfg_from_bin(self, bin_data):
# get cfg bin length
cfg_bins = bytearray()
@@ -1445,12 +1517,12 @@ for '%s' !" % (act_cfg['value'], act_cfg['path']))
Dummy_offset = 0
for each in bin_segs:
if each[1] != -1:
- self.bin_offset.append([Dummy_offset, each[1], each[2]])
cfg_bins.extend(bin_data[each[1]:each[1] + each[2]])
+ self.available_fv.append(each[0])
else:
+ self.missing_fv.append(each[0])
string = each[0] + ' is not availabe.'
messagebox.showinfo('', string)
- self.bin_offset.append([Dummy_offset, each[1], each[2]])
cfg_bins.extend(bytearray(each[2]))
Dummy_offset += each[2]
return cfg_bins
@@ -1476,10 +1548,41 @@ for '%s' !" % (act_cfg['value'], act_cfg['path']))
print('Patched the loaded binary successfully !')
return bin_data
+ def show_data_difference(self, data_diff):
+ # Displays if any data difference detected in BSF and Binary file
+ pop_up_text = 'There are differences in Config file and binary '\
+ 'data detected!\n'
+ pop_up_text += data_diff
+
+ window = tkinter.Tk()
+ window.title("Data Difference")
+ window.resizable(1, 1)
+ # Window Size
+ window.geometry("800x400")
+ frame = tkinter.Frame(window, height=800, width=700)
+ frame.pack(side=tkinter.BOTTOM)
+ # Vertical (y) Scroll Bar
+ scroll = tkinter.Scrollbar(window)
+ scroll.pack(side=tkinter.RIGHT, fill=tkinter.Y)
+
+ text = tkinter.Text(window, wrap=tkinter.NONE,
+ yscrollcommand=scroll.set,
+ width=700, height=400)
+ text.insert(tkinter.INSERT, pop_up_text)
+ text.pack()
+ # Configure the scrollbars
+ scroll.config(command=text.yview)
+ exit_button = tkinter.Button(
+ window, text="Close", command=window.destroy)
+ exit_button.pack(in_=frame, side=tkinter.RIGHT, padx=20, pady=10)
+
def load_default_from_bin(self, bin_data):
self._old_bin = bin_data
cfg_bins = self.extract_cfg_from_bin(bin_data)
self.set_field_value(self._cfg_tree, cfg_bins, True)
+
+ if self.data_diff:
+ self.show_data_difference(self.data_diff)
return cfg_bins
def generate_binary_array(self, path=''):