
[ Upstream commit 92dcd3d31843fbe1a95d880dc912e1f6beac6632 ] In order to be able to experiment with suspend in UML, add the minimal work to be able to suspend (s2idle) an instance of UML, and be able to wake it back up from that state with the USR1 signal sent to the main UML process. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com> Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Sasha Levin <sashal@kernel.org>
73 lines
2.1 KiB
C
73 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
|
*/
|
|
|
|
#ifndef __KERN_UTIL_H__
|
|
#define __KERN_UTIL_H__
|
|
|
|
#include <sysdep/ptrace.h>
|
|
#include <sysdep/faultinfo.h>
|
|
|
|
struct siginfo;
|
|
|
|
extern int uml_exitcode;
|
|
|
|
extern int ncpus;
|
|
extern int kmalloc_ok;
|
|
|
|
#define UML_ROUND_UP(addr) \
|
|
((((unsigned long) addr) + PAGE_SIZE - 1) & PAGE_MASK)
|
|
|
|
extern unsigned long alloc_stack(int order, int atomic);
|
|
extern void free_stack(unsigned long stack, int order);
|
|
|
|
struct pt_regs;
|
|
extern void do_signal(struct pt_regs *regs);
|
|
extern void interrupt_end(void);
|
|
extern void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs);
|
|
|
|
extern unsigned long segv(struct faultinfo fi, unsigned long ip,
|
|
int is_user, struct uml_pt_regs *regs);
|
|
extern int handle_page_fault(unsigned long address, unsigned long ip,
|
|
int is_write, int is_user, int *code_out);
|
|
|
|
extern unsigned int do_IRQ(int irq, struct uml_pt_regs *regs);
|
|
extern int smp_sigio_handler(void);
|
|
extern void initial_thread_cb(void (*proc)(void *), void *arg);
|
|
extern int is_syscall(unsigned long addr);
|
|
|
|
extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
|
|
|
extern void uml_pm_wake(void);
|
|
|
|
extern int start_uml(void);
|
|
extern void paging_init(void);
|
|
|
|
extern void uml_cleanup(void);
|
|
extern void do_uml_exitcalls(void);
|
|
|
|
/*
|
|
* Are we disallowed to sleep? Used to choose between GFP_KERNEL and
|
|
* GFP_ATOMIC.
|
|
*/
|
|
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);
|
|
extern void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs);
|
|
extern void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
|
extern void fatal_sigsegv(void) __attribute__ ((noreturn));
|
|
|
|
|
|
#endif
|