Merge tag 'for-linus-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 11 Jan 2022 23:26:52 +0000 (15:26 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 11 Jan 2022 23:26:52 +0000 (15:26 -0800)
Pull UML updates from Richard Weinberger:

 - set_fs removal

 - Devicetree support

 - Many cleanups from Al

 - Various virtio and build related fixes

* tag 'for-linus-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml: (31 commits)
  um: virtio_uml: Allow probing from devicetree
  um: Add devicetree support
  um: Extract load file helper from initrd.c
  um: remove set_fs
  hostfs: Fix writeback of dirty pages
  um: Use swap() to make code cleaner
  um: header debriding - sigio.h
  um: header debriding - os.h
  um: header debriding - net_*.h
  um: header debriding - mem_user.h
  um: header debriding - activate_ipi()
  um: common-offsets.h debriding...
  um, x86: bury crypto_tfm_ctx_offset
  um: unexport handle_page_fault()
  um: remove a dangling extern of syscall_trace()
  um: kill unused cpu()
  uml/i386: missing include in barrier.h
  um: stop polluting the namespace with registers.h contents
  logic_io instance of iounmap() needs volatile on argument
  um: move amd64 variant of mmap(2) to arch/x86/um/syscalls_64.c
  ...

51 files changed:
arch/um/.gitignore
arch/um/Kconfig
arch/um/drivers/virt-pci.c
arch/um/drivers/virtio_uml.c
arch/um/include/asm/delay.h
arch/um/include/asm/irqflags.h
arch/um/include/asm/processor-generic.h
arch/um/include/asm/thread_info.h
arch/um/include/asm/uaccess.h
arch/um/include/shared/common-offsets.h
arch/um/include/shared/irq_user.h
arch/um/include/shared/kern_util.h
arch/um/include/shared/longjmp.h
arch/um/include/shared/mem_user.h
arch/um/include/shared/net_kern.h
arch/um/include/shared/net_user.h
arch/um/include/shared/os.h
arch/um/include/shared/registers.h
arch/um/include/shared/sigio.h
arch/um/kernel/Makefile
arch/um/kernel/dtb.c [new file with mode: 0644]
arch/um/kernel/exec.c
arch/um/kernel/initrd.c
arch/um/kernel/ksyms.c
arch/um/kernel/load_file.c [new file with mode: 0644]
arch/um/kernel/mem.c
arch/um/kernel/process.c
arch/um/kernel/skas/uaccess.c
arch/um/kernel/syscall.c [deleted file]
arch/um/kernel/trap.c
arch/um/kernel/um_arch.c
arch/um/kernel/um_arch.h [new file with mode: 0644]
arch/um/os-Linux/registers.c
arch/um/os-Linux/sigio.c
arch/um/os-Linux/signal.c
arch/um/os-Linux/start_up.c
arch/x86/kernel/asm-offsets.c
arch/x86/um/Makefile
arch/x86/um/asm/barrier.h
arch/x86/um/asm/segment.h
arch/x86/um/os-Linux/registers.c
arch/x86/um/ptrace_32.c
arch/x86/um/ptrace_64.c
arch/x86/um/shared/sysdep/syscalls_64.h
arch/x86/um/signal.c
arch/x86/um/sys_call_table_32.c
arch/x86/um/sys_call_table_64.c
arch/x86/um/syscalls_64.c
fs/hostfs/hostfs_kern.c
include/asm-generic/logic_io.h
lib/logic_iomem.c

index 6323e55..d69ea5b 100644 (file)
@@ -2,3 +2,4 @@
 kernel/config.c
 kernel/config.tmp
 kernel/vmlinux.lds
+kernel/capflags.c
index c18b45f..b233db4 100644 (file)
@@ -18,10 +18,10 @@ config UML
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DEBUG_BUGVERBOSE
        select NO_DMA if !UML_DMA_EMULATION
+       select OF_EARLY_FLATTREE if OF
        select GENERIC_IRQ_SHOW
        select GENERIC_CPU_DEVICES
        select HAVE_GCC_PLUGINS
-       select SET_FS
        select TRACE_IRQFLAGS_SUPPORT
        select TTY # Needed for line.c
        select HAVE_ARCH_VMAP_STACK
index c080666..0ab5801 100644 (file)
@@ -181,15 +181,15 @@ static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset,
        /* buf->data is maximum size - we may only use parts of it */
        struct um_pci_message_buffer *buf;
        u8 *data;
-       unsigned long ret = ~0ULL;
+       unsigned long ret = ULONG_MAX;
 
        if (!dev)
-               return ~0ULL;
+               return ULONG_MAX;
 
        buf = get_cpu_var(um_pci_msg_bufs);
        data = buf->data;
 
