You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.0 KiB

/*
* Copyright 2002-2019 Intel Corporation.
*
* This software is provided to you as Sample Source Code as defined in the accompanying
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
* section 1.L.
*
* This software and the related documents are provided as is, with no express or implied
* warranties, other than those that are expressly stated in the License.
*/
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
intptr_t target_space;
intptr_t swizzle_space;
intptr_t page_mask;
int Swizzled(void *ptr)
{
return ((intptr_t)ptr & page_mask) == swizzle_space;
}
void MyFree(void * p)
{
if (Swizzled(p)) {
fprintf (stderr, "Error MyFree got swizzled %p\n", p);
fflush (stderr);
}
}
void * MyAlloc(void *ptr)
{
return ptr; // returned value will be swizzled
}
void * mmemcpy(void * to, const void * from, size_t n, void ** toout, void **fromout)
{
void * d0, *d1, *d2;
__asm__ __volatile__(
"cld; rep ; movsl; testb $2,%b4; je 1f; movsw;"
"1:testb $1,%b4;je 2f;"
"movsb;"
"2:"
: "=&c" (d0), "=&D" (d1), "=&S" (d2):"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) : "memory");
*toout = d1;
*fromout = d2;
return (to);
}
void memindex(void * ad)
{
void * ptr = 0;
__asm__ __volatile__("movl $0,(%0,%1,1)" :: "r"(ptr),"r"(ad));
}
int n = 8;
int main()
{
char buffer2[20];
char buffer3[20];
void * al;
void *toout,*fromout;
int page_size = getpagesize();
page_mask = ~((intptr_t)page_size-1);
// Get some page aligned memory
void * x = malloc(page_size * 2);
target_space = ((intptr_t)x + page_size - 1) & page_mask;
void * mm = (void*)target_space;
al = MyAlloc(mm); // cause the swizzle
swizzle_space = (intptr_t)al & page_mask;
if (swizzle_space == target_space)
{
fprintf (stderr,"Error al not swizzled\n");
}
((char*)al)[0] = 1;
buffer2[0] = 2;
buffer3[0] = 3;
mmemcpy(buffer2, al, n, &toout, &fromout);
fprintf(stderr, "al[0] %d buffer2[0] %d toout - to %lx fromout - from %lx\n",
((char*)al)[0], buffer2[0],
(unsigned long)toout - (unsigned long)buffer2, (unsigned long)fromout- (unsigned long)al);
if (!Swizzled (al)) {
fprintf (stderr,"Error1 al not swizzled\n");
}
if (!Swizzled (fromout)) {
fprintf (stderr,"Error2 fromout not swizzled\n");
}
mmemcpy(al, buffer3, n, &toout, &fromout);
if (!Swizzled (al)) {
fprintf (stderr,"Error3 al not swizzled\n");
fflush (stderr);
}
if (!Swizzled (toout)) {
fprintf (stderr,"Error4 toout not swizzled\n");
fflush (stderr);
}
fprintf(stderr, "al[0] %d buffer3[0] %d toout - to %lx fromout - from %lx\n",((char*)al)[0],
buffer3[0], (unsigned long)toout-(unsigned long)al, (unsigned long)fromout - (unsigned long)buffer3);
fflush (stderr);
memindex(al);
MyFree(al);
return 0;
}