/*
 * Copyright (c) 2005
 * The Regents of The University of Michigan
 * All Rights Reserved
 *
 * This code is part of the M5 simulator, developed by Nathan Binkert,
 * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions
 * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi,
 * and Andrew Schultz.
 *
 * Permission is granted to use, copy, create derivative works and
 * redistribute this software and such derivative works for any
 * purpose, so long as the copyright notice above, this grant of
 * permission, and the disclaimer below appear in all copies made; and
 * so long as the name of The University of Michigan is not used in
 * any advertising or publicity pertaining to the use or distribution
 * of this software without specific, written prior authorization.
 *
 * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
 * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND
 * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE
 * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT,
 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
 * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGES.
 */

#include <stddef.h>
#include <asm/page.h>
#include <linux/dcache.h>
#include <linux/fs.h>
#include <linux/path.h>
#include <linux/sched.h>
#include <linux/mm_types.h>

/*
 * Structure size information
 */
const int thread_info_size = sizeof(struct thread_info);
#ifndef CONFIG_THREAD_INFO_IN_TASK
const int thread_info_task = offsetof(struct thread_info, task);
#endif

const int task_struct_size = sizeof(struct task_struct);
const int task_struct_pid = offsetof(struct task_struct, pid);
const int task_struct_start_time = offsetof(struct task_struct, start_time);
const int task_struct_tgid = offsetof(struct task_struct, tgid);
const int task_struct_comm = offsetof(struct task_struct, comm);
const int task_struct_comm_size = TASK_COMM_LEN;
const int task_struct_mm = offsetof(struct task_struct, mm);

/*
 * Virtual Memory structures
 */
const int mm_struct_size = sizeof(struct mm_struct);
// mm_struct ptr
const int mm_struct_mmap = offsetof(struct mm_struct, mmap);
const int vm_area_struct_size = sizeof(struct vm_area_struct);
const int vm_area_struct_vm_start = offsetof(struct vm_area_struct, vm_start);
const int vm_area_struct_vm_end = offsetof(struct vm_area_struct, vm_end);
const int vm_area_struct_vm_flags = offsetof(struct vm_area_struct, vm_flags);
const int vm_area_struct_vm_pgoff = offsetof(struct vm_area_struct, vm_pgoff);
const int vm_page_size = PAGE_SIZE;
// vm_area_struct ptr
const int vm_area_struct_vm_next = offsetof(struct vm_area_struct, vm_next);
// file ptr
const int vm_area_struct_vm_file = offsetof(struct vm_area_struct, vm_file);

/*
 * File structures
 */ 
const int file_struct_size = sizeof(struct file);
// path ptr
const int file_struct_f_path = offsetof(struct file, f_path);

const int path_struct_size = sizeof(struct path);
// dentry ptr
const int path_struct_dentry = offsetof(struct path, dentry);

const int dentry_struct_size = sizeof(struct dentry);
// dentry ptr
const int dentry_struct_d_parent = offsetof(struct dentry, d_parent);
const int dentry_struct_d_name = offsetof(struct dentry, d_name);

const int qstr_struct_size = sizeof(struct qstr);
// char*
const int qstr_struct_name = offsetof(struct qstr, name);
const int qstr_struct_len = offsetof(struct qstr, len);