-       memset(data, 0xff, sizeof(data));
+       memset(buf->data, 0xff, sizeof(buf->data));
 
        switch (size) {
        case 1:
@@ -304,7 +304,7 @@ static unsigned long um_pci_bar_read(void *priv, unsigned int offset,
        /* buf->data is maximum size - we may only use parts of it */
        struct um_pci_message_buffer *buf;
        u8 *data;
-       unsigned long ret = ~0ULL;
+       unsigned long ret = ULONG_MAX;
 
        buf = get_cpu_var(um_pci_msg_bufs);
        data = buf->data;
index d51e445..ba562d6 100644 (file)
@@ -21,6 +21,7 @@
  * Based on Virtio MMIO driver by Pawel Moll, copyright 2011-2014, ARM Ltd.
  */
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/virtio.h>
@@ -49,6 +50,7 @@ struct virtio_uml_platform_data {
 struct virtio_uml_device {
        struct virtio_device vdev;
        struct platform_device *pdev;
+       struct virtio_uml_platform_data *pdata;
 
        spinlock_t sock_lock;
        int sock, req_fd, irq;
@@ -149,7 +151,7 @@ static int vhost_user_recv(struct virtio_uml_device *vu_dev,
        if (rc == -ECONNRESET && vu_dev->registered) {
                struct virtio_uml_platform_data *pdata;
 
-               pdata = vu_dev->pdev->dev.platform_data;
+               pdata = vu_dev->pdata;
 
                virtio_break_device(&vu_dev->vdev);
                schedule_work(&pdata->conn_broken_wk);
@@ -1090,6 +1092,8 @@ static void virtio_uml_release_dev(struct device *d)
                        container_of(d, struct virtio_device, dev);
        struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
 
+       time_travel_propagate_time();
+
        /* might not have been opened due to not negotiating the feature */
        if (vu_dev->req_fd >= 0) {
                um_free_irq(vu_dev->irq, vu_dev);
@@ -1113,21 +1117,63 @@ void virtio_uml_set_no_vq_suspend(struct virtio_device *vdev,
                 no_vq_suspend ? "dis" : "en");
 }
 
+static void vu_of_conn_broken(struct work_struct *wk)
+{
+       /*
+        * We can't remove the device from the devicetree so the only thing we
+        * can do is warn.
+        */
+       WARN_ON(1);
+}
+
 /* Platform device */
 
+static struct virtio_uml_platform_data *
+virtio_uml_create_pdata(struct platform_device *pdev)
+{
+       struct device_node *np = pdev->dev.of_node;
+       struct virtio_uml_platform_data *pdata;
+       int ret;
+
+       if (!np)
+               return ERR_PTR(-EINVAL);
+
+       pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return ERR_PTR(-ENOMEM);
+
+       INIT_WORK(&pdata->conn_broken_wk, vu_of_conn_broken);
+       pdata->pdev = pdev;
+
+       ret = of_property_read_string(np, "socket-path", &pdata->socket_path);
+       if (ret)
+               return ERR_PTR(ret);
+
+       ret = of_property_read_u32(np, "virtio-device-id",
+                                  &pdata->virtio_device_id);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return pdata;
+}
+
 static int virtio_uml_probe(struct platform_device *pdev)
 {
        struct virtio_uml_platform_data *pdata = pdev->dev.platform_data;
        struct virtio_uml_device *vu_dev;
        int rc;
 
-       if (!pdata)
-               return -EINVAL;
+       if (!pdata) {
+               pdata = virtio_uml_create_pdata(pdev);
+               if (IS_ERR(pdata))
+                       return PTR_ERR(pdata);
+       }
 
        vu_dev = kzalloc(sizeof(*vu_dev), GFP_KERNEL);
        if (!vu_dev)
                return -ENOMEM;
 
+       vu_dev->pdata = pdata;
        vu_dev->vdev.dev.parent = &pdev->dev;
        vu_dev->vdev.dev.release = virtio_uml_release_dev;
        vu_dev->vdev.config = &virtio_uml_config_ops;
@@ -1136,6 +1182,8 @@ static int virtio_uml_probe(struct platform_device *pdev)
        vu_dev->pdev = pdev;
        vu_dev->req_fd = -1;
 
+       time_travel_propagate_time();
+
        do {
                rc = os_connect_socket(pdata->socket_path);
        } while (rc == -EINTR);
index 56fc2b8..e79b2ab 100644 (file)
@@ -14,7 +14,7 @@ static inline void um_ndelay(unsigned long nsecs)
        ndelay(nsecs);
 }
 #undef ndelay
-#define ndelay um_ndelay
+#define ndelay(n) um_ndelay(n)
 
 static inline void um_udelay(unsigned long usecs)
 {
@@ -26,5 +26,5 @@ static inline void um_udelay(unsigned long usecs)
        udelay(usecs);
 }
 #undef udelay
-#define udelay um_udelay
+#define udelay(n) um_udelay(n)
 #endif /* __UM_DELAY_H */
index dab5744..1e69ef5 100644 (file)
@@ -3,7 +3,7 @@
 #define __UM_IRQFLAGS_H
 
 extern int signals_enabled;
-int set_signals(int enable);
+int um_set_signals(int enable);
 void block_signals(void);
 void unblock_signals(void);
 
@@ -16,7 +16,7 @@ static inline unsigned long arch_local_save_flags(void)
 #define arch_local_irq_restore arch_local_irq_restore
 static inline void arch_local_irq_restore(unsigned long flags)
 {
-       set_signals(flags);
+       um_set_signals(flags);
 }
 
 #define arch_local_irq_enable arch_local_irq_enable
index 579692a..6a4fe8b 100644 (file)
@@ -11,7 +11,6 @@ struct pt_regs;
 struct task_struct;
 
 #include <asm/ptrace.h>
-#include <registers.h>
 #include <sysdep/archsetjmp.h>
 
 #include <linux/prefetch.h>
@@ -105,6 +104,7 @@ extern struct cpuinfo_um boot_cpu_data;
 #define current_cpu_data boot_cpu_data
 #define cache_line_size()      (boot_cpu_data.cache_alignment)
 
+extern unsigned long get_thread_reg(int reg, jmp_buf *buf);
 #define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
 extern unsigned long __get_wchan(struct task_struct *p);
 
index 3b1cb8b..1395cbd 100644 (file)
@@ -22,9 +22,6 @@ struct thread_info {
        __u32                   cpu;            /* current CPU */
        int                     preempt_count;  /* 0 => preemptable,
                                                   <0 => BUG */
-       mm_segment_t            addr_limit;     /* thread address space:
-                                                  0-0xBFFFFFFF for user
-                                                  0-0xFFFFFFFF for kernel */
        struct thread_info      *real_thread;    /* Points to non-IRQ stack */
        unsigned long aux_fp_regs[FP_SIZE];     /* auxiliary fp_regs to save/restore
                                                   them out-of-band */
@@ -36,7 +33,6 @@ struct thread_info {
        .flags =                0,              \
        .cpu =          0,                      \
        .preempt_count = INIT_PREEMPT_COUNT,    \
-       .addr_limit =   KERNEL_DS,              \
        .real_thread = NULL,                    \
 }
 
index 191ef36..17d18cf 100644 (file)
@@ -8,6 +8,7 @@
 #define __UM_UACCESS_H
 
 #include <asm/elf.h>
+#include <asm/unaligned.h>
 
 #define __under_task_size(addr, size) \
        (((unsigned long) (addr) < TASK_SIZE) && \
@@ -39,8 +40,24 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
 {
        return __addr_range_nowrap(addr, size) &&
                (__under_task_size(addr, size) ||
-               __access_ok_vsyscall(addr, size) ||
-               uaccess_kernel());
+                __access_ok_vsyscall(addr, size));
 }
 
+/* no pagefaults for kernel addresses in um */
+#define HAVE_GET_KERNEL_NOFAULT 1
+
+#define __get_kernel_nofault(dst, src, type, err_label)                        \
+do {                                                                   \
+       *((type *)dst) = get_unaligned((type *)(src));                  \
+       if (0) /* make sure the label looks used to the compiler */     \
+               goto err_label;                                         \
+} while (0)
+
+#define __put_kernel_nofault(dst, src, type, err_label)                        \
+do {                                                                   \
+       put_unaligned(*((type *)src), (type *)(dst));                   \
+       if (0) /* make sure the label looks used to the compiler */     \
+               goto err_label;                                         \
+} while (0)
+
 #endif
index edc90ab..9619548 100644 (file)
@@ -9,32 +9,17 @@ DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
 DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT);
 DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC);
 
-DEFINE(UM_ELF_CLASS, ELF_CLASS);
-DEFINE(UM_ELFCLASS32, ELFCLASS32);
-DEFINE(UM_ELFCLASS64, ELFCLASS64);
-
-DEFINE(UM_NR_CPUS, NR_CPUS);
-
 DEFINE(UM_GFP_KERNEL, GFP_KERNEL);
 DEFINE(UM_GFP_ATOMIC, GFP_ATOMIC);
 
-/* For crypto assembler code. */
-DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
-
 DEFINE(UM_THREAD_SIZE, THREAD_SIZE);
 
-DEFINE(UM_HZ, HZ);
-
-DEFINE(UM_USEC_PER_SEC, USEC_PER_SEC);
 DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC);
 DEFINE(UM_NSEC_PER_USEC, NSEC_PER_USEC);
 
 #ifdef CONFIG_PRINTK
 DEFINE(UML_CONFIG_PRINTK, CONFIG_PRINTK);
 #endif
-#ifdef CONFIG_NO_HZ_COMMON
-DEFINE(UML_CONFIG_NO_HZ_COMMON, CONFIG_NO_HZ_COMMON);
-#endif
 #ifdef CONFIG_UML_X86
 DEFINE(UML_CONFIG_UML_X86, CONFIG_UML_X86);
 #endif
index 86a8a57..da0f6ee 100644 (file)
@@ -20,6 +20,5 @@ void sigio_run_timetravel_handlers(void);
 extern void free_irq_by_fd(int fd);
 extern void deactivate_fd(int fd, int irqnum);
 extern int deactivate_all_fds(void);
-extern int activate_ipi(int fd, int pid);
 
 #endif
index a2cfd42..d8b8b4f 100644 (file)
@@ -53,13 +53,11 @@ extern void do_uml_exitcalls(void);
 extern int __cant_sleep(void);
 extern int get_current_pid(void);
 extern int copy_from_user_proc(void *to, void *from, int size);
-extern int cpu(void);
 extern char *uml_strdup(const char *string);
 
 extern unsigned long to_irq_stack(unsigned long *mask_out);
 extern unsigned long from_irq_stack(int nested);
 
-extern void syscall_trace(struct uml_pt_regs *regs, int entryexit);
 extern int singlestepping(void *t);
 
 extern void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
index bdb2869..8863319 100644 (file)
@@ -18,7 +18,7 @@ extern void longjmp(jmp_buf, int);
        enable = *(volatile int *)&signals_enabled;     \
        n = setjmp(*buf);                               \
        if(n != 0)                                      \
-               set_signals_trace(enable);              \
+               um_set_signals_trace(enable);           \
        n; })
 
 #endif
index cb84414..11a723a 100644 (file)
@@ -46,16 +46,11 @@ extern int iomem_size;
 
 #define ROUND_4M(n) ((((unsigned long) (n)) + (1 << 22)) & ~((1 << 22) - 1))
 
-extern int init_mem_user(void);
-extern void setup_memory(void *entry);
 extern unsigned long find_iomem(char *driver, unsigned long *len_out);
 extern void mem_total_pages(unsigned long physmem, unsigned long iomem,
                     unsigned long highmem);
-extern unsigned long get_vm(unsigned long len);
 extern void setup_physmem(unsigned long start, unsigned long usable,
                          unsigned long len, unsigned long long highmem);
-extern void add_iomem(char *name, int fd, unsigned long size);
-extern unsigned long phys_offset(unsigned long phys);
 extern void map_memory(unsigned long virt, unsigned long phys,
                       unsigned long len, int r, int w, int x);
 
index a87be13..441a8a3 100644 (file)
@@ -59,8 +59,6 @@ struct transport {
        const int setup_size;
 };
 
-extern struct net_device *ether_init(int);
-extern unsigned short ether_protocol(struct sk_buff *);
 extern int tap_setup_common(char *str, char *type, char **dev_name,
                            char **mac_out, char **gate_addr);
 extern void register_transport(struct transport *new);
index 1b05317..ba92a4d 100644 (file)
@@ -24,7 +24,6 @@ struct net_user_info {
        int mtu;
 };
 
-extern void ether_user_init(void *data, void *dev);
 extern void iter_addresses(void *d, void (*cb)(unsigned char *,
                                               unsigned char *, void *),
                           void *arg);
index 96d4003..0021405 100644 (file)
@@ -159,20 +159,11 @@ extern int os_create_unix_socket(const char *file, int len, int close_on_exec);
 extern int os_shutdown_socket(int fd, int r, int w);
 extern void os_close_file(int fd);
 extern int os_rcv_fd(int fd, int *helper_pid_out);
-extern int create_unix_socket(char *file, int len, int close_on_exec);
 extern int os_connect_socket(const char *name);
 extern int os_file_type(char *file);
 extern int os_file_mode(const char *file, struct openflags *mode_out);
 extern int os_lock_file(int fd, int excl);
 extern void os_flush_stdout(void);
-extern int os_stat_filesystem(char *path, long *bsize_out,
-                             long long *blocks_out, long long *bfree_out,
-                             long long *bavail_out, long long *files_out,
-                             long long *ffree_out, void *fsid_out,
-                             int fsid_size, long *namelen_out,
-                             long *spare_out);
-extern int os_change_dir(char *dir);
-extern int os_fchange_dir(int fd);
 extern unsigned os_major(unsigned long long dev);
 extern unsigned os_minor(unsigned long long dev);
 extern unsigned long long os_makedev(unsigned major, unsigned minor);
@@ -232,14 +223,13 @@ extern char *get_umid(void);
 /* signal.c */
 extern void timer_set_signal_handler(void);
 extern void set_sigstack(void *sig_stack, int size);
-extern void remove_sigstack(void);
 extern void set_handler(int sig);
 extern void send_sigio_to_self(void);
 extern int change_sig(int signal, int on);
 extern void block_signals(void);
 extern void unblock_signals(void);
-extern int set_signals(int enable);
-extern int set_signals_trace(int enable);
+extern int um_set_signals(int enable);
+extern int um_set_signals_trace(int enable);
 extern int os_is_signal_stack(void);
 extern void deliver_alarm(void);
 extern void register_pm_wake_signal(void);
@@ -266,7 +256,6 @@ extern int os_timer_create(void);
 extern int os_timer_set_interval(unsigned long long nsecs);
 extern int os_timer_one_shot(unsigned long long nsecs);
 extern void os_timer_disable(void);
-extern void uml_idle_timer(void);
 extern long long os_persistent_clock_emulation(void);
 extern long long os_nsecs(void);
 
@@ -290,8 +279,6 @@ extern int is_skas_winch(int pid, int fd, void *data);
 extern int start_userspace(unsigned long stub_stack);
 extern int copy_context_skas0(unsigned long stack, int pid);
 extern void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs);
-extern int map_stub_pages(int fd, unsigned long code, unsigned long data,
-                         unsigned long stack);
 extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
 extern void switch_threads(jmp_buf *me, jmp_buf *you);
 extern int start_idle_thread(void *stack, jmp_buf *switch_buf);
index 0c50fa6..2f9c3ce 100644 (file)
@@ -7,7 +7,6 @@
 #define __REGISTERS_H
 
 #include <sysdep/ptrace.h>
-#include <sysdep/archsetjmp.h>
 
 extern int save_i387_registers(int pid, unsigned long *fp_regs);
 extern int restore_i387_registers(int pid, unsigned long *fp_regs);
@@ -16,10 +15,9 @@ extern int restore_fp_registers(int pid, unsigned long *fp_regs);
 extern int save_fpx_registers(int pid, unsigned long *fp_regs);
 extern int restore_fpx_registers(int pid, unsigned long *fp_regs);
 extern int save_registers(int pid, struct uml_pt_regs *regs);
-extern int restore_registers(int pid, struct uml_pt_regs *regs);
-extern int init_registers(int pid);
+extern int restore_pid_registers(int pid, struct uml_pt_regs *regs);
+extern int init_pid_registers(int pid);
 extern void get_safe_registers(unsigned long *regs, unsigned long *fp_regs);
-extern unsigned long get_thread_reg(int reg, jmp_buf *buf);
 extern int get_fp_registers(int pid, unsigned long *regs);
 extern int put_fp_registers(int pid, unsigned long *regs);
 
index 8fe8f57..e60c8b2 100644 (file)
@@ -7,7 +7,6 @@
 #define __SIGIO_H__
 
 extern int write_sigio_irq(int fd);
-extern int register_sigio_fd(int fd);
 extern void sigio_lock(void);
 extern void sigio_unlock(void);
 
index 1d18e4e..1c2d4b2 100644 (file)
@@ -16,11 +16,13 @@ extra-y := vmlinux.lds
 
 obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
        physmem.o process.o ptrace.o reboot.o sigio.o \
-       signal.o syscall.o sysrq.o time.o tlb.o trap.o \
+       signal.o sysrq.o time.o tlb.o trap.o \
        um_arch.o umid.o maccess.o kmsg_dump.o capflags.o skas/
+obj-y += load_file.o
 
 obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
 obj-$(CONFIG_GPROF)    += gprof_syms.o
+obj-$(CONFIG_OF) += dtb.o
 obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
 obj-$(CONFIG_STACKTRACE) += stacktrace.o
 obj-$(CONFIG_GENERIC_PCI_IOMAP) += ioport.o
diff --git a/arch/um/kernel/dtb.c b/arch/um/kernel/dtb.c
new file mode 100644 (file)
index 0000000..ca69d72
--- /dev/null
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/init.h>
+#include <linux/of_fdt.h>
+#include <linux/printk.h>
+#include <linux/memblock.h>
+#include <init.h>
+
+#include "um_arch.h"
+
+static char *dtb __initdata;
+
+void uml_dtb_init(void)
+{
+       long long size;
+       void *area;
+
+       area = uml_load_file(dtb, &size);
+       if (!area)
+               return;
+
+       if (!early_init_dt_scan(area)) {
+               pr_err("invalid DTB %s\n", dtb);
+               memblock_free(area, size);
+               return;
+       }
+
+       unflatten_device_tree();
+       early_init_fdt_scan_reserved_mem();
+}
+
+static int __init uml_dtb_setup(char *line, int *add)
+{
+       dtb = line;
+       return 0;
+}
+
+__uml_setup("dtb=", uml_dtb_setup,
+"dtb=<file>\n"
+"    Boot the kernel with the devicetree blob from the specified file.\n"
+);
index 4d84981..c85e40c 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/uaccess.h>
 #include <as-layout.h>
 #include <mem_user.h>
+#include <registers.h>
 #include <skas.h>
 #include <os.h>
 
index c1981ff..47b8cb1 100644 (file)
 #include <init.h>
 #include <os.h>
 
+#include "um_arch.h"
+
 /* Changed by uml_initrd_setup, which is a setup */
 static char *initrd __initdata = NULL;
-static int load_initrd(char *filename, void *buf, int size);
 
 int __init read_initrd(void)
 {
+       unsigned long long size;
        void *area;
-       long long size;
-       int err;
-
-       if (initrd == NULL)
-               return 0;
 
-       err = os_file_size(initrd, &size);
-       if (err)
+       if (!initrd)
                return 0;
 
-       /*
-        * This is necessary because alloc_bootmem craps out if you
-        * ask for no memory.
-        */
-       if (size == 0) {
-               printk(KERN_ERR "\"%s\" is a zero-size initrd\n", initrd);
-               return 0;
-       }
-
-       area = memblock_alloc(size, SMP_CACHE_BYTES);
+       area = uml_load_file(initrd, &size);
        if (!area)
-               panic("%s: Failed to allocate %llu bytes\n", __func__, size);
-
-       if (load_initrd(initrd, area, size) == -1)
                return 0;
 
        initrd_start = (unsigned long) area;
@@ -59,25 +43,3 @@ __uml_setup("initrd=", uml_initrd_setup,
 "    This is used to boot UML from an initrd image.  The argument is the\n"
 "    name of the file containing the image.\n\n"
 );
-
-static int load_initrd(char *filename, void *buf, int size)
-{
-       int fd, n;
-
-       fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
-       if (fd < 0) {
-               printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename,
-                      -fd);
-               return -1;
-       }
-       n = os_read_file(fd, buf, size);
-       if (n != size) {
-               printk(KERN_ERR "Read of %d bytes from '%s' failed, "
-                      "err = %d\n", size,
-                      filename, -n);
-               return -1;
-       }
-
-       os_close_file(fd);
-       return 0;
-}
index b1e5634..3a85bde 100644 (file)
@@ -6,7 +6,7 @@
 #include <linux/module.h>
 #include <os.h>
 
-EXPORT_SYMBOL(set_signals);
+EXPORT_SYMBOL(um_set_signals);
 EXPORT_SYMBOL(signals_enabled);
 
 EXPORT_SYMBOL(os_stat_fd);
diff --git a/arch/um/kernel/load_file.c b/arch/um/kernel/load_file.c
new file mode 100644 (file)
index 0000000..5cecd0e
--- /dev/null
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
+ */
+#include <linux/memblock.h>
+#include <os.h>
+
+#include "um_arch.h"
+
+static int __init __uml_load_file(const char *filename, void *buf, int size)
+{
+       int fd, n;
+
+       fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
+       if (fd < 0) {
+               printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename,
+                      -fd);
+               return -1;
+       }
+       n = os_read_file(fd, buf, size);
+       if (n != size) {
+               printk(KERN_ERR "Read of %d bytes from '%s' failed, "
+                      "err = %d\n", size,
+                      filename, -n);
+               return -1;
+       }
+
+       os_close_file(fd);
+       return 0;
+}
+
+void *uml_load_file(const char *filename, unsigned long long *size)
+{
+       void *area;
+       int err;
+
+       *size = 0;
+
+       if (!filename)
+               return NULL;
+
+       err = os_file_size(filename, size);
+       if (err)
+               return NULL;
+
+       if (*size == 0) {
+               printk(KERN_ERR "\"%s\" is empty\n", filename);
+               return NULL;
+       }
+
+       area = memblock_alloc(*size, SMP_CACHE_BYTES);
+       if (!area)
+               panic("%s: Failed to allocate %llu bytes\n", __func__, *size);
+
+       if (__uml_load_file(filename, area, *size)) {
+               memblock_free(area, *size);
+               return NULL;
+       }
+
+       return area;
+}
index 0039771..15295c3 100644 (file)
@@ -85,8 +85,7 @@ static void __init one_md_table_init(pud_t *pud)
                      __func__, PAGE_SIZE, PAGE_SIZE);
 
        set_pud(pud, __pud(_KERNPG_TABLE + (unsigned long) __pa(pmd_table)));
