#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>


#define MAP_SIZE 67108864UL
#define MAP_MASK (MAP_SIZE - 1)

#define FUNC_SET 0
#define FUNC_CHK 1

int main(int argc, char *argv[]){
	off_t mfpTarget = 0xC0000000;
	void *mfp_map_base, *mfp_virt_base;
	int fd,func;
	unsigned long *ptr;
	int i;
	
	if(argc < 1){ printf("Usage: %s set/chk\n",argv[0]); return 0; }

	if(!strcmp(argv[1],"set"))func = FUNC_SET;
	else func = FUNC_CHK;

	fd = open("/dev/mem", O_RDWR | O_SYNC);
	if(!fd){ printf("/dev/mem open failed.\n"); return 0; }

	mfp_map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mfpTarget & ~MAP_MASK);
	if(mfp_map_base == (void *) -1){
		printf("mmap fail\n");
		return 0;
	}
		
	printf("Memory mapped at address %p.\n", mfp_map_base); 
	
	mfp_virt_base = mfp_map_base + (mfpTarget & MAP_MASK);

	printf("Init, virtual base at %p (phys=0x%X)\n", mfp_virt_base, mfpTarget); 

	ptr = mfp_virt_base;

	if(func == FUNC_SET)
		for(i=0;i<0x01000000;i++)
			*ptr++ = i;
	else{ // FUNC_CHK
		for(i=0;i<0x01000000;i++)
			if(*ptr++ != i){
				printf("check failed at %08x\n",i*4);
				return -1;
			}

		
		printf("mem check OK\n");
		return 0;
	}
	
		
	munmap(mfp_map_base, MAP_SIZE);	

}
