You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge tag 'for-linus-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
Pull UML updates from Richard Weinberger: - Support for optimized routines based on the host CPU - Support for PCI via virtio - Various fixes * tag 'for-linus-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml: um: remove unneeded semicolon in um_arch.c um: Remove the repeated declaration um: fix error return code in winch_tramp() um: fix error return code in slip_open() um: Fix stack pointer alignment um: implement flush_cache_vmap/flush_cache_vunmap um: add a UML specific futex implementation um: enable the use of optimized xor routines in UML um: Add support for host CPU flags and alignment um: allow not setting extra rpaths in the linux binary um: virtio/pci: enable suspend/resume um: add PCI over virtio emulation driver um: irqs: allow invoking time-travel handler multiple times um: time-travel/signals: fix ndelay() in interrupt um: expose time-travel mode to userspace side um: export signals_enabled directly um: remove unused smp_sigio_handler() declaration lib: add iomem emulation (logic_iomem) um: allow disabling NO_IOMEM
This commit is contained in:
@@ -15,7 +15,7 @@ config UML
|
||||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
select NO_DMA
|
||||
select NO_DMA if !UML_DMA_EMULATION
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_CPU_DEVICES
|
||||
select HAVE_GCC_PLUGINS
|
||||
@@ -26,7 +26,22 @@ config MMU
|
||||
bool
|
||||
default y
|
||||
|
||||
config UML_DMA_EMULATION
|
||||
bool
|
||||
|
||||
config NO_IOMEM
|
||||
bool "disable IOMEM" if EXPERT
|
||||
depends on !INDIRECT_IOMEM
|
||||
default y
|
||||
|
||||
config UML_IOMEM_EMULATION
|
||||
bool
|
||||
select INDIRECT_IOMEM
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_IOMAP
|
||||
select NO_GENERIC_PCI_IOPORT_MAP
|
||||
|
||||
config NO_IOPORT_MAP
|
||||
def_bool y
|
||||
|
||||
config ISA
|
||||
@@ -61,6 +76,9 @@ config NR_CPUS
|
||||
range 1 1
|
||||
default 1
|
||||
|
||||
config ARCH_HAS_CACHE_LINE_SIZE
|
||||
def_bool y
|
||||
|
||||
source "arch/$(HEADER_ARCH)/um/Kconfig"
|
||||
|
||||
config MAY_HAVE_RUNTIME_DEPS
|
||||
@@ -91,6 +109,19 @@ config LD_SCRIPT_DYN
|
||||
depends on !LD_SCRIPT_STATIC
|
||||
select MODULE_REL_CRCS if MODVERSIONS
|
||||
|
||||
config LD_SCRIPT_DYN_RPATH
|
||||
bool "set rpath in the binary" if EXPERT
|
||||
default y
|
||||
depends on LD_SCRIPT_DYN
|
||||
help
|
||||
Add /lib (and /lib64 for 64-bit) to the linux binary's rpath
|
||||
explicitly.
|
||||
|
||||
You may need to turn this off if compiling for nix systems
|
||||
that have their libraries in random /nix directories and
|
||||
might otherwise unexpected use libraries from /lib or /lib64
|
||||
instead of the desired ones.
|
||||
|
||||
config HOSTFS
|
||||
tristate "Host filesystem"
|
||||
help
|
||||
|
||||
@@ -118,7 +118,8 @@ archprepare:
|
||||
$(Q)$(MAKE) $(build)=$(HOST_DIR)/um include/generated/user_constants.h
|
||||
|
||||
LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib $(call cc-option, -no-pie)
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN) += $(call cc-option, -no-pie)
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) += -Wl,-rpath,/lib
|
||||
|
||||
CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) \
|
||||
-fno-stack-protector $(call cc-option, -fno-stack-protector-all)
|
||||
|
||||
@@ -357,3 +357,23 @@ config UML_RTC
|
||||
rtcwake, especially in time-travel mode. This driver enables that
|
||||
by providing a fake RTC clock that causes a wakeup at the right
|
||||
time.
|
||||
|
||||
config UML_PCI_OVER_VIRTIO
|
||||
bool "Enable PCI over VIRTIO device simulation"
|
||||
# in theory, just VIRTIO is enough, but that causes recursion
|
||||
depends on VIRTIO_UML
|
||||
select FORCE_PCI
|
||||
select UML_IOMEM_EMULATION
|
||||
select UML_DMA_EMULATION
|
||||
select PCI_MSI
|
||||
select PCI_MSI_IRQ_DOMAIN
|
||||
select PCI_LOCKLESS_CONFIG
|
||||
|
||||
config UML_PCI_OVER_VIRTIO_DEVICE_ID
|
||||
int "set the virtio device ID for PCI emulation"
|
||||
default -1
|
||||
depends on UML_PCI_OVER_VIRTIO
|
||||
help
|
||||
There's no official device ID assigned (yet), set the one you
|
||||
wish to use for experimentation here. The default of -1 is
|
||||
not valid and will cause the driver to fail at probe.
|
||||
|
||||
@@ -64,6 +64,7 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o
|
||||
obj-$(CONFIG_UML_RANDOM) += random.o
|
||||
obj-$(CONFIG_VIRTIO_UML) += virtio_uml.o
|
||||
obj-$(CONFIG_UML_RTC) += rtc.o
|
||||
obj-$(CONFIG_UML_PCI_OVER_VIRTIO) += virt-pci.o
|
||||
|
||||
# pcap_user.o must be added explicitly.
|
||||
USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o vector_user.o
|
||||
|
||||
@@ -256,7 +256,8 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
if (os_set_fd_block(*fd_out, 0)) {
|
||||
err = os_set_fd_block(*fd_out, 0);
|
||||
if (err) {
|
||||
printk(UM_KERN_ERR "winch_tramp: failed to set thread_fd "
|
||||
"non-blocking.\n");
|
||||
goto out_close;
|
||||
|
||||
@@ -145,7 +145,8 @@ static int slip_open(void *data)
|
||||
}
|
||||
sfd = err;
|
||||
|
||||
if (set_up_tty(sfd))
|
||||
err = set_up_tty(sfd);
|
||||
if (err)
|
||||
goto out_close2;
|
||||
|
||||
pri->slave = sfd;
|
||||
|
||||
@@ -1242,8 +1242,7 @@ static int __init ubd_driver_init(void){
|
||||
* enough. So use anyway the io thread. */
|
||||
}
|
||||
stack = alloc_stack(0, 0);
|
||||
io_pid = start_io_thread(stack + PAGE_SIZE - sizeof(void *),
|
||||
&thread_fd);
|
||||
io_pid = start_io_thread(stack + PAGE_SIZE, &thread_fd);
|
||||
if(io_pid < 0){
|
||||
printk(KERN_ERR
|
||||
"ubd : Failed to start I/O thread (errno = %d) - "
|
||||
|
||||
895
arch/um/drivers/virt-pci.c
Normal file
895
arch/um/drivers/virt-pci.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -56,6 +56,7 @@ struct virtio_uml_device {
|
||||
u8 status;
|
||||
u8 registered:1;
|
||||
u8 suspended:1;
|
||||
u8 no_vq_suspend:1;
|
||||
|
||||
u8 config_changed_irq:1;
|
||||
uint64_t vq_irq_vq_map;
|
||||
@@ -1098,6 +1099,19 @@ static void virtio_uml_release_dev(struct device *d)
|
||||
kfree(vu_dev);
|
||||
}
|
||||
|
||||
void virtio_uml_set_no_vq_suspend(struct virtio_device *vdev,
|
||||
bool no_vq_suspend)
|
||||
{
|
||||
struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
|
||||
|
||||
if (WARN_ON(vdev->config != &virtio_uml_config_ops))
|
||||
return;
|
||||
|
||||
vu_dev->no_vq_suspend = no_vq_suspend;
|
||||
dev_info(&vdev->dev, "%sabled VQ suspend\n",
|
||||
no_vq_suspend ? "dis" : "en");
|
||||
}
|
||||
|
||||
/* Platform device */
|
||||
|
||||
static int virtio_uml_probe(struct platform_device *pdev)
|
||||
@@ -1302,13 +1316,16 @@ MODULE_DEVICE_TABLE(of, virtio_uml_match);
|
||||
static int virtio_uml_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
{
|
||||
struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev);
|
||||
struct virtqueue *vq;
|
||||
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
struct virtio_uml_vq_info *info = vq->priv;
|
||||
if (!vu_dev->no_vq_suspend) {
|
||||
struct virtqueue *vq;
|
||||
|
||||
info->suspended = true;
|
||||
vhost_user_set_vring_enable(vu_dev, vq->index, false);
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
struct virtio_uml_vq_info *info = vq->priv;
|
||||
|
||||
info->suspended = true;
|
||||
vhost_user_set_vring_enable(vu_dev, vq->index, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!device_may_wakeup(&vu_dev->vdev.dev)) {
|
||||
@@ -1322,13 +1339,16 @@ static int virtio_uml_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
static int virtio_uml_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev);
|
||||
struct virtqueue *vq;
|
||||
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
struct virtio_uml_vq_info *info = vq->priv;
|
||||
if (!vu_dev->no_vq_suspend) {
|
||||
struct virtqueue *vq;
|
||||
|
||||
info->suspended = false;
|
||||
vhost_user_set_vring_enable(vu_dev, vq->index, true);
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
struct virtio_uml_vq_info *info = vq->priv;
|
||||
|
||||
info->suspended = false;
|
||||
vhost_user_set_vring_enable(vu_dev, vq->index, true);
|
||||
}
|
||||
}
|
||||
|
||||
vu_dev->suspended = false;
|
||||
|
||||
@@ -7,8 +7,8 @@ generic-y += device.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += exec.h
|
||||
generic-y += extable.h
|
||||
generic-y += fb.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += futex.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += irq_work.h
|
||||
@@ -17,7 +17,6 @@ generic-y += mcs_spinlock.h
|
||||
generic-y += mmiowb.h
|
||||
generic-y += module.lds.h
|
||||
generic-y += param.h
|
||||
generic-y += pci.h
|
||||
generic-y += percpu.h
|
||||
generic-y += preempt.h
|
||||
generic-y += softirq_stack.h
|
||||
@@ -27,3 +26,4 @@ generic-y += trace_clock.h
|
||||
generic-y += word-at-a-time.h
|
||||
generic-y += kprobes.h
|
||||
generic-y += mm_hooks.h
|
||||
generic-y += vga.h
|
||||
|
||||
9
arch/um/include/asm/cacheflush.h
Normal file
9
arch/um/include/asm/cacheflush.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __UM_ASM_CACHEFLUSH_H
|
||||
#define __UM_ASM_CACHEFLUSH_H
|
||||
|
||||
#include <asm/tlbflush.h>
|
||||
#define flush_cache_vmap flush_tlb_kernel_range
|
||||
#define flush_cache_vunmap flush_tlb_kernel_range
|
||||
|
||||
#include <asm-generic/cacheflush.h>
|
||||
#endif /* __UM_ASM_CACHEFLUSH_H */
|
||||
157
arch/um/include/asm/cpufeature.h
Normal file
157
arch/um/include/asm/cpufeature.h
Normal file
@@ -0,0 +1,157 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_UM_CPUFEATURE_H
|
||||
#define _ASM_UM_CPUFEATURE_H
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
extern const char * const x86_cap_flags[NCAPINTS*32];
|
||||
extern const char * const x86_power_flags[32];
|
||||
#define X86_CAP_FMT "%s"
|
||||
#define x86_cap_flag(flag) x86_cap_flags[flag]
|
||||
|
||||
/*
|
||||
* In order to save room, we index into this array by doing
|
||||
* X86_BUG_<name> - NCAPINTS*32.
|
||||
*/
|
||||
extern const char * const x86_bug_flags[NBUGINTS*32];
|
||||
|
||||
#define test_cpu_cap(c, bit) \
|
||||
test_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
|
||||
/*
|
||||
* There are 32 bits/features in each mask word. The high bits
|
||||
* (selected with (bit>>5) give us the word number and the low 5
|
||||
* bits give us the bit/feature number inside the word.
|
||||
* (1UL<<((bit)&31) gives us a mask for the feature_bit so we can
|
||||
* see if it is set in the mask word.
|
||||
*/
|
||||
#define CHECK_BIT_IN_MASK_WORD(maskname, word, bit) \
|
||||
(((bit)>>5)==(word) && (1UL<<((bit)&31) & maskname##word ))
|
||||
|
||||
#define cpu_has(c, bit) \
|
||||
test_cpu_cap(c, bit)
|
||||
|
||||
#define this_cpu_has(bit) \
|
||||
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
|
||||
x86_this_cpu_test_bit(bit, \
|
||||
(unsigned long __percpu *)&cpu_info.x86_capability))
|
||||
|
||||
/*
|
||||
* This macro is for detection of features which need kernel
|
||||
* infrastructure to be used. It may *not* directly test the CPU
|
||||
* itself. Use the cpu_has() family if you want true runtime
|
||||
* testing of CPU features, like in hypervisor code where you are
|
||||
* supporting a possible guest feature where host support for it
|
||||
* is not relevant.
|
||||
*/
|
||||
#define cpu_feature_enabled(bit) \
|
||||
(__builtin_constant_p(bit) && DISABLED_MASK_BIT_SET(bit) ? 0 : static_cpu_has(bit))
|
||||
|
||||
#define boot_cpu_has(bit) cpu_has(&boot_cpu_data, bit)
|
||||
|
||||
#define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
|
||||
extern void setup_clear_cpu_cap(unsigned int bit);
|
||||
|
||||
#define setup_force_cpu_cap(bit) do { \
|
||||
set_cpu_cap(&boot_cpu_data, bit); \
|
||||
set_bit(bit, (unsigned long *)cpu_caps_set); \
|
||||
} while (0)
|
||||
|
||||
#define setup_force_cpu_bug(bit) setup_force_cpu_cap(bit)
|
||||
|
||||
#if defined(__clang__) && !defined(CONFIG_CC_HAS_ASM_GOTO)
|
||||
|
||||
/*
|
||||
* Workaround for the sake of BPF compilation which utilizes kernel
|
||||
* headers, but clang does not support ASM GOTO and fails the build.
|
||||
*/
|
||||
#ifndef __BPF_TRACING__
|
||||
#warning "Compiler lacks ASM_GOTO support. Add -D __BPF_TRACING__ to your compiler arguments"
|
||||
#endif
|
||||
|
||||
#define static_cpu_has(bit) boot_cpu_has(bit)
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Static testing of CPU features. Used the same as boot_cpu_has(). It
|
||||
* statically patches the target code for additional performance. Use
|
||||
* static_cpu_has() only in fast paths, where every cycle counts. Which
|
||||
* means that the boot_cpu_has() variant is already fast enough for the
|
||||
* majority of cases and you should stick to using it as it is generally
|
||||
* only two instructions: a RIP-relative MOV and a TEST.
|
||||
*/
|
||||
static __always_inline bool _static_cpu_has(u16 bit)
|
||||
{
|
||||
asm_volatile_goto("1: jmp 6f\n"
|
||||
"2:\n"
|
||||
".skip -(((5f-4f) - (2b-1b)) > 0) * "
|
||||
"((5f-4f) - (2b-1b)),0x90\n"
|
||||
"3:\n"
|
||||
".section .altinstructions,\"a\"\n"
|
||||
" .long 1b - .\n" /* src offset */
|
||||
" .long 4f - .\n" /* repl offset */
|
||||
" .word %P[always]\n" /* always replace */
|
||||
" .byte 3b - 1b\n" /* src len */
|
||||
" .byte 5f - 4f\n" /* repl len */
|
||||
" .byte 3b - 2b\n" /* pad len */
|
||||
".previous\n"
|
||||
".section .altinstr_replacement,\"ax\"\n"
|
||||
"4: jmp %l[t_no]\n"
|
||||
"5:\n"
|
||||
".previous\n"
|
||||
".section .altinstructions,\"a\"\n"
|
||||
" .long 1b - .\n" /* src offset */
|
||||
" .long 0\n" /* no replacement */
|
||||
" .word %P[feature]\n" /* feature bit */
|
||||
" .byte 3b - 1b\n" /* src len */
|
||||
" .byte 0\n" /* repl len */
|
||||
" .byte 0\n" /* pad len */
|
||||
".previous\n"
|
||||
".section .altinstr_aux,\"ax\"\n"
|
||||
"6:\n"
|
||||
" testb %[bitnum],%[cap_byte]\n"
|
||||
" jnz %l[t_yes]\n"
|
||||
" jmp %l[t_no]\n"
|
||||
".previous\n"
|
||||
: : [feature] "i" (bit),
|
||||
[always] "i" (X86_FEATURE_ALWAYS),
|
||||
[bitnum] "i" (1 << (bit & 7)),
|
||||
[cap_byte] "m" (((const char *)boot_cpu_data.x86_capability)[bit >> 3])
|
||||
: : t_yes, t_no);
|
||||
t_yes:
|
||||
return true;
|
||||
t_no:
|
||||
return false;
|
||||
}
|
||||
|
||||
#define static_cpu_has(bit) \
|
||||
( \
|
||||
__builtin_constant_p(boot_cpu_has(bit)) ? \
|
||||
boot_cpu_has(bit) : \
|
||||
_static_cpu_has(bit) \
|
||||
)
|
||||
#endif
|
||||
|
||||
#define cpu_has_bug(c, bit) cpu_has(c, (bit))
|
||||
#define set_cpu_bug(c, bit) set_cpu_cap(c, (bit))
|
||||
|
||||
#define static_cpu_has_bug(bit) static_cpu_has((bit))
|
||||
#define boot_cpu_has_bug(bit) cpu_has_bug(&boot_cpu_data, (bit))
|
||||
#define boot_cpu_set_bug(bit) set_cpu_cap(&boot_cpu_data, (bit))
|
||||
|
||||
#define MAX_CPU_FEATURES (NCAPINTS * 32)
|
||||
#define cpu_have_feature boot_cpu_has
|
||||
|
||||
#define CPU_FEATURE_TYPEFMT "x86,ven%04Xfam%04Xmod%04X"
|
||||
#define CPU_FEATURE_TYPEVAL boot_cpu_data.x86_vendor, boot_cpu_data.x86, \
|
||||
boot_cpu_data.x86_model
|
||||
|
||||
#endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
|
||||
#endif /* _ASM_UM_CPUFEATURE_H */
|
||||
20
arch/um/include/asm/fpu/api.h
Normal file
20
arch/um/include/asm/fpu/api.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#ifndef _ASM_UM_FPU_API_H
|
||||
#define _ASM_UM_FPU_API_H
|
||||
|
||||
/* Copyright (c) 2020 Cambridge Greys Ltd
|
||||
* Copyright (c) 2020 Red Hat Inc.
|
||||
* A set of "dummy" defines to allow the direct inclusion
|
||||
* of x86 optimized copy, xor, etc routines into the
|
||||
* UML code tree. */
|
||||
|
||||
#define kernel_fpu_begin() (void)0
|
||||
#define kernel_fpu_end() (void)0
|
||||
|
||||
static inline bool irq_fpu_usable(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
14
arch/um/include/asm/futex.h
Normal file
14
arch/um/include/asm/futex.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_UM_FUTEX_H
|
||||
#define _ASM_UM_FUTEX_H
|
||||
|
||||
#include <linux/futex.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/errno.h>
|
||||
|
||||
|
||||
int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr);
|
||||
int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||
u32 oldval, u32 newval);
|
||||
|
||||
#endif
|
||||
@@ -3,16 +3,23 @@
|
||||
#define _ASM_UM_IO_H
|
||||
#include <linux/types.h>
|
||||
|
||||
/* get emulated iomem (if desired) */
|
||||
#include <asm-generic/logic_io.h>
|
||||
|
||||
#ifndef ioremap
|
||||
#define ioremap ioremap
|
||||
static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* ioremap */
|
||||
|
||||
#ifndef iounmap
|
||||
#define iounmap iounmap
|
||||
static inline void iounmap(void __iomem *addr)
|
||||
{
|
||||
}
|
||||
#endif /* iounmap */
|
||||
|
||||
#include <asm-generic/io.h>
|
||||
|
||||
|
||||
@@ -31,7 +31,13 @@
|
||||
|
||||
#endif
|
||||
|
||||
#define NR_IRQS 64
|
||||
#define UM_LAST_SIGNAL_IRQ 64
|
||||
/* If we have (simulated) PCI MSI, allow 64 more interrupt numbers for it */
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
#define NR_IRQS (UM_LAST_SIGNAL_IRQ + 64)
|
||||
#else
|
||||
#define NR_IRQS UM_LAST_SIGNAL_IRQ
|
||||
#endif /* CONFIG_PCI_MSI */
|
||||
|
||||
#include <asm-generic/irq.h>
|
||||
#endif
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
#ifndef __UM_IRQFLAGS_H
|
||||
#define __UM_IRQFLAGS_H
|
||||
|
||||
extern int get_signals(void);
|
||||
extern int set_signals(int enable);
|
||||
extern void block_signals(void);
|
||||
extern void unblock_signals(void);
|
||||
extern int signals_enabled;
|
||||
int set_signals(int enable);
|
||||
void block_signals(void);
|
||||
void unblock_signals(void);
|
||||
|
||||
#define arch_local_save_flags arch_local_save_flags
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
return get_signals();
|
||||
return signals_enabled;
|
||||
}
|
||||
|
||||
#define arch_local_irq_restore arch_local_irq_restore
|
||||
|
||||
1
arch/um/include/asm/msi.h
Normal file
1
arch/um/include/asm/msi.h
Normal file
@@ -0,0 +1 @@
|
||||
#include <asm-generic/msi.h>
|
||||
39
arch/um/include/asm/pci.h
Normal file
39
arch/um/include/asm/pci.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef __ASM_UM_PCI_H
|
||||
#define __ASM_UM_PCI_H
|
||||
#include <linux/types.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define PCIBIOS_MIN_IO 0
|
||||
#define PCIBIOS_MIN_MEM 0
|
||||
|
||||
#define pcibios_assign_all_busses() 1
|
||||
|
||||
extern int isa_dma_bridge_buggy;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
|
||||
{
|
||||
/* no legacy IRQs */
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI_DOMAINS
|
||||
static inline int pci_proc_domain(struct pci_bus *bus)
|
||||
{
|
||||
/* always show the domain in /proc */
|
||||
return 1;
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
|
||||
/*
|
||||
* This is a bit of an annoying hack, and it assumes we only have
|
||||
* the virt-pci (if anything). Which is true, but still.
|
||||
*/
|
||||
void *pci_root_bus_fwnode(struct pci_bus *bus);
|
||||
#define pci_root_bus_fwnode pci_root_bus_fwnode
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_UM_PCI_H */
|
||||
@@ -16,6 +16,8 @@ struct task_struct;
|
||||
|
||||
#include <linux/prefetch.h>
|
||||
|
||||
#include <asm/cpufeatures.h>
|
||||
|
||||
struct mm_struct;
|
||||
|
||||
struct thread_struct {
|
||||
@@ -90,12 +92,18 @@ extern void start_thread(struct pt_regs *regs, unsigned long entry,
|
||||
struct cpuinfo_um {
|
||||
unsigned long loops_per_jiffy;
|
||||
int ipi_pipe[2];
|
||||
int cache_alignment;
|
||||
union {
|
||||
__u32 x86_capability[NCAPINTS + NBUGINTS];
|
||||
unsigned long x86_capability_alignment;
|
||||
};
|
||||
};
|
||||
|
||||
extern struct cpuinfo_um boot_cpu_data;
|
||||
|
||||
#define cpu_data (&boot_cpu_data)
|
||||
#define current_cpu_data boot_cpu_data
|
||||
#define cache_line_size() (boot_cpu_data.cache_alignment)
|
||||
|
||||
#define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
|
||||
extern unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user