-       if (pmd_table != pmd_offset(pud, 0))
-               BUG();
+       BUG_ON(pmd_table != pmd_offset(pud, 0));
 #endif
 }
 
index 8210737..4a42077 100644 (file)
@@ -31,6 +31,7 @@
 #include <kern_util.h>
 #include <os.h>
 #include <skas.h>
+#include <registers.h>
 #include <linux/time-internal.h>
 
 /*
@@ -263,11 +264,6 @@ int clear_user_proc(void __user *buf, int size)
        return clear_user(buf, size);
 }
 
-int cpu(void)
-{
-       return current_thread_info()->cpu;
-}
-
 static atomic_t using_sysemu = ATOMIC_INIT(0);
 int sysemu_supported;
 
index a509be9..23775d0 100644 (file)
@@ -146,11 +146,6 @@ static int copy_chunk_from_user(unsigned long from, int len, void *arg)
 
 unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)
 {
-       if (uaccess_kernel()) {
-               memcpy(to, (__force void*)from, n);
-               return 0;
-       }
-
        return buffer_op((unsigned long) from, n, 0, copy_chunk_from_user, &to);
 }
 EXPORT_SYMBOL(raw_copy_from_user);
@@ -166,11 +161,6 @@ static int copy_chunk_to_user(unsigned long to, int len, void *arg)
 
 unsigned long raw_copy_to_user(void __user *to, const void *from, unsigned long n)
 {
-       if (uaccess_kernel()) {
-               memcpy((__force void *) to, from, n);
-               return 0;
-       }
-
        return buffer_op((unsigned long) to, n, 1, copy_chunk_to_user, &from);
 }
 EXPORT_SYMBOL(raw_copy_to_user);
@@ -196,12 +186,6 @@ long strncpy_from_user(char *dst, const char __user *src, long count)
 
        if (!access_ok(src, 1))
                return -EFAULT;
-
-       if (uaccess_kernel()) {
-               strncpy(dst, (__force void *) src, count);
-               return strnlen(dst, count);
-       }
-
        n = buffer_op((unsigned long) src, count, 0, strncpy_chunk_from_user,
                      &ptr);
        if (n != 0)
@@ -218,11 +202,6 @@ static int clear_chunk(unsigned long addr, int len, void *unused)
 
 unsigned long __clear_user(void __user *mem, unsigned long len)
 {
-       if (uaccess_kernel()) {
-               memset((__force void*)mem, 0, len);
-               return 0;
-       }
-
        return buffer_op((unsigned long) mem, len, 1, clear_chunk, NULL);
 }
 EXPORT_SYMBOL(__clear_user);
@@ -245,10 +224,6 @@ long strnlen_user(const char __user *str, long len)
 
        if (!access_ok(str, 1))
                return -EFAULT;
-
-       if (uaccess_kernel())
-               return strnlen((__force char*)str, len) + 1;
-
        n = buffer_op((unsigned long) str, len, 0, strnlen_chunk, &count);
        if (n == 0)
                return count + 1;
diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c
deleted file mode 100644 (file)
index eed54c5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
- */
-
-#include <linux/file.h>
-#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/utsname.h>
-#include <linux/syscalls.h>
-#include <asm/current.h>
-#include <asm/mman.h>
-#include <linux/uaccess.h>
-#include <asm/unistd.h>
-
-long old_mmap(unsigned long addr, unsigned long len,
-             unsigned long prot, unsigned long flags,
-             unsigned long fd, unsigned long offset)
-{
-       long err = -EINVAL;
-       if (offset & ~PAGE_MASK)
-               goto out;
-
-       err = ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
- out:
-       return err;
-}
index c32efb0..561a2b0 100644 (file)
@@ -127,7 +127,6 @@ out_of_memory:
        pagefault_out_of_memory();
        return 0;
 }
