/*
 * Copyright (C) 2015 Imagination Technologies
 * Author: Alex Smith <alex.smith@imgtec.com>
 *
 * 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;  either version 2 of the  License, or (at your
 * option) any later version.
 */

#include "vdso.h"

#include <asm/isa-rev.h>

#include <linux/elfnote.h>
#include <linux/version.h>

ELFNOTE_START(Linux, 0, "a")
	.long LINUX_VERSION_CODE
ELFNOTE_END

/*
 * The .MIPS.abiflags section must be defined with the FP ABI flags set
 * to 'any' to be able to link with both old and new libraries.
 * Newer toolchains are capable of automatically generating this, but we want
 * to work with older toolchains as well. Therefore, we define the contents of
 * this section here (under different names), and then genvdso will patch
 * it to have the correct name and type.
 *
 * We base the .MIPS.abiflags section on preprocessor definitions rather than
 * CONFIG_* because we need to match the particular ABI we are building the
 * VDSO for.
 *
 * See https://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking
 * for the .MIPS.abiflags section description.
 */

	.section .mips_abiflags, "a"
	.align 3
__mips_abiflags:
	.hword	0		/* version */
	.byte	__mips		/* isa_level */

	/* isa_rev */
	.byte	MIPS_ISA_REV

	/* gpr_size */
#ifdef __mips64
	.byte	2		/* AFL_REG_64 */
#else
	.byte	1		/* AFL_REG_32 */
#endif

	/* cpr1_size */
#if (MIPS_ISA_REV >= 6) || defined(__mips64)
	.byte	2		/* AFL_REG_64 */
#else
	.byte	1		/* AFL_REG_32 */
#endif

	.byte	0		/* cpr2_size (AFL_REG_NONE) */
	.byte	0		/* fp_abi (Val_GNU_MIPS_ABI_FP_ANY) */
	.word	0		/* isa_ext */
	.word	0		/* ases */
	.word	0		/* flags1 */
	.word	0		/* flags2 */
