2011-09-23 12:00:45 +04:00
|
|
|
#ifndef CRTOOLS_H_
|
|
|
|
#define CRTOOLS_H_
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#include "types.h"
|
|
|
|
#include "list.h"
|
|
|
|
|
|
|
|
#include "image.h"
|
|
|
|
|
|
|
|
extern struct page_entry zero_page_entry;
|
|
|
|
|
2011-10-03 11:52:13 +04:00
|
|
|
#define CR_FD_PERM (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
|
|
|
|
#define CR_FD_PERM_DUMP (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
|
2011-09-23 12:00:45 +04:00
|
|
|
|
|
|
|
enum {
|
|
|
|
CR_FD_FDINFO,
|
|
|
|
CR_FD_PAGES,
|
|
|
|
CR_FD_PAGES_SHMEM,
|
|
|
|
CR_FD_CORE,
|
|
|
|
CR_FD_PIPES,
|
|
|
|
CR_FD_PSTREE,
|
|
|
|
CR_FD_SHMEM,
|
|
|
|
|
|
|
|
CR_FD_MAX
|
|
|
|
};
|
|
|
|
|
2011-10-04 01:50:19 +04:00
|
|
|
enum cr_task_final_state {
|
|
|
|
CR_TASK_LEAVE_STOPPED, /* leave tasks stopped after dump/restore */
|
|
|
|
CR_TASK_LEAVE_RUNNING, /* leave tasks running after dump/restore */
|
|
|
|
CR_TASK_KILL, /* kill tasks after dump */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cr_options {
|
|
|
|
bool leader_only;
|
|
|
|
enum cr_task_final_state final_state;
|
|
|
|
};
|
|
|
|
|
2011-09-23 12:00:45 +04:00
|
|
|
/* file descriptors template */
|
|
|
|
struct cr_fd_desc_tmpl {
|
|
|
|
const char *fmt; /* format for the name */
|
|
|
|
u32 magic; /* magic in the header */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* file descriptors */
|
|
|
|
struct cr_fd_desc {
|
|
|
|
struct cr_fd_desc_tmpl *tmpl; /* template we refer to */
|
|
|
|
char name[64]; /* the name, based on pid */
|
|
|
|
int fd; /* descriptor for open/close */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cr_fdset {
|
|
|
|
struct cr_fd_desc desc[CR_FD_MAX];
|
|
|
|
u32 use_mask; /*
|
|
|
|
* if descriptor get used,set
|
|
|
|
* bit here
|
|
|
|
*/
|
|
|
|
};
|
|
|
|
|
|
|
|
#define CR_FD_DESC_USE(type) ((1 << (type)))
|
|
|
|
#define CR_FD_DESC_ALL ((1 << CR_FD_MAX) - 1)
|
|
|
|
#define CR_FD_DESC_NOPSTREE (CR_FD_DESC_ALL & ~(CR_FD_DESC_USE(CR_FD_PSTREE)))
|
|
|
|
#define CR_FD_DESC_NONE (0)
|
|
|
|
|
2011-10-04 01:50:19 +04:00
|
|
|
int cr_dump_tasks(pid_t pid, struct cr_options *opts);
|
|
|
|
int cr_restore_tasks(pid_t pid, struct cr_options *opts);
|
|
|
|
int cr_show(unsigned long pid, struct cr_options *opts);
|
|
|
|
int convert_to_elf(char *elf_path, int fd_core);
|
2011-09-23 12:00:45 +04:00
|
|
|
|
|
|
|
struct cr_fdset *alloc_cr_fdset(pid_t pid);
|
|
|
|
int prep_cr_fdset_for_dump(struct cr_fdset *cr_fdset,
|
|
|
|
unsigned long use_mask);
|
|
|
|
int prep_cr_fdset_for_restore(struct cr_fdset *cr_fdset,
|
|
|
|
unsigned long use_mask);
|
|
|
|
void close_cr_fdset(struct cr_fdset *cr_fdset);
|
|
|
|
void free_cr_fdset(struct cr_fdset **cr_fdset);
|
|
|
|
|
|
|
|
struct vma_area {
|
|
|
|
struct list_head list;
|
|
|
|
struct vma_entry vma;
|
|
|
|
unsigned long shmid;
|
|
|
|
int vm_file_fd;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define vma_area_has(vma_area, s) vma_entry_has(&vma_area->vma, s)
|
|
|
|
#define vma_entry_len(vma) ((vma)->end - (vma)->start)
|
|
|
|
|
|
|
|
struct pstree_item {
|
|
|
|
struct list_head list;
|
|
|
|
pid_t pid; /* leader pid */
|
|
|
|
u32 nr_children; /* number of children */
|
2011-10-20 11:03:19 +04:00
|
|
|
u32 nr_threads; /* number of threads */
|
|
|
|
u32 *threads; /* array of threads */
|
2011-09-23 12:00:45 +04:00
|
|
|
u32 *children; /* array of children */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct pstree_item_info {
|
|
|
|
struct list_head list;
|
|
|
|
|
|
|
|
pid_t pid; /* leader pid */
|
|
|
|
u32 nr_children; /* number of children */
|
|
|
|
u32 *children; /* array of children */
|
|
|
|
|
|
|
|
bool launched; /* set if launched */
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline unsigned long vma_area_size(struct vma_area *vma)
|
|
|
|
{
|
|
|
|
return vma->vma.end - vma->vma.start;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int in_vma_area(struct vma_area *vma, unsigned long addr)
|
|
|
|
{
|
|
|
|
return addr >= (unsigned long)vma->vma.start &&
|
|
|
|
addr < (unsigned long)vma->vma.end;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CRTOOLS_H_ */
|