-EXPORT_SYMBOL(handle_page_fault);
 
 static void show_segv_info(struct uml_pt_regs *regs)
 {
index 5444769..abceeab 100644 (file)
@@ -29,6 +29,8 @@
 #include <mem_user.h>
 #include <os.h>
 
+#include "um_arch.h"
+
 #define DEFAULT_COMMAND_LINE_ROOT "root=98:0"
 #define DEFAULT_COMMAND_LINE_CONSOLE "console=tty"
 
@@ -407,6 +409,7 @@ void __init setup_arch(char **cmdline_p)
        stack_protections((unsigned long) &init_thread_info);
        setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);
        mem_total_pages(physmem_size, iomem_size, highmem);
+       uml_dtb_init();
        read_initrd();
 
        paging_init();
diff --git a/arch/um/kernel/um_arch.h b/arch/um/kernel/um_arch.h
new file mode 100644 (file)
index 0000000..1e07fb7
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __UML_ARCH_H__
+#define __UML_ARCH_H__
+
+extern void * __init uml_load_file(const char *filename, unsigned long long *size);
+
+#ifdef CONFIG_OF
+extern void __init uml_dtb_init(void);
+#else
+static inline void uml_dtb_init(void) { }
+#endif
+
+#endif
index 2d92705..b123955 100644 (file)
@@ -21,7 +21,7 @@ int save_registers(int pid, struct uml_pt_regs *regs)
        return 0;
 }
 
