svn commit: r190445 - in head/sys: amd64/linux32 compat/linprocfs compat/linux conf dev/ipmi modules/ipmi modules/linprocfs

Doug Ambrisko ambrisko at ambrisko.com
Thu Mar 26 14:29:46 PDT 2009


Roman Divacky writes:
| On Thu, Mar 26, 2009 at 05:14:23PM +0000, Doug Ambrisko wrote:
| > Author: ambrisko
| > Date: Thu Mar 26 17:14:22 2009
| > New Revision: 190445
| > URL: http://svn.freebsd.org/changeset/base/190445
| > 
| > Log:
| >   Add stuff to support upcoming BMC/IPMI flashing of newer Dell machine
| >   via the Linux tool.
| >        -  Add Linux shim to ipmi(4)
| >        -  Create a partitions file to linprocfs to make Linux fdisk see
| >           disks.  This file is dynamic so we can see disks come and go.
| >        -  Convert msdosfs to vfat in mtab since Linux uses that for
| >           msdosfs.
| >        -  In the Linux mount path convert vfat passed in to msdosfs
| >           so Linux mount works on FreeBSD.  Note that tasting works
| >           so that if da0 is a msdos file system
| >                   /compat/linux/bin/mount /dev/da0 /mnt
| >           works.
| >        -  fix a 64it bug for l_off_t.
| >   Grabing sh, mount, fdisk, df from Linux, creating a symlink of mtab to
| >   /compat/linux/etc/mtab and then some careful unpacking of the Linux bmc
| >   update tool and hacking makes it work on newer Dell boxes.  Note, probably
| >   if you can't figure out how to do this, then you probably shouldn't be
| >   doing it :-)
| > 
| > Added:
| >   head/sys/dev/ipmi/ipmi_linux.c   (contents, props changed)
| > Modified:
| >   head/sys/amd64/linux32/linux.h
| >   head/sys/compat/linprocfs/linprocfs.c
| >   head/sys/compat/linux/linux_file.c
| >   head/sys/conf/files.amd64
| >   head/sys/conf/files.i386
| >   head/sys/modules/ipmi/Makefile
| >   head/sys/modules/linprocfs/Makefile
| > 
| > Modified: head/sys/amd64/linux32/linux.h
| > ==============================================================================
| > --- head/sys/amd64/linux32/linux.h	Thu Mar 26 17:04:08 2009	(r190444)
| > +++ head/sys/amd64/linux32/linux.h	Thu Mar 26 17:14:22 2009	(r190445)
| > @@ -79,7 +79,7 @@ typedef l_ulong		l_ino_t;
| >  typedef l_int		l_key_t;
| >  typedef l_longlong	l_loff_t;
| >  typedef l_ushort	l_mode_t;
| > -typedef l_long		l_off_t;
| > +typedef l_ulong		l_off_t;
| 
| where did you get this idea? my copy of linux 2.6.16 shows that off_t
| is being declared as long. can you be more specific about the background
| of this change? what does it fix?

Maybe you have another suggestion to fix this.  The problem showed up
when doing a mmap of 0xcf79c000 into 0xffffffffcf79c000 also a mmap
of 0xf0000 ended up the same way.  This caused it to fail.  Note this
is only on amd64 with a Linux.  It didn't happen with a FreeBSD i386
version on amd64.  Here is a sample test program:
--------------------------------------------------------------------
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

test(int fd, off_t off, size_t len){
        char *temp;
        int i;
        unsigned int sum;
        int fdout;
        char str[100];
        int out;

        printf("checking %u/%u %x/%x\n",off,len,off,len);
        temp=mmap(NULL, len, PROT_READ, MAP_SHARED, fd, off);
        printf("Returned %x\n",temp);
        if (temp == MAP_FAILED) {
                perror("Couldn't map");
        } else
                for(i=0;i<len;i++) {
                        sum+=(unsigned int)temp[i];
                }
        printf("   sum ->%x\n",sum);
        sprintf(str, "dump.%x",off);
        fdout=open(str,O_WRONLY|O_CREAT|O_TRUNC,0666);
        if (fdout==-1) {
                printf("failed to create %s\n",str);
        } else {
                out=write(fdout,temp,len);
                printf("What %d %d, %x\n",out,len,temp);
                close(fdout);
        }
/*
        printf("press enter to continue\n");
        scanf("%d",&fdout);
*/
        munmap(temp, len);
}

main(){
        int fd, i;

        fd=open("/dev/mem",O_RDONLY);
        if (fd==-1) {
                printf("Can't open /dev/mem\n");
                exit(1);
        }
        test(fd,0xf0000,4096);
        test(fd,0xfe000,4096);
        test(fd,0xcf7f0000,4096);
        test(fd,0xcf79c000,4096);
}
--------------------------------------------------------------------
I can toss a compiled Linux/i386, FreeBSD/i386 and FreeBSD/amd64 versions
up on my web server.  I added a printf to the native mmap kernel function
to print out the address being passed to it.

Thanks,

Doug A.


More information about the svn-src-all mailing list