On 03.04.2009 11:51, Stefan Reinauer wrote:
> On 03.04.2009 4:16 Uhr, Carl-Daniel Hailfinger wrote:
>   
>> And to be honest, I want to test how well Urbez' gcc+xmmstack solution
>> works out for the hard targets.
>>   
>>     
>
> Any idea where to get that one? All I could ever find was a single web
> page talking about it.
>   

Urbez mailed it to me a few weeks ago with the following explanation:
> Remember that in some CPU's you must activate in CR4 the 9 bit, for work
> correctly.
>
>         movl    0x200,%eax #CR4 bit 9 for SSE
>         movl    %eax,%cr4
>
>
> The application is too primitive, but works fine.
> It uses pcre, for easy parse the *.s generated with gcc, in the Code
> of xmmstack.c say's the options that i use for generate the *.s assembly
> code:
>
> gcc -fomit-frame-pointer -fno-stack-protector *.c
>
> if you will you can delete the code for mmx registers, but can be util
> for another person.
>   

It's attached to this mail.

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/

/*
    XMM-STACK: convert the stack to a XMM registers for gcc x86 assembler codes
    Copyright (C) 2008  Urbez Santana i Roma

    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 3 of the License, or
    (at your option) any later version.

    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.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <pcre.h>


int mode_xmm=0;


int regexp(const char *pattern,char *search,int len,char **found)
{
    pcre *r;
    const char *err;
    int errpos;
    int ret;
    int fnd[64];
    int i;
    for (i=0;found[i];i++) free(found[i]);found[0]=0;
    r=pcre_compile(pattern,PCRE_MULTILINE,&err,&errpos,NULL);//Default char table, (utf8 millor?)
    if (!r) {fprintf(stderr,"%s,%d\n",err,errpos);return 0;}
    ret=pcre_exec(r,NULL,search,len,0,0, fnd, 64);
    if (ret<=0) return 0;
    for (i=0;i<ret;i++) found[i]=strndup(search+fnd[i*2],fnd[i*2+1]-fnd[i*2]);
    found[ret]=0;
    return fnd[1];//el que ha llegit
}

char buf[4097];
int  num;

void chomp(char *str)
{
    char *rd,*wr;
    rd=wr=str;
    while(*rd && *rd>=0 && *rd<=32) rd++;
    while(*rd) *wr++=*rd++;
    while(wr>str && wr[-1]>=0 && wr[-1]<=32) wr--;
    *wr=0;
}

int instrlen(const char *inst,int wr)
{
    int len=strlen(inst);
    if (!wr && !strcmp(inst,"movzbl")) return 1;
    if (!wr && !strcmp(inst,"movzwl")) return 2;
    if (!wr && !strcmp(inst,"movsbl")) return 1;
    if (!wr && !strcmp(inst,"movswl")) return 2;
    if (len<=0) return 1;
    if (inst[len-1]=='l') return 4;
    if (inst[len-1]=='w') return 2;
    return 1;
}

#define MSG_INSTR "^\\([^\\[]*\\[0x([0-9a-f]*)\\] .*\\): (\\w+)\\s+(;|([^,]+);|(.*),(.*);).*$"
#define MSG_PARAM "^0x([0-9a-f]+)\\s+\\d+\\s*$"


char *find[64];
int len;

int main(int argc,char **argv)
{
    int i,j;
    FILE *f,*w;
    char *FileName;
    int param;
    int inapp;

    if (argc<2) 
    {
      printf("Usage: \n\txmmstack [-xmm] [-mmx] file.s\nThis program is for use with:\n"
             "\tgcc -fomit-frame-pointer -fno-stack-protector *.c\n"
             "\tyou can use -O3 and any other gcc option or g++ only\n"
             "\tif not changes the use of the stack\n");
      return 0;
    }
    FileName=argv[1];
    mode_xmm=0;
    inapp=0;
    for (param=1;param<argc;param++)
    {
        if (!strcasecmp(argv[param],"-xmm"))
        {
            mode_xmm=1;
            continue;
        }
        if (!strcasecmp(argv[param],"-mmx"))
        {
            mode_xmm=0;
            continue;
        }
        if (*argv[param]=='-')
        {
            printf("Incorrect option: %s\n",argv[param]);
            return 0;
        }
        FileName=argv[param];
    }


    f=fopen(FileName,"rb");
    if (!f) {printf("File %s, not found\n",FileName);return 0;}
    sprintf(buf,"%sn.s",FileName);
    w=fopen(buf,"wb+");
    if (!w) {printf("Cannot create %s\n",buf);return 0;}

    fprintf(w,".text\n"
	          ".p2align 4,,15\n\n\n");

//DR0, save eax
//DR1, save edx
//DR2, stack pointer of xmm in byte dr2[0] , final stack offset of xmm in byte dr2[1]
//DR3, save esp
//EAX, calc and, set register
//EDX, offset for jumps
//ESP, return address
//use of leal for multiply and add, for not affect the flags.
//movzbl also not affect flags
//bswap and xchg also not affect flags.
//dr2 must be initially 0x7f

    //16 bytes table xmm/12 mmx, pextrw and pinsrw consumes 5 bytes, and jmp *esp consumes 2, nop consumes 1 byte, movb consumes 2 bytes
    //Align of each,must 16 bytes, for use 1,2,4,8 escalar multiple.
    fprintf(w,"setxmm:\n");
    if (mode_xmm)
        fprintf(w,"setxmmover:\n"
                  "jmp setxmmover\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
    else
        fprintf(w,"setxmmover:\n"
                  "jmp setxmmover\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
    for (i=1;i<127;i++)
    {
        if (mode_xmm)
        {
            fprintf(w,"pextrw $%d,%%xmm%d,%%edx\n"
                      "%s\n"
                      "pinsrw $%d,%%edx,%%xmm%d\n"
                      "jmp *%%esp\n"
                      "nop\n"
                      "nop\n"
                     ,(i/2)&7,i/16,(i&1)?"movb %al,%dh":"movb %al,%dl",(i/2)&7,i/16);
        }
        else
        {
            fprintf(w,"pextrw $%d,%%mm%d,%%edx\n"
                      "%s\n"
                      "pinsrw $%d,%%edx,%%mm%d\n"
                      "jmp *%%esp\n"
                     ,(i/2)&3,(i/8)&7,(i&1)?"movb %al,%dh":"movb %al,%dl",(i/2)&3,(i/8)&7);
        }
    }
    if (mode_xmm)
        fprintf(w,"setxmmunder:\n"
                  "jmp setxmmunder\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
    else
        fprintf(w,"setxmmunder:\n"
                  "jmp setxmmunder\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
    //10 bytes table xmm/8 mmx, pextrw and pinsrw consumes 5 bytes, and jmp *esp consumes 2, nop consumes 1 byte, movb consumes 2 bytes
    fprintf(w,"getxmm:\n");
    if (mode_xmm)
        fprintf(w,"getxmmover:\n"
                  "jmp getxmmover\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n");
    else
        fprintf(w,"getxmmover:\n"
                  "jmp getxmmover\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
    for (i=1;i<127;i++)
    {
        if (mode_xmm)
        {
            fprintf(w,"pextrw $%d,%%xmm%d,%%edx\n"
                      "%s\n"
                      "jmp *%%esp\n"
                      "nop\n"
                     ,(i/2)&7,i/16,(i&1)?"movb %dh,%al":"movb %dl,%al");
        }
        else
        {
            fprintf(w,"pextrw $%d,%%mm%d,%%edx\n"
                      "%s\n"
                      "jmp *%%esp\n"
                     ,(i/2)&3,(i/8)&7,(i&1)?"movb %dh,%al":"movb %dl,%al");
        }
    }
    if (mode_xmm)
        fprintf(w,"getxmmunder:\n"
                  "jmp getxmmunder\n"
                  ".long 0x90909090\n"
                  ".long 0x90909090\n");
    else
        fprintf(w,"getxmmunder:\n"
                  "jmp getxmmunder\n"
                  ".long 0x90909090\n"
                  ".word 0x9090\n");
//setxmmb: al=byte to set, byte dr2[1]=offset of xmm stack
    if (mode_xmm)
        fprintf(w,
"\
setxmmb:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmmb:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
setxmmw:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmmw:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
setxmml:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    bswapl %%eax\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 3(%%edx),%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 2(%%edx),%%edx\n\
    leal (,%%edx,4),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmml:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 2(%%edx),%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 3(%%edx),%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    bswapl %%eax\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,4),%%edx\n\
    leal getxmm(,%%edx,2),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n"
        );
    else
        fprintf(w,
"\
setxmmb:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmmb:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
setxmmw:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmmw:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
setxmml:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    bswapl %%eax\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 3(%%edx),%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%ah,%%al\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 2(%%edx),%%edx\n\
    leal (%%edx,%%edx,2),%%edx\n\
    leal setxmm(,%%edx,4),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n\
getxmml:\n\
    movl %%edx,%%dr1\n\
    movl %%esp,%%dr3\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 2(%%edx),%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 3(%%edx),%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    bswapl %%eax\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal 1(%%edx),%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movb %%al,%%ah\n\
    movl %%dr2,%%edx\n\
    movzbl %%dh,%%edx\n\
    leal getxmm(,%%edx,8),%%edx\n\
    movl $.+7,%%esp\n\
    jmp *%%edx\n\
    movl %%dr1,%%edx\n\
    movl %%dr3,%%esp\n\
    jmp *%%esp\n"
    );

    while(!feof(f))
    {   
        *buf=0;
        fgets(buf,sizeof(buf)-1,f);
        chomp(buf);len=strlen(buf);
#if 1
        if (!strncmp(buf,"#APP",4))
        {
            inapp=1;//Skip application asm("") the application is responsable for not use esp or xmm, except for given the control.
        }
        if (!strncmp(buf,"#NO_APP",7))
        {
            inapp=0;
        }
        if (inapp)
        {
            fprintf(w,"%s\n",buf);
            continue;
        }
#endif
        if (regexp("^(\\w+)\\s+(.*)\\s*,\\s*(\\d*)\\(\\%esp\\)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"leal %d(%%eax),%%eax #NOSTACK\n",256*atoi(find[3]));
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            switch(instrlen(find[1],0))
            {
                case 1:fprintf(w,"jmp getxmmb\n");break;
                case 2:fprintf(w,"jmp getxmmw\n");break;
                case 4:fprintf(w,"jmp getxmml\n");break;
            }
            if (!strcmp(find[2],"%eax")||!strcmp(find[2],"%ax")||!strcmp(find[2],"%al")) 
            {
                fprintf(w,"movl %%edx,%%esp #NOSTACK\n");
                fprintf(w,"movl %%dr0,%%edx #NOSTACK\n");
                switch(instrlen(find[1],1))
                {
                    case 1:fprintf(w,"%s %%dl,%%al\n",find[1],find[2]);break;
                    case 2:fprintf(w,"%s %%dx,%%ax\n",find[1],find[2]);break;
                    case 4:fprintf(w,"%s %%edx,%%eax\n",find[1],find[2]);break;
                }
                fprintf(w,"movl %%esp,%%edx #NOSTACK\n");
            }
            else
            {
                switch(instrlen(find[1],1))
                {
                    case 1:fprintf(w,"%s %s,%%al\n",find[1],find[2]);break;
                    case 2:fprintf(w,"%s %s,%%ax\n",find[1],find[2]);break;
                    case 4:fprintf(w,"%s %s,%%eax\n",find[1],find[2]);break;
                }
            }
            fprintf(w,"movl $.+10,%%esp\n");
            switch(instrlen(find[1],1))
            {
                case 1:fprintf(w,"jmp setxmmb\n");break;
                case 2:fprintf(w,"jmp setxmmw\n");break;
                case 4:fprintf(w,"jmp setxmml\n");break;
            }
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            continue;
        }
        if (regexp("^(\\w+)\\s+(\\d*)\\(\\%esp\\)\\s*,\\s*(.*)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"leal %d(%%eax),%%eax #NOSTACK\n",256*atoi(find[2]));
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            switch(instrlen(find[1],0))
            {
                case 1:fprintf(w,"jmp getxmmb\n");break;
                case 2:fprintf(w,"jmp getxmmw\n");break;
                case 4:fprintf(w,"jmp getxmml\n");break;
            }
            switch(instrlen(find[1],0))
            {
                case 1:fprintf(w,"%s %%al,%s\n",find[1],find[3]);break;
                case 2:fprintf(w,"%s %%ax,%s\n",find[1],find[3]);break;
                case 4:fprintf(w,"%s %%eax,%s\n",find[1],find[3]);break;
            }
            if (strcmp(find[3],"%eax")&&strcmp(find[3],"%ax")&&strcmp(find[3],"%al")) 
                //Nota, només pot ser un registre, (tot ha de ser const, ni malloc's ni res)
                fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            continue;
        }
        if (regexp("^(\\w+)\\s+(\\d*)\\(\\%esp\\)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"leal %d(%%eax),%%eax #NOSTACK\n",256*atoi(find[2]));
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            switch(instrlen(find[1],0))
            {
                case 1:fprintf(w,"jmp getxmmb\n");break;
                case 2:fprintf(w,"jmp getxmmw\n");break;
                case 4:fprintf(w,"jmp getxmml\n");break;
            }
            switch(instrlen(find[1],1))
            {
                case 1:fprintf(w,"%s %%al\n",find[1]);break;
                case 2:fprintf(w,"%s %%ax\n",find[1]);break;
                case 4:fprintf(w,"%s %%eax\n",find[1]);break;
            }
            fprintf(w,"movl $.+10,%%esp\n");
            switch(instrlen(find[1],1))
            {
                case 1:fprintf(w,"jmp setxmmb\n");break;
                case 2:fprintf(w,"jmp setxmmw\n");break;
                case 4:fprintf(w,"jmp setxmml\n");break;
            }
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            continue;
        }
        if (regexp("\\%esp",buf,len,find))
        {
            fprintf(w,"movl %%dr2,%%esp #NOSTACK\n");
            fprintf(w,"%s\n",buf);
            fprintf(w,"movl %%esp,%%dr2 #NOSTACK\n");
            continue;
        }
        if (regexp("^pushl\\s+(.*)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"leal -4(%%eax),%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl %s,%%eax\n",find[1]);
            fprintf(w,"movl $.+10,%%esp\n");
            fprintf(w,"jmp setxmml\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            continue;
        }
        if (regexp("^popl\\s+(.*)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"leal 4(%%eax),%%eax #NOSTACK\n");
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            fprintf(w,"jmp getxmml\n");
            fprintf(w,"movl %%eax,%s\n",find[1]);
            if (strcmp(find[1],"%eax"))
                fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            continue;
        }
        if (regexp("^call\\s+(.*)$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"leal -4(%%eax),%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl $.+23,%%eax #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            fprintf(w,"jmp setxmml\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            fprintf(w,".byte 0xe9\n.long %s-4-. #NOSTACK\n",find[1]);//jmp, not works with .global??? gcc???            
            continue;
        }
        if (regexp("^(rep\\s*;\\s*|)ret$",buf,len,find))
        {
            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
            fprintf(w,"leal 4(%%eax),%%eax #NOSTACK\n");
            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
            fprintf(w,"movl $.+10,%%esp\n");
            fprintf(w,"jmp getxmml\n");
            fprintf(w,"movl %%eax,%%esp\n");
            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
            fprintf(w,"jmp *%%esp #NOSTACK\n");
            
            continue;
        }
        fprintf(w,"%s\n",buf);
    }
    fclose(f);
    fclose(w);
}

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to