-int restore_registers(int pid, struct uml_pt_regs *regs)
+int restore_pid_registers(int pid, struct uml_pt_regs *regs)
 {
        int err;
 
@@ -36,7 +36,7 @@ int restore_registers(int pid, struct uml_pt_regs *regs)
 static unsigned long exec_regs[MAX_REG_NR];
 static unsigned long exec_fp_regs[FP_SIZE];
 
-int init_registers(int pid)
+int init_pid_registers(int pid)
 {
        int err;
 
index 6597ea1..37d60e7 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2002 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  */
 
+#include <linux/minmax.h>
 #include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -50,7 +51,7 @@ static struct pollfds all_sigio_fds;
 
 static int write_sigio_thread(void *unused)
 {
-       struct pollfds *fds, tmp;
+       struct pollfds *fds;
        struct pollfd *p;
        int i, n, respond_fd;
        char c;
@@ -77,9 +78,7 @@ static int write_sigio_thread(void *unused)
                                               "write_sigio_thread : "
                                               "read on socket failed, "
                                               "err = %d\n", errno);
-                               tmp = current_poll;
-                               current_poll = next_poll;
-                               next_poll = tmp;
+                               swap(current_poll, next_poll);
                                respond_fd = sigio_private[1];
                        }
                        else {
@@ -132,7 +131,7 @@ static void update_thread(void)
        int n;
        char c;
 
-       flags = set_signals_trace(0);
+       flags = um_set_signals_trace(0);
        CATCH_EINTR(n = write(sigio_private[0], &c, sizeof(c)));
        if (n != sizeof(c)) {
                printk(UM_KERN_ERR "update_thread : write failed, err = %d\n",
@@ -147,7 +146,7 @@ static void update_thread(void)
                goto fail;
        }
 
-       set_signals_trace(flags);
+       um_set_signals_trace(flags);
        return;
  fail:
        /* Critical section start */
@@ -161,7 +160,7 @@ static void update_thread(void)
        close(write_sigio_fds[0]);
        close(write_sigio_fds[1]);
        /* Critical section end */
-       set_signals_trace(flags);
+       um_set_signals_trace(flags);
 }
 
 int __add_sigio_fd(int fd)
index 6cf098c..24a403a 100644 (file)
@@ -94,7 +94,7 @@ void sig_handler(int sig, struct siginfo *si, mcontext_t *mc)
 
        sig_handler_common(sig, si, mc);
 
-       set_signals_trace(enabled);
+       um_set_signals_trace(enabled);
 }
 
 static void timer_real_alarm_handler(mcontext_t *mc)
@@ -126,7 +126,7 @@ void timer_alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc)
 
        signals_active &= ~SIGALRM_MASK;
 
