#include <unistd.h>

#include "restorer.h"
#include "asm/restorer.h"
#include <compel/asm/fpu.h>

#include <compel/plugins/std/syscall.h>
#include "log.h"

int restore_nonsigframe_gpregs(UserPpc64RegsEntry *r)
{
#define SPRN_TFHAR	128
#define SPRN_TFIAR	129
#define SPRN_TEXASR	130

	if (r->has_tfhar) {
		asm __volatile__ (
			"ld	3, %[value]	;"
			"mtspr	%[sprn],3	;"
			: [value]"=m"(r->tfhar)
			: [sprn]"i"(SPRN_TFHAR)
			: "r3");
	}

	if (r->has_tfiar) {
		asm __volatile__ (
			"ld	3, %[value]	;"
			"mtspr	%[sprn],3	;"
			: [value]"=m"(r->tfiar)
			: [sprn]"i"(SPRN_TFIAR)
			: "r3");
	}

	if (r->has_texasr) {
		asm __volatile__ (
			"ld	3, %[value]	;"
			"mtspr	%[sprn],3	;"
			: [value]"=m"(r->texasr)
			: [sprn]"i"(SPRN_TEXASR)
			: "r3");
	}

	return 0;
}

unsigned long sys_shmat(int shmid, const void *shmaddr, int shmflg)
{
	unsigned long raddr;
	int ret;

	ret = sys_ipc(21 /*SHMAT */,
		      shmid,		 	/* first 		*/
		      shmflg,		 	/* second 		*/
		      (unsigned long)&raddr,	/* third 		*/
		      shmaddr,			/* ptr			*/
		      0 			/* fifth not used 	*/);

	if (ret)
		raddr = (unsigned long) ret;

	return raddr;
}
