/*
 * Copyright 2010 Tilera Corporation. All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation, version 2.
 *
 *   This program is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 *   NON INFRINGEMENT.  See the GNU General Public License for
 *   more details.
 *
 * Generates definitions from c-type structures used by assembly sources.
 */

/* Check for compatible compiler early in the build. */
#ifdef CONFIG_TILEGX
# ifndef __tilegx__
#  error Can only build TILE-Gx configurations with tilegx compiler
# endif
# ifndef __LP64__
#  error Must not specify -m32 when building the TILE-Gx kernel
# endif
#else
# ifdef __tilegx__
#  error Can not build TILEPro configurations with tilegx compiler
# endif
#endif

#include <linux/kbuild.h>
#include <linux/thread_info.h>
#include <linux/sched.h>
#include <linux/hardirq.h>
#include <linux/ptrace.h>
#include <hv/hypervisor.h>

void foo(void)
{
	DEFINE(SINGLESTEP_STATE_BUFFER_OFFSET,
	       offsetof(struct single_step_state, buffer));
	DEFINE(SINGLESTEP_STATE_FLAGS_OFFSET,
	       offsetof(struct single_step_state, flags));
	DEFINE(SINGLESTEP_STATE_ORIG_PC_OFFSET,
	       offsetof(struct single_step_state, orig_pc));
	DEFINE(SINGLESTEP_STATE_NEXT_PC_OFFSET,
	       offsetof(struct single_step_state, next_pc));
	DEFINE(SINGLESTEP_STATE_BRANCH_NEXT_PC_OFFSET,
	       offsetof(struct single_step_state, branch_next_pc));
	DEFINE(SINGLESTEP_STATE_UPDATE_VALUE_OFFSET,
	       offsetof(struct single_step_state, update_value));

	DEFINE(THREAD_INFO_TASK_OFFSET,
	       offsetof(struct thread_info, task));
	DEFINE(THREAD_INFO_FLAGS_OFFSET,
	       offsetof(struct thread_info, flags));
	DEFINE(THREAD_INFO_STATUS_OFFSET,
	       offsetof(struct thread_info, status));
	DEFINE(THREAD_INFO_HOMECACHE_CPU_OFFSET,
	       offsetof(struct thread_info, homecache_cpu));
	DEFINE(THREAD_INFO_PREEMPT_COUNT_OFFSET,
	       offsetof(struct thread_info, preempt_count));
	DEFINE(THREAD_INFO_STEP_STATE_OFFSET,
	       offsetof(struct thread_info, step_state));
#ifdef __tilegx__
	DEFINE(THREAD_INFO_UNALIGN_JIT_BASE_OFFSET,
	       offsetof(struct thread_info, unalign_jit_base));
	DEFINE(THREAD_INFO_UNALIGN_JIT_TMP_OFFSET,
	       offsetof(struct thread_info, unalign_jit_tmp));
#endif

	DEFINE(TASK_STRUCT_THREAD_KSP_OFFSET,
	       offsetof(struct task_struct, thread.ksp));
	DEFINE(TASK_STRUCT_THREAD_PC_OFFSET,
	       offsetof(struct task_struct, thread.pc));

	DEFINE(HV_TOPOLOGY_WIDTH_OFFSET,
	       offsetof(HV_Topology, width));
	DEFINE(HV_TOPOLOGY_HEIGHT_OFFSET,
	       offsetof(HV_Topology, height));

	DEFINE(IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET,
	       offsetof(irq_cpustat_t, irq_syscall_count));
}