-       set_signals_trace(enabled);
+       um_set_signals_trace(enabled);
 }
 
 void deliver_alarm(void) {
@@ -348,7 +348,7 @@ void unblock_signals(void)
        }
 }
 
-int set_signals(int enable)
+int um_set_signals(int enable)
 {
        int ret;
        if (signals_enabled == enable)
@@ -362,7 +362,7 @@ int set_signals(int enable)
        return ret;
 }
 
-int set_signals_trace(int enable)
+int um_set_signals_trace(int enable)
 {
        int ret;
        if (signals_enabled == enable)
index 8a72c99..e3ee4db 100644 (file)
@@ -368,7 +368,7 @@ void __init os_early_checks(void)
        check_tmpexec();
 
        pid = start_ptraced_child();
-       if (init_registers(pid))
+       if (init_pid_registers(pid))
                fatal("Failed to initialize default registers");
        stop_ptraced_child(pid, 1, 1);
 }
index ecd3fd6..9fb0a2f 100644 (file)
@@ -37,9 +37,6 @@ static void __used common(void)
        OFFSET(TASK_stack_canary, task_struct, stack_canary);
 #endif
 
-       BLANK();
-       OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
-
        BLANK();
        OFFSET(pbe_address, pbe, address);
        OFFSET(pbe_orig_address, pbe, orig_address);
