mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
Merge 032c7ed958 ("Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux") into android-mainline
Steps on the way to 5.10-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: If06587182d37ebcd2162800b44887e86a0d44d1c
This commit is contained in:
commit
97a0d475c5
|
|
@ -123,6 +123,7 @@ config ARM64
|
|||
select GENERIC_VDSO_TIME_NS
|
||||
select HANDLE_DOMAIN_IRQ
|
||||
select HARDIRQS_SW_RESEND
|
||||
select HAVE_MOVE_PMD
|
||||
select HAVE_PCI
|
||||
select HAVE_ACPI_APEI if (ACPI && EFI)
|
||||
select HAVE_ALIGNED_STRUCT_PAGE if SLUB
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@
|
|||
#
|
||||
# Copyright (C) 1995-2001 by Russell King
|
||||
|
||||
LDFLAGS_vmlinux :=--no-undefined -X
|
||||
LDFLAGS_vmlinux :=--no-undefined -X -z norelro
|
||||
|
||||
ifeq ($(CONFIG_RELOCATABLE), y)
|
||||
# Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
|
||||
# for relative relocs, since this leads to better Image compression
|
||||
# with the relocation offsets always being zero.
|
||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro \
|
||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext \
|
||||
$(call ld-option, --no-apply-dynamic-relocs)
|
||||
endif
|
||||
|
||||
|
|
|
|||
|
|
@ -169,7 +169,6 @@
|
|||
extern u64 vabits_actual;
|
||||
#define PAGE_END (_PAGE_END(vabits_actual))
|
||||
|
||||
extern s64 physvirt_offset;
|
||||
extern s64 memstart_addr;
|
||||
/* PHYS_OFFSET - the physical address of the start of memory. */
|
||||
#define PHYS_OFFSET ({ VM_BUG_ON(memstart_addr & 1); memstart_addr; })
|
||||
|
|
@ -245,7 +244,7 @@ static inline const void *__tag_set(const void *addr, u8 tag)
|
|||
*/
|
||||
#define __is_lm_address(addr) (!(((u64)addr) & BIT(vabits_actual - 1)))
|
||||
|
||||
#define __lm_to_phys(addr) (((addr) + physvirt_offset))
|
||||
#define __lm_to_phys(addr) (((addr) & ~PAGE_OFFSET) + PHYS_OFFSET)
|
||||
#define __kimg_to_phys(addr) ((addr) - kimage_voffset)
|
||||
|
||||
#define __virt_to_phys_nodebug(x) ({ \
|
||||
|
|
@ -263,7 +262,7 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
|
|||
#define __phys_addr_symbol(x) __pa_symbol_nodebug(x)
|
||||
#endif /* CONFIG_DEBUG_VIRTUAL */
|
||||
|
||||
#define __phys_to_virt(x) ((unsigned long)((x) - physvirt_offset))
|
||||
#define __phys_to_virt(x) ((unsigned long)((x) - PHYS_OFFSET) | PAGE_OFFSET)
|
||||
#define __phys_to_kimg(x) ((unsigned long)((x) + kimage_voffset))
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@
|
|||
#define VMALLOC_START (MODULES_END)
|
||||
#define VMALLOC_END (- PUD_SIZE - VMEMMAP_SIZE - SZ_64K)
|
||||
|
||||
#define vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT))
|
||||
|
||||
#define FIRST_USER_ADDRESS 0UL
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
@ -34,8 +36,6 @@
|
|||
#include <linux/mm_types.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
extern struct page *vmemmap;
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
#define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE
|
||||
|
||||
|
|
|
|||
|
|
@ -678,7 +678,7 @@ int sve_set_current_vl(unsigned long arg)
|
|||
vl = arg & PR_SVE_VL_LEN_MASK;
|
||||
flags = arg & ~vl;
|
||||
|
||||
if (!system_supports_sve())
|
||||
if (!system_supports_sve() || is_compat_task())
|
||||
return -EINVAL;
|
||||
|
||||
ret = sve_set_vector_length(current, vl, flags);
|
||||
|
|
@ -691,7 +691,7 @@ int sve_set_current_vl(unsigned long arg)
|
|||
/* PR_SVE_GET_VL */
|
||||
int sve_get_current_vl(void)
|
||||
{
|
||||
if (!system_supports_sve())
|
||||
if (!system_supports_sve() || is_compat_task())
|
||||
return -EINVAL;
|
||||
|
||||
return sve_prctl_status(0);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/prctl.h>
|
||||
#include <linux/random.h>
|
||||
|
|
@ -17,6 +18,9 @@ int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg)
|
|||
if (!system_supports_address_auth() && !system_supports_generic_auth())
|
||||
return -EINVAL;
|
||||
|
||||
if (is_compat_thread(task_thread_info(tsk)))
|
||||
return -EINVAL;
|
||||
|
||||
if (!arg) {
|
||||
ptrauth_keys_init_user(keys);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr,
|
|||
* - Mitigated in hardware and advertised by ID_AA64PFR0_EL1.CSV2.
|
||||
* - Mitigated in hardware and listed in our "safe list".
|
||||
* - Mitigated in software by firmware.
|
||||
* - Mitigated in software by a CPU-specific dance in the kernel.
|
||||
* - Mitigated in software by a CPU-specific dance in the kernel and a
|
||||
* firmware call at EL2.
|
||||
* - Vulnerable.
|
||||
*
|
||||
* It's not unlikely for different CPUs in a big.LITTLE system to fall into
|
||||
|
|
@ -204,8 +205,8 @@ static void install_bp_hardening_cb(bp_hardening_cb_t fn)
|
|||
__SMCCC_WORKAROUND_1_SMC_SZ;
|
||||
|
||||
/*
|
||||
* detect_harden_bp_fw() passes NULL for the hyp_vecs start/end if
|
||||
* we're a guest. Skip the hyp-vectors work.
|
||||
* Vinz Clortho takes the hyp_vecs start/end "keys" at
|
||||
* the door when we're a guest. Skip the hyp-vectors work.
|
||||
*/
|
||||
if (!is_hyp_mode_available()) {
|
||||
__this_cpu_write(bp_hardening_data.fn, fn);
|
||||
|
|
@ -259,6 +260,16 @@ static void qcom_link_stack_sanitisation(void)
|
|||
: "=&r" (tmp));
|
||||
}
|
||||
|
||||
static bp_hardening_cb_t spectre_v2_get_sw_mitigation_cb(void)
|
||||
{
|
||||
u32 midr = read_cpuid_id();
|
||||
if (((midr & MIDR_CPU_MODEL_MASK) != MIDR_QCOM_FALKOR) &&
|
||||
((midr & MIDR_CPU_MODEL_MASK) != MIDR_QCOM_FALKOR_V1))
|
||||
return NULL;
|
||||
|
||||
return qcom_link_stack_sanitisation;
|
||||
}
|
||||
|
||||
static enum mitigation_state spectre_v2_enable_fw_mitigation(void)
|
||||
{
|
||||
bp_hardening_cb_t cb;
|
||||
|
|
@ -284,26 +295,15 @@ static enum mitigation_state spectre_v2_enable_fw_mitigation(void)
|
|||
return SPECTRE_VULNERABLE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prefer a CPU-specific workaround if it exists. Note that we
|
||||
* still rely on firmware for the mitigation at EL2.
|
||||
*/
|
||||
cb = spectre_v2_get_sw_mitigation_cb() ?: cb;
|
||||
install_bp_hardening_cb(cb);
|
||||
return SPECTRE_MITIGATED;
|
||||
}
|
||||
|
||||
static enum mitigation_state spectre_v2_enable_sw_mitigation(void)
|
||||
{
|
||||
u32 midr;
|
||||
|
||||
if (spectre_v2_mitigations_off())
|
||||
return SPECTRE_VULNERABLE;
|
||||
|
||||
midr = read_cpuid_id();
|
||||
if (((midr & MIDR_CPU_MODEL_MASK) != MIDR_QCOM_FALKOR) &&
|
||||
((midr & MIDR_CPU_MODEL_MASK) != MIDR_QCOM_FALKOR_V1))
|
||||
return SPECTRE_VULNERABLE;
|
||||
|
||||
install_bp_hardening_cb(qcom_link_stack_sanitisation);
|
||||
return SPECTRE_MITIGATED;
|
||||
}
|
||||
|
||||
void spectre_v2_enable_mitigation(const struct arm64_cpu_capabilities *__unused)
|
||||
{
|
||||
enum mitigation_state state;
|
||||
|
|
@ -313,8 +313,6 @@ void spectre_v2_enable_mitigation(const struct arm64_cpu_capabilities *__unused)
|
|||
state = spectre_v2_get_cpu_hw_mitigation_state();
|
||||
if (state == SPECTRE_VULNERABLE)
|
||||
state = spectre_v2_enable_fw_mitigation();
|
||||
if (state == SPECTRE_VULNERABLE)
|
||||
state = spectre_v2_enable_sw_mitigation();
|
||||
|
||||
update_mitigation_state(&spectre_v2_state, state);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
# Doing this inside the Makefile will break the $(filter-out) function,
|
||||
# causing Kbuild to rebuild the vdso-offsets header file every time.
|
||||
#
|
||||
# Author: Will Deacon <will.deacon@arm.com
|
||||
# Author: Will Deacon <will.deacon@arm.com>
|
||||
#
|
||||
|
||||
LC_ALL=C
|
||||
|
|
|
|||
|
|
@ -53,12 +53,6 @@
|
|||
s64 memstart_addr __ro_after_init = -1;
|
||||
EXPORT_SYMBOL(memstart_addr);
|
||||
|
||||
s64 physvirt_offset __ro_after_init;
|
||||
EXPORT_SYMBOL(physvirt_offset);
|
||||
|
||||
struct page *vmemmap __ro_after_init;
|
||||
EXPORT_SYMBOL(vmemmap);
|
||||
|
||||
/*
|
||||
* We create both ZONE_DMA and ZONE_DMA32. ZONE_DMA covers the first 1G of
|
||||
* memory as some devices, namely the Raspberry Pi 4, have peripherals with
|
||||
|
|
@ -289,20 +283,6 @@ void __init arm64_memblock_init(void)
|
|||
memstart_addr = round_down(memblock_start_of_DRAM(),
|
||||
ARM64_MEMSTART_ALIGN);
|
||||
|
||||
physvirt_offset = PHYS_OFFSET - PAGE_OFFSET;
|
||||
|
||||
vmemmap = ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT));
|
||||
|
||||
/*
|
||||
* If we are running with a 52-bit kernel VA config on a system that
|
||||
* does not support it, we have to offset our vmemmap and physvirt_offset
|
||||
* s.t. we avoid the 52-bit portion of the direct linear map
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_ARM64_VA_BITS_52) && (vabits_actual != 52)) {
|
||||
vmemmap += (_PAGE_OFFSET(48) - _PAGE_OFFSET(52)) >> PAGE_SHIFT;
|
||||
physvirt_offset = PHYS_OFFSET - _PAGE_OFFSET(48);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove the memory that we will not be able to cover with the
|
||||
* linear mapping. Take care not to clip the kernel which may be
|
||||
|
|
@ -317,6 +297,16 @@ void __init arm64_memblock_init(void)
|
|||
memblock_remove(0, memstart_addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we are running with a 52-bit kernel VA config on a system that
|
||||
* does not support it, we have to place the available physical
|
||||
* memory in the 48-bit addressable part of the linear region, i.e.,
|
||||
* we have to move it upward. Since memstart_addr represents the
|
||||
* physical address of PAGE_OFFSET, we have to *subtract* from it.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_ARM64_VA_BITS_52) && (vabits_actual != 52))
|
||||
memstart_addr -= _PAGE_OFFSET(48) - _PAGE_OFFSET(52);
|
||||
|
||||
/*
|
||||
* Apply the memory limit if it was set. Since the kernel may be loaded
|
||||
* high up in memory, add back the kernel region that must be accessible
|
||||
|
|
|
|||
|
|
@ -82,14 +82,6 @@ QIcon ConfigItem::choiceNoIcon;
|
|||
QIcon ConfigItem::menuIcon;
|
||||
QIcon ConfigItem::menubackIcon;
|
||||
|
||||
/*
|
||||
* set the new data
|
||||
* TODO check the value
|
||||
*/
|
||||
void ConfigItem::okRename(int col)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* update the displayed of a menu entry
|
||||
*/
|
||||
|
|
@ -147,9 +139,6 @@ void ConfigItem::updateMenu(void)
|
|||
|
||||
if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
|
||||
setIcon(promptColIdx, QIcon());
|
||||
setText(noColIdx, QString());
|
||||
setText(modColIdx, QString());
|
||||
setText(yesColIdx, QString());
|
||||
break;
|
||||
}
|
||||
expr = sym_get_tristate_value(sym);
|
||||
|
|
@ -159,12 +148,10 @@ void ConfigItem::updateMenu(void)
|
|||
setIcon(promptColIdx, choiceYesIcon);
|
||||
else
|
||||
setIcon(promptColIdx, symbolYesIcon);
|
||||
setText(yesColIdx, "Y");
|
||||
ch = 'Y';
|
||||
break;
|
||||
case mod:
|
||||
setIcon(promptColIdx, symbolModIcon);
|
||||
setText(modColIdx, "M");
|
||||
ch = 'M';
|
||||
break;
|
||||
default:
|
||||
|
|
@ -172,31 +159,16 @@ void ConfigItem::updateMenu(void)
|
|||
setIcon(promptColIdx, choiceNoIcon);
|
||||
else
|
||||
setIcon(promptColIdx, symbolNoIcon);
|
||||
setText(noColIdx, "N");
|
||||
ch = 'N';
|
||||
break;
|
||||
}
|
||||
if (expr != no)
|
||||
setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
|
||||
if (expr != mod)
|
||||
setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
|
||||
if (expr != yes)
|
||||
setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
|
||||
|
||||
setText(dataColIdx, QChar(ch));
|
||||
break;
|
||||
case S_INT:
|
||||
case S_HEX:
|
||||
case S_STRING:
|
||||
const char* data;
|
||||
|
||||
data = sym_get_string_value(sym);
|
||||
|
||||
setText(dataColIdx, data);
|
||||
if (type == S_STRING)
|
||||
prompt = QString("%1: %2").arg(prompt).arg(data);
|
||||
else
|
||||
prompt = QString("(%2) %1").arg(prompt).arg(data);
|
||||
setText(dataColIdx, sym_get_string_value(sym));
|
||||
break;
|
||||
}
|
||||
if (!sym_has_value(sym) && visible)
|
||||
|
|
@ -237,6 +209,17 @@ void ConfigItem::init(void)
|
|||
if (list->mode != fullMode)
|
||||
setExpanded(true);
|
||||
sym_calc_value(menu->sym);
|
||||
|
||||
if (menu->sym) {
|
||||
enum symbol_type type = menu->sym->type;
|
||||
|
||||
// Allow to edit "int", "hex", and "string" in-place in
|
||||
// the data column. Unfortunately, you cannot specify
|
||||
// the flags per column. Set ItemIsEditable for all
|
||||
// columns here, and check the column in createEditor().
|
||||
if (type == S_INT || type == S_HEX || type == S_STRING)
|
||||
setFlags(flags() | Qt::ItemIsEditable);
|
||||
}
|
||||
}
|
||||
updateMenu();
|
||||
}
|
||||
|
|
@ -257,46 +240,65 @@ ConfigItem::~ConfigItem(void)
|
|||
}
|
||||
}
|
||||
|
||||
ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
|
||||
: Parent(parent)
|
||||
QWidget *ConfigItemDelegate::createEditor(QWidget *parent,
|
||||
const QStyleOptionViewItem &option,
|
||||
const QModelIndex &index) const
|
||||
{
|
||||
connect(this, SIGNAL(editingFinished()), SLOT(hide()));
|
||||
ConfigItem *item;
|
||||
|
||||
// Only the data column is editable
|
||||
if (index.column() != dataColIdx)
|
||||
return nullptr;
|
||||
|
||||
// You cannot edit invisible menus
|
||||
item = static_cast<ConfigItem *>(index.internalPointer());
|
||||
if (!item || !item->menu || !menu_is_visible(item->menu))
|
||||
return nullptr;
|
||||
|
||||
return QStyledItemDelegate::createEditor(parent, option, index);
|
||||
}
|
||||
|
||||
void ConfigLineEdit::show(ConfigItem* i)
|
||||
void ConfigItemDelegate::setModelData(QWidget *editor,
|
||||
QAbstractItemModel *model,
|
||||
const QModelIndex &index) const
|
||||
{
|
||||
item = i;
|
||||
if (sym_get_string_value(item->menu->sym))
|
||||
setText(sym_get_string_value(item->menu->sym));
|
||||
else
|
||||
setText(QString());
|
||||
Parent::show();
|
||||
setFocus();
|
||||
}
|
||||
QLineEdit *lineEdit;
|
||||
ConfigItem *item;
|
||||
struct symbol *sym;
|
||||
bool success;
|
||||
|
||||
void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
|
||||
{
|
||||
switch (e->key()) {
|
||||
case Qt::Key_Escape:
|
||||
break;
|
||||
case Qt::Key_Return:
|
||||
case Qt::Key_Enter:
|
||||
sym_set_string_value(item->menu->sym, text().toLatin1());
|
||||
parent()->updateList();
|
||||
break;
|
||||
default:
|
||||
Parent::keyPressEvent(e);
|
||||
return;
|
||||
lineEdit = qobject_cast<QLineEdit *>(editor);
|
||||
// If this is not a QLineEdit, use the parent's default.
|
||||
// (does this happen?)
|
||||
if (!lineEdit)
|
||||
goto parent;
|
||||
|
||||
item = static_cast<ConfigItem *>(index.internalPointer());
|
||||
if (!item || !item->menu)
|
||||
goto parent;
|
||||
|
||||
sym = item->menu->sym;
|
||||
if (!sym)
|
||||
goto parent;
|
||||
|
||||
success = sym_set_string_value(sym, lineEdit->text().toUtf8().data());
|
||||
if (success) {
|
||||
ConfigList::updateListForAll();
|
||||
} else {
|
||||
QMessageBox::information(editor, "qconf",
|
||||
"Cannot set the data (maybe due to out of range).\n"
|
||||
"Setting the old value.");
|
||||
lineEdit->setText(sym_get_string_value(sym));
|
||||
}
|
||||
e->accept();
|
||||
parent()->list->setFocus();
|
||||
hide();
|
||||
|
||||
parent:
|
||||
QStyledItemDelegate::setModelData(editor, model, index);
|
||||
}
|
||||
|
||||
ConfigList::ConfigList(ConfigView* p, const char *name)
|
||||
: Parent(p),
|
||||
ConfigList::ConfigList(QWidget *parent, const char *name)
|
||||
: QTreeWidget(parent),
|
||||
updateAll(false),
|
||||
showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
|
||||
showName(false), mode(singleMode), optMode(normalOpt),
|
||||
rootEntry(0), headerPopup(0)
|
||||
{
|
||||
setObjectName(name);
|
||||
|
|
@ -306,7 +308,7 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||
setVerticalScrollMode(ScrollPerPixel);
|
||||
setHorizontalScrollMode(ScrollPerPixel);
|
||||
|
||||
setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
|
||||
setHeaderLabels(QStringList() << "Option" << "Name" << "Value");
|
||||
|
||||
connect(this, SIGNAL(itemSelectionChanged(void)),
|
||||
SLOT(updateSelection(void)));
|
||||
|
|
@ -314,8 +316,6 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||
if (name) {
|
||||
configSettings->beginGroup(name);
|
||||
showName = configSettings->value("/showName", false).toBool();
|
||||
showRange = configSettings->value("/showRange", false).toBool();
|
||||
showData = configSettings->value("/showData", false).toBool();
|
||||
optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
|
||||
configSettings->endGroup();
|
||||
connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
|
||||
|
|
@ -323,9 +323,18 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||
|
||||
showColumn(promptColIdx);
|
||||
|
||||
setItemDelegate(new ConfigItemDelegate(this));
|
||||
|
||||
allLists.append(this);
|
||||
|
||||
reinit();
|
||||
}
|
||||
|
||||
ConfigList::~ConfigList()
|
||||
{
|
||||
allLists.removeOne(this);
|
||||
}
|
||||
|
||||
bool ConfigList::menuSkip(struct menu *menu)
|
||||
{
|
||||
if (optMode == normalOpt && menu_is_visible(menu))
|
||||
|
|
@ -339,21 +348,10 @@ bool ConfigList::menuSkip(struct menu *menu)
|
|||
|
||||
void ConfigList::reinit(void)
|
||||
{
|
||||
hideColumn(dataColIdx);
|
||||
hideColumn(yesColIdx);
|
||||
hideColumn(modColIdx);
|
||||
hideColumn(noColIdx);
|
||||
hideColumn(nameColIdx);
|
||||
|
||||
if (showName)
|
||||
showColumn(nameColIdx);
|
||||
if (showRange) {
|
||||
showColumn(noColIdx);
|
||||
showColumn(modColIdx);
|
||||
showColumn(yesColIdx);
|
||||
}
|
||||
if (showData)
|
||||
showColumn(dataColIdx);
|
||||
|
||||
updateListAll();
|
||||
}
|
||||
|
|
@ -375,8 +373,6 @@ void ConfigList::saveSettings(void)
|
|||
if (!objectName().isEmpty()) {
|
||||
configSettings->beginGroup(objectName());
|
||||
configSettings->setValue("/showName", showName);
|
||||
configSettings->setValue("/showRange", showRange);
|
||||
configSettings->setValue("/showData", showData);
|
||||
configSettings->setValue("/optionMode", (int)optMode);
|
||||
configSettings->endGroup();
|
||||
}
|
||||
|
|
@ -462,6 +458,28 @@ update:
|
|||
resizeColumnToContents(0);
|
||||
}
|
||||
|
||||
void ConfigList::updateListForAll()
|
||||
{
|
||||
QListIterator<ConfigList *> it(allLists);
|
||||
|
||||
while (it.hasNext()) {
|
||||
ConfigList *list = it.next();
|
||||
|
||||
list->updateList();
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigList::updateListAllForAll()
|
||||
{
|
||||
QListIterator<ConfigList *> it(allLists);
|
||||
|
||||
while (it.hasNext()) {
|
||||
ConfigList *list = it.next();
|
||||
|
||||
list->updateList();
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigList::setValue(ConfigItem* item, tristate val)
|
||||
{
|
||||
struct symbol* sym;
|
||||
|
|
@ -482,7 +500,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val)
|
|||
return;
|
||||
if (oldval == no && item->menu->list)
|
||||
item->setExpanded(true);
|
||||
parent()->updateList();
|
||||
ConfigList::updateListForAll();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -516,12 +534,9 @@ void ConfigList::changeValue(ConfigItem* item)
|
|||
item->setExpanded(true);
|
||||
}
|
||||
if (oldexpr != newexpr)
|
||||
parent()->updateList();
|
||||
ConfigList::updateListForAll();
|
||||
break;
|
||||
case S_INT:
|
||||
case S_HEX:
|
||||
case S_STRING:
|
||||
parent()->lineEdit->show(item);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -804,15 +819,6 @@ void ConfigList::mouseReleaseEvent(QMouseEvent* e)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case noColIdx:
|
||||
setValue(item, no);
|
||||
break;
|
||||
case modColIdx:
|
||||
setValue(item, mod);
|
||||
break;
|
||||
case yesColIdx:
|
||||
setValue(item, yes);
|
||||
break;
|
||||
case dataColIdx:
|
||||
changeValue(item);
|
||||
break;
|
||||
|
|
@ -883,96 +889,32 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
|||
action = new QAction("Show Name", this);
|
||||
action->setCheckable(true);
|
||||
connect(action, SIGNAL(toggled(bool)),
|
||||
parent(), SLOT(setShowName(bool)));
|
||||
connect(parent(), SIGNAL(showNameChanged(bool)),
|
||||
SLOT(setShowName(bool)));
|
||||
connect(this, SIGNAL(showNameChanged(bool)),
|
||||
action, SLOT(setChecked(bool)));
|
||||
action->setChecked(showName);
|
||||
headerPopup->addAction(action);
|
||||
|
||||
action = new QAction("Show Range", this);
|
||||
action->setCheckable(true);
|
||||
connect(action, SIGNAL(toggled(bool)),
|
||||
parent(), SLOT(setShowRange(bool)));
|
||||
connect(parent(), SIGNAL(showRangeChanged(bool)),
|
||||
action, SLOT(setChecked(bool)));
|
||||
action->setChecked(showRange);
|
||||
headerPopup->addAction(action);
|
||||
|
||||
action = new QAction("Show Data", this);
|
||||
action->setCheckable(true);
|
||||
connect(action, SIGNAL(toggled(bool)),
|
||||
parent(), SLOT(setShowData(bool)));
|
||||
connect(parent(), SIGNAL(showDataChanged(bool)),
|
||||
action, SLOT(setChecked(bool)));
|
||||
action->setChecked(showData);
|
||||
headerPopup->addAction(action);
|
||||
}
|
||||
|
||||
headerPopup->exec(e->globalPos());
|
||||
e->accept();
|
||||
}
|
||||
|
||||
ConfigView*ConfigView::viewList;
|
||||
void ConfigList::setShowName(bool on)
|
||||
{
|
||||
if (showName == on)
|
||||
return;
|
||||
|
||||
showName = on;
|
||||
reinit();
|
||||
emit showNameChanged(on);
|
||||
}
|
||||
|
||||
QList<ConfigList *> ConfigList::allLists;
|
||||
QAction *ConfigList::showNormalAction;
|
||||
QAction *ConfigList::showAllAction;
|
||||
QAction *ConfigList::showPromptAction;
|
||||
|
||||
ConfigView::ConfigView(QWidget* parent, const char *name)
|
||||
: Parent(parent)
|
||||
{
|
||||
setObjectName(name);
|
||||
QVBoxLayout *verticalLayout = new QVBoxLayout(this);
|
||||
verticalLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
list = new ConfigList(this);
|
||||
verticalLayout->addWidget(list);
|
||||
lineEdit = new ConfigLineEdit(this);
|
||||
lineEdit->hide();
|
||||
verticalLayout->addWidget(lineEdit);
|
||||
|
||||
this->nextView = viewList;
|
||||
viewList = this;
|
||||
}
|
||||
|
||||
ConfigView::~ConfigView(void)
|
||||
{
|
||||
ConfigView** vp;
|
||||
|
||||
for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
|
||||
if (*vp == this) {
|
||||
*vp = nextView;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigView::setShowName(bool b)
|
||||
{
|
||||
if (list->showName != b) {
|
||||
list->showName = b;
|
||||
list->reinit();
|
||||
emit showNameChanged(b);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigView::setShowRange(bool b)
|
||||
{
|
||||
if (list->showRange != b) {
|
||||
list->showRange = b;
|
||||
list->reinit();
|
||||
emit showRangeChanged(b);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigView::setShowData(bool b)
|
||||
{
|
||||
if (list->showData != b) {
|
||||
list->showData = b;
|
||||
list->reinit();
|
||||
emit showDataChanged(b);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigList::setAllOpen(bool open)
|
||||
{
|
||||
QTreeWidgetItemIterator it(this);
|
||||
|
|
@ -984,22 +926,6 @@ void ConfigList::setAllOpen(bool open)
|
|||
}
|
||||
}
|
||||
|
||||
void ConfigView::updateList()
|
||||
{
|
||||
ConfigView* v;
|
||||
|
||||
for (v = viewList; v; v = v->nextView)
|
||||
v->list->updateList();
|
||||
}
|
||||
|
||||
void ConfigView::updateListAll(void)
|
||||
{
|
||||
ConfigView* v;
|
||||
|
||||
for (v = viewList; v; v = v->nextView)
|
||||
v->list->updateListAll();
|
||||
}
|
||||
|
||||
ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
|
||||
: Parent(parent), sym(0), _menu(0)
|
||||
{
|
||||
|
|
@ -1315,12 +1241,12 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent)
|
|||
|
||||
split = new QSplitter(this);
|
||||
split->setOrientation(Qt::Vertical);
|
||||
list = new ConfigView(split, "search");
|
||||
list->list->mode = listMode;
|
||||
list = new ConfigList(split, "search");
|
||||
list->mode = listMode;
|
||||
info = new ConfigInfoView(split, "search");
|
||||
connect(list->list, SIGNAL(menuChanged(struct menu *)),
|
||||
connect(list, SIGNAL(menuChanged(struct menu *)),
|
||||
info, SLOT(setInfo(struct menu *)));
|
||||
connect(list->list, SIGNAL(menuChanged(struct menu *)),
|
||||
connect(list, SIGNAL(menuChanged(struct menu *)),
|
||||
parent, SLOT(setMenuLink(struct menu *)));
|
||||
|
||||
layout1->addWidget(split);
|
||||
|
|
@ -1364,7 +1290,7 @@ void ConfigSearchWindow::search(void)
|
|||
ConfigItem *lastItem = NULL;
|
||||
|
||||
free(result);
|
||||
list->list->clear();
|
||||
list->clear();
|
||||
info->clear();
|
||||
|
||||
result = sym_re_search(editField->text().toLatin1());
|
||||
|
|
@ -1372,7 +1298,7 @@ void ConfigSearchWindow::search(void)
|
|||
return;
|
||||
for (p = result; *p; p++) {
|
||||
for_all_prompts((*p), prop)
|
||||
lastItem = new ConfigItem(list->list, lastItem, prop->menu,
|
||||
lastItem = new ConfigItem(list, lastItem, prop->menu,
|
||||
menu_is_visible(prop->menu));
|
||||
}
|
||||
}
|
||||
|
|
@ -1420,23 +1346,21 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||
split1->setOrientation(Qt::Horizontal);
|
||||
split1->setChildrenCollapsible(false);
|
||||
|
||||
menuView = new ConfigView(widget, "menu");
|
||||
menuList = menuView->list;
|
||||
menuList = new ConfigList(widget, "menu");
|
||||
|
||||
split2 = new QSplitter(widget);
|
||||
split2->setChildrenCollapsible(false);
|
||||
split2->setOrientation(Qt::Vertical);
|
||||
|
||||
// create config tree
|
||||
configView = new ConfigView(widget, "config");
|
||||
configList = configView->list;
|
||||
configList = new ConfigList(widget, "config");
|
||||
|
||||
helpText = new ConfigInfoView(widget, "help");
|
||||
|
||||
layout->addWidget(split2);
|
||||
split2->addWidget(split1);
|
||||
split1->addWidget(configView);
|
||||
split1->addWidget(menuView);
|
||||
split1->addWidget(configList);
|
||||
split1->addWidget(menuList);
|
||||
split2->addWidget(helpText);
|
||||
|
||||
setTabOrder(configList, helpText);
|
||||
|
|
@ -1480,14 +1404,8 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||
|
||||
QAction *showNameAction = new QAction("Show Name", this);
|
||||
showNameAction->setCheckable(true);
|
||||
connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
|
||||
showNameAction->setChecked(configView->showName());
|
||||
QAction *showRangeAction = new QAction("Show Range", this);
|
||||
showRangeAction->setCheckable(true);
|
||||
connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
|
||||
QAction *showDataAction = new QAction("Show Data", this);
|
||||
showDataAction->setCheckable(true);
|
||||
connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
|
||||
connect(showNameAction, SIGNAL(toggled(bool)), configList, SLOT(setShowName(bool)));
|
||||
showNameAction->setChecked(configList->showName);
|
||||
|
||||
QActionGroup *optGroup = new QActionGroup(this);
|
||||
optGroup->setExclusive(true);
|
||||
|
|
@ -1539,8 +1457,6 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||
// create options menu
|
||||
menu = menuBar()->addMenu("&Option");
|
||||
menu->addAction(showNameAction);
|
||||
menu->addAction(showRangeAction);
|
||||
menu->addAction(showDataAction);
|
||||
menu->addSeparator();
|
||||
menu->addActions(optGroup->actions());
|
||||
menu->addSeparator();
|
||||
|
|
@ -1613,7 +1529,7 @@ void ConfigMainWindow::loadConfig(void)
|
|||
free(configname);
|
||||
configname = xstrdup(name);
|
||||
|
||||
ConfigView::updateListAll();
|
||||
ConfigList::updateListAllForAll();
|
||||
}
|
||||
|
||||
bool ConfigMainWindow::saveConfig(void)
|
||||
|
|
@ -1748,7 +1664,7 @@ void ConfigMainWindow::showSingleView(void)
|
|||
|
||||
backAction->setEnabled(true);
|
||||
|
||||
menuView->hide();
|
||||
menuList->hide();
|
||||
menuList->setRootMenu(0);
|
||||
configList->mode = singleMode;
|
||||
if (configList->rootEntry == &rootmenu)
|
||||
|
|
@ -1779,7 +1695,7 @@ void ConfigMainWindow::showSplitView(void)
|
|||
menuList->mode = symbolMode;
|
||||
menuList->setRootMenu(&rootmenu);
|
||||
menuList->setAllOpen(true);
|
||||
menuView->show();
|
||||
menuList->show();
|
||||
menuList->setFocus();
|
||||
}
|
||||
|
||||
|
|
@ -1794,7 +1710,7 @@ void ConfigMainWindow::showFullView(void)
|
|||
|
||||
backAction->setEnabled(false);
|
||||
|
||||
menuView->hide();
|
||||
menuList->hide();
|
||||
menuList->setRootMenu(0);
|
||||
configList->mode = fullMode;
|
||||
if (configList->rootEntry == &rootmenu)
|
||||
|
|
@ -1836,17 +1752,26 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
|
|||
|
||||
void ConfigMainWindow::showIntro(void)
|
||||
{
|
||||
static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
|
||||
"For each option, a blank box indicates the feature is disabled, a check\n"
|
||||
"indicates it is enabled, and a dot indicates that it is to be compiled\n"
|
||||
"as a module. Clicking on the box will cycle through the three states.\n\n"
|
||||
"If you do not see an option (e.g., a device driver) that you believe\n"
|
||||
"should be present, try turning on Show All Options under the Options menu.\n"
|
||||
"Although there is no cross reference yet to help you figure out what other\n"
|
||||
"options must be enabled to support the option you are interested in, you can\n"
|
||||
"still view the help of a grayed-out option.\n\n"
|
||||
"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
|
||||
"which you can then match by examining other options.\n\n";
|
||||
static const QString str =
|
||||
"Welcome to the qconf graphical configuration tool.\n"
|
||||
"\n"
|
||||
"For bool and tristate options, a blank box indicates the "
|
||||
"feature is disabled, a check indicates it is enabled, and a "
|
||||
"dot indicates that it is to be compiled as a module. Clicking "
|
||||
"on the box will cycle through the three states. For int, hex, "
|
||||
"and string options, double-clicking or pressing F2 on the "
|
||||
"Value cell will allow you to edit the value.\n"
|
||||
"\n"
|
||||
"If you do not see an option (e.g., a device driver) that you "
|
||||
"believe should be present, try turning on Show All Options "
|
||||
"under the Options menu. Enabling Show Debug Info will help you"
|
||||
"figure out what other options must be enabled to support the "
|
||||
"option you are interested in, and hyperlinks will navigate to "
|
||||
"them.\n"
|
||||
"\n"
|
||||
"Toggling Show Debug Info under the Options menu will show the "
|
||||
"dependencies, which you can then match by examining other "
|
||||
"options.\n";
|
||||
|
||||
QMessageBox::information(this, "qconf", str);
|
||||
}
|
||||
|
|
@ -1926,7 +1851,6 @@ int main(int ac, char** av)
|
|||
const char *name;
|
||||
|
||||
progname = av[0];
|
||||
configApp = new QApplication(ac, av);
|
||||
if (ac > 1 && av[1][0] == '-') {
|
||||
switch (av[1][1]) {
|
||||
case 's':
|
||||
|
|
@ -1947,6 +1871,8 @@ int main(int ac, char** av)
|
|||
conf_read(NULL);
|
||||
//zconfdump(stdout);
|
||||
|
||||
configApp = new QApplication(ac, av);
|
||||
|
||||
configSettings = new ConfigSettings();
|
||||
configSettings->beginGroup("/kconfig/qconf");
|
||||
v = new ConfigMainWindow();
|
||||
|
|
|
|||
|
|
@ -11,15 +11,14 @@
|
|||
#include <QPushButton>
|
||||
#include <QSettings>
|
||||
#include <QSplitter>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTextBrowser>
|
||||
#include <QTreeWidget>
|
||||
|
||||
#include "expr.h"
|
||||
|
||||
class ConfigView;
|
||||
class ConfigList;
|
||||
class ConfigItem;
|
||||
class ConfigLineEdit;
|
||||
class ConfigMainWindow;
|
||||
|
||||
class ConfigSettings : public QSettings {
|
||||
|
|
@ -30,7 +29,7 @@ class ConfigSettings : public QSettings {
|
|||
};
|
||||
|
||||
enum colIdx {
|
||||
promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx
|
||||
promptColIdx, nameColIdx, dataColIdx
|
||||
};
|
||||
enum listMode {
|
||||
singleMode, menuMode, symbolMode, fullMode, listMode
|
||||
|
|
@ -43,13 +42,10 @@ class ConfigList : public QTreeWidget {
|
|||
Q_OBJECT
|
||||
typedef class QTreeWidget Parent;
|
||||
public:
|
||||
ConfigList(ConfigView* p, const char *name = 0);
|
||||
ConfigList(QWidget *parent, const char *name = 0);
|
||||
~ConfigList();
|
||||
void reinit(void);
|
||||
ConfigItem* findConfigItem(struct menu *);
|
||||
ConfigView* parent(void) const
|
||||
{
|
||||
return (ConfigView*)Parent::parent();
|
||||
}
|
||||
void setSelected(QTreeWidgetItem *item, bool enable) {
|
||||
for (int i = 0; i < selectedItems().size(); i++)
|
||||
selectedItems().at(i)->setSelected(false);
|
||||
|
|
@ -75,6 +71,7 @@ public slots:
|
|||
void updateSelection(void);
|
||||
void saveSettings(void);
|
||||
void setOptionMode(QAction *action);
|
||||
void setShowName(bool on);
|
||||
|
||||
signals:
|
||||
void menuChanged(struct menu *menu);
|
||||
|
|
@ -82,6 +79,7 @@ public slots:
|
|||
void itemSelected(struct menu *menu);
|
||||
void parentSelected(void);
|
||||
void gotFocus(struct menu *);
|
||||
void showNameChanged(bool on);
|
||||
|
||||
public:
|
||||
void updateListAll(void)
|
||||
|
|
@ -100,7 +98,7 @@ public slots:
|
|||
|
||||
bool updateAll;
|
||||
|
||||
bool showName, showRange, showData;
|
||||
bool showName;
|
||||
enum listMode mode;
|
||||
enum optionMode optMode;
|
||||
struct menu *rootEntry;
|
||||
|
|
@ -108,6 +106,10 @@ public slots:
|
|||
QPalette inactivedColorGroup;
|
||||
QMenu* headerPopup;
|
||||
|
||||
static QList<ConfigList *> allLists;
|
||||
static void updateListForAll();
|
||||
static void updateListAllForAll();
|
||||
|
||||
static QAction *showNormalAction, *showAllAction, *showPromptAction;
|
||||
};
|
||||
|
||||
|
|
@ -131,7 +133,6 @@ class ConfigItem : public QTreeWidgetItem {
|
|||
}
|
||||
~ConfigItem(void);
|
||||
void init(void);
|
||||
void okRename(int col);
|
||||
void updateMenu(void);
|
||||
void testUpdateMenu(bool v);
|
||||
ConfigList* listView() const
|
||||
|
|
@ -168,48 +169,18 @@ class ConfigItem : public QTreeWidgetItem {
|
|||
static QIcon menuIcon, menubackIcon;
|
||||
};
|
||||
|
||||
class ConfigLineEdit : public QLineEdit {
|
||||
Q_OBJECT
|
||||
typedef class QLineEdit Parent;
|
||||
class ConfigItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
private:
|
||||
struct menu *menu;
|
||||
public:
|
||||
ConfigLineEdit(ConfigView* parent);
|
||||
ConfigView* parent(void) const
|
||||
{
|
||||
return (ConfigView*)Parent::parent();
|
||||
}
|
||||
void show(ConfigItem *i);
|
||||
void keyPressEvent(QKeyEvent *e);
|
||||
|
||||
public:
|
||||
ConfigItem *item;
|
||||
};
|
||||
|
||||
class ConfigView : public QWidget {
|
||||
Q_OBJECT
|
||||
typedef class QWidget Parent;
|
||||
public:
|
||||
ConfigView(QWidget* parent, const char *name = 0);
|
||||
~ConfigView(void);
|
||||
static void updateList();
|
||||
static void updateListAll(void);
|
||||
|
||||
bool showName(void) const { return list->showName; }
|
||||
bool showRange(void) const { return list->showRange; }
|
||||
bool showData(void) const { return list->showData; }
|
||||
public slots:
|
||||
void setShowName(bool);
|
||||
void setShowRange(bool);
|
||||
void setShowData(bool);
|
||||
signals:
|
||||
void showNameChanged(bool);
|
||||
void showRangeChanged(bool);
|
||||
void showDataChanged(bool);
|
||||
public:
|
||||
ConfigList* list;
|
||||
ConfigLineEdit* lineEdit;
|
||||
|
||||
static ConfigView* viewList;
|
||||
ConfigView* nextView;
|
||||
ConfigItemDelegate(QObject *parent = nullptr)
|
||||
: QStyledItemDelegate(parent) {}
|
||||
QWidget *createEditor(QWidget *parent,
|
||||
const QStyleOptionViewItem &option,
|
||||
const QModelIndex &index) const override;
|
||||
void setModelData(QWidget *editor, QAbstractItemModel *model,
|
||||
const QModelIndex &index) const override;
|
||||
};
|
||||
|
||||
class ConfigInfoView : public QTextBrowser {
|
||||
|
|
@ -257,7 +228,7 @@ public slots:
|
|||
QLineEdit* editField;
|
||||
QPushButton* searchButton;
|
||||
QSplitter* split;
|
||||
ConfigView* list;
|
||||
ConfigList *list;
|
||||
ConfigInfoView* info;
|
||||
|
||||
struct symbol **result;
|
||||
|
|
@ -292,9 +263,7 @@ public slots:
|
|||
void closeEvent(QCloseEvent *e);
|
||||
|
||||
ConfigSearchWindow *searchWindow;
|
||||
ConfigView *menuView;
|
||||
ConfigList *menuList;
|
||||
ConfigView *configView;
|
||||
ConfigList *configList;
|
||||
ConfigInfoView *helpText;
|
||||
QAction *backAction;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user