index 5ccb182..ba5789c 100644 (file)
@@ -40,7 +40,7 @@ $(obj)/user-offsets.s: c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \
        -Iarch/x86/include/generated
 targets += user-offsets.s
 
-include/generated/user_constants.h: $(obj)/user-offsets.s
+include/generated/user_constants.h: $(obj)/user-offsets.s FORCE
        $(call filechk,offsets,__USER_CONSTANT_H__)
 
 UNPROFILE_OBJS := stub_segv.o
index 165be7f..4da3369 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef _ASM_UM_BARRIER_H_
 #define _ASM_UM_BARRIER_H_
 
+#include <asm/cpufeatures.h>
 #include <asm/alternative.h>
 
 /*
index 453db37..2ef507b 100644 (file)
@@ -8,12 +8,4 @@ extern int host_gdt_entry_tls_min;
 #define GDT_ENTRY_TLS_MIN host_gdt_entry_tls_min
 #define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
 
-typedef struct {
-       unsigned long seg;
-} mm_segment_t;
-
-#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
-#define KERNEL_DS      MAKE_MM_SEG(~0UL)
-#define USER_DS                MAKE_MM_SEG(TASK_SIZE)
-
 #endif
index 3c423df..df8f4b4 100644 (file)
@@ -15,6 +15,7 @@
 #include <sys/uio.h>
 #include <asm/sigcontext.h>
 #include <linux/elf.h>
+#include <registers.h>
 
 int have_xstate_support;
 
index 2497bac..0bc4b73 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/sched.h>
 #include <linux/uaccess.h>
 #include <asm/ptrace-abi.h>
+#include <registers.h>
 #include <skas.h>
 
 extern int arch_switch_tls(struct task_struct *to);
index 1401899..289d015 100644 (file)
@@ -11,6 +11,7 @@
 #define __FRAME_OFFSETS
 #include <asm/ptrace.h>
 #include <linux/uaccess.h>
+#include <registers.h>
 #include <asm/ptrace-abi.h>
 
 /*
index 8a7d5e1..48d6cd1 100644 (file)
@@ -23,9 +23,6 @@ extern syscall_handler_t *sys_call_table[];
                                      UPT_SYSCALL_ARG5(&regs->regs), \
                                      UPT_SYSCALL_ARG6(&regs->regs)))
 
-extern long old_mmap(unsigned long addr, unsigned long len,
-                    unsigned long prot, unsigned long flags,
-                    unsigned long fd, unsigned long pgoff);
 extern syscall_handler_t sys_modify_ldt;
 extern syscall_handler_t sys_arch_prctl;
 
index 7c11c9e..263e1d0 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/uaccess.h>
 #include <asm/ucontext.h>
 #include <frame_kern.h>
+#include <registers.h>
 #include <skas.h>
 
 #ifdef CONFIG_X86_32
index 0575dec..89df5d8 100644 (file)
@@ -9,8 +9,6 @@
 #include <linux/cache.h>
 #include <asm/syscall.h>
 
-#define __NO_STUBS
-
 /*
  * Below you can see, in terms of #define's, the differences between the x86-64
  * and the UML syscall table.
@@ -23,8 +21,6 @@
 #define sys_vm86old sys_ni_syscall
 #define sys_vm86 sys_ni_syscall
 
-#define old_mmap sys_old_mmap
-
 #define __SYSCALL_WITH_COMPAT(nr, native, compat)      __SYSCALL(nr, native)
 
 #define __SYSCALL(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
index 95725b5..b0b4cfd 100644 (file)
@@ -9,8 +9,6 @@
 #include <linux/cache.h>
 #include <asm/syscall.h>
 
-#define __NO_STUBS
-
 /*
  * Below you can see, in terms of #define's, the differences between the x86-64
  * and the UML syscall table.
 #define sys_iopl sys_ni_syscall
 #define sys_ioperm sys_ni_syscall
 
-/*
- * The UML TLS problem. Note that x86_64 does not implement this, so the below
- * is needed only for the ia32 compatibility.
- */
-
-/* On UML we call it this way ("old" means it's not mmap2) */
-#define sys_mmap old_mmap
-
-#define stub_clone sys_clone
-#define stub_fork sys_fork
-#define stub_vfork sys_vfork
-#define stub_execve sys_execve
-#define stub_execveat sys_execveat
-#define stub_rt_sigreturn sys_rt_sigreturn
-
 #define __SYSCALL(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
 #include <asm/syscalls_64.h>
 
index 58f5166..fe5323f 100644 (file)
@@ -10,7 +10,9 @@
 #include <linux/syscalls.h>
 #include <linux/uaccess.h>
 #include <asm/prctl.h> /* XXX This should get the constants from libc */
+#include <registers.h>
 #include <os.h>
+#include <registers.h>
 
 long arch_prctl(struct task_struct *task, int option,
                unsigned long __user *arg2)
@@ -35,7 +37,7 @@ long arch_prctl(struct task_struct *task, int option,
        switch (option) {
        case ARCH_SET_FS:
        case ARCH_SET_GS:
-               ret = restore_registers(pid, &current->thread.regs.regs);
+               ret = restore_pid_registers(pid, &current->thread.regs.regs);
                if (ret)
                        return ret;
                break;
@@ -87,3 +89,13 @@ void arch_switch_to(struct task_struct *to)
 
        arch_prctl(to, ARCH_SET_FS, (void __user *) to->thread.arch.fs);
 }
+
+SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
+               unsigned long, prot, unsigned long, flags,
+               unsigned long, fd, unsigned long, off)
+{
+       if (off & ~PAGE_MASK)
+               return -EINVAL;
+
+       return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
+}
index d5c9d88..ef481c3 100644 (file)
@@ -924,6 +924,9 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent)
        sb->s_op = &hostfs_sbops;
        sb->s_d_op = &simple_dentry_operations;
        sb->s_maxbytes = MAX_LFS_FILESIZE;
+       err = super_setup_bdi(sb);
+       if (err)
+               goto out;
 
        /* NULL is printed as '(null)' by printf(): avoid that. */
        if (req_root == NULL)
index a53116b..8a59b6e 100644 (file)
@@ -34,7 +34,7 @@
 void __iomem *ioremap(phys_addr_t offset, size_t size);
 
 #define iounmap iounmap
-void iounmap(void __iomem *addr);
+void iounmap(void volatile __iomem *addr);
 
 #define __raw_readb __raw_readb
 u8 __raw_readb(const volatile void __iomem *addr);
index 9bdfde0..8c3365f 100644 (file)
@@ -21,15 +21,15 @@ struct logic_iomem_area {
 
 #define AREA_SHIFT     24
 #define MAX_AREA_SIZE  (1 << AREA_SHIFT)
-#define MAX_AREAS      ((1ULL<<32) / MAX_AREA_SIZE)
+#define MAX_AREAS      ((1U << 31) / MAX_AREA_SIZE)
 #define AREA_BITS      ((MAX_AREAS - 1) << AREA_SHIFT)
 #define AREA_MASK      (MAX_AREA_SIZE - 1)
 #ifdef CONFIG_64BIT
 #define IOREMAP_BIAS   0xDEAD000000000000UL
 #define IOREMAP_MASK   0xFFFFFFFF00000000UL
 #else
-#define IOREMAP_BIAS   0
-#define IOREMAP_MASK   0
+#define IOREMAP_BIAS   0x80000000UL
+#define IOREMAP_MASK   0x80000000UL
 #endif
 
 static DEFINE_MUTEX(regions_mtx);
@@ -76,10 +76,10 @@ static void __iomem *real_ioremap(phys_addr_t offset, size_t size)
        return NULL;
 }
 
-static void real_iounmap(void __iomem *addr)
+static void real_iounmap(volatile void __iomem *addr)
 {
        WARN(1, "invalid iounmap for addr 0x%llx\n",
-            (unsigned long long __force)addr);
+            (unsigned long long)(uintptr_t __force)addr);
 }
 #endif /* CONFIG_LOGIC_IOMEM_FALLBACK */
 
@@ -149,7 +149,7 @@ get_area(const volatile void __iomem *addr)
        return NULL;
 }
 
-void iounmap(void __iomem *addr)
+void iounmap(volatile void __iomem *addr)
 {
        struct logic_iomem_area *area = get_area(addr);
 
@@ -173,7 +173,7 @@ EXPORT_SYMBOL(iounmap);
 static u##sz real_raw_read ## op(const volatile void __iomem *addr)    \
 {                                                                      \
        WARN(1, "Invalid read" #op " at address %llx\n",                \
-            (unsigned long long __force)addr);                         \
+            (unsigned long long)(uintptr_t __force)addr);              \
        return (u ## sz)~0ULL;                                          \
 }                                                                      \
                                                                        \
@@ -181,7 +181,8 @@ static void real_raw_write ## op(u ## sz val,                               \
                                 volatile void __iomem *addr)           \
 {                                                                      \
        WARN(1, "Invalid writeq" #op " of 0x%llx at address %llx\n",    \
-            (unsigned long long)val, (unsigned long long __force)addr);\
+            (unsigned long long)val,                                   \
+            (unsigned long long)(uintptr_t __force)addr);\
 }                                                                      \
 
 MAKE_FALLBACK(b, 8);
@@ -194,14 +195,14 @@ MAKE_FALLBACK(q, 64);
 static void real_memset_io(volatile void __iomem *addr, int value, size_t size)
 {
        WARN(1, "Invalid memset_io at address 0x%llx\n",
-            (unsigned long long __force)addr);
+            (unsigned long long)(uintptr_t __force)addr);
 }
 
 static void real_memcpy_fromio(void *buffer, const volatile void __iomem *addr,
                               size_t size)
 {
        WARN(1, "Invalid memcpy_fromio at address 0x%llx\n",
-            (unsigned long long __force)addr);
+            (unsigned long long)(uintptr_t __force)addr);
 
        memset(buffer, 0xff, size);
 }
@@ -210,7 +211,7 @@ static void real_memcpy_toio(volatile void __iomem *addr, const void *buffer,
                             size_t size)
 {
        WARN(1, "Invalid memcpy_toio at address 0x%llx\n",
-            (unsigned long long __force)addr);
+            (unsigned long long)(uintptr_t __force)addr);
 }
 #endif /* CONFIG_LOGIC_IOMEM_FALLBACK */