On 09.03.2010 21:06, Carl-Daniel Hailfinger wrote:
> Rudolf Marek added some preliminary DOS support to flashrom. He kindly
> gave me the tarball, and I tried to generate a patch from it. Any
> omissions are my fault.
>
> If anyone wants a big (130 MB) tarball with cross compiler, matching
> libpci and other stuff, just ask me. The server hosting the tarball is
> has a transfer quota, and I'd rather avoid exhausting it with everybody
> downloading the thing in question.
>
> (It's Rudolf's code, so I'll let him sign off on it.)
>   

Review follows.
If anyone feels up to the task, just repost the code with the requested
changes.


> Index: hwaccess.c
> ===================================================================
> --- hwaccess.c        (revision 927)
> +++ hwaccess.c        (working copy)
> @@ -37,7 +37,7 @@
>  #elif defined(__FreeBSD__) || defined (__DragonFly__)
>       if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
>  #else
> -     if (iopl(3) != 0) {
> +     if (0) {
>  #endif
>   

This needs to be

#elif defined (__MSDOS__)
        if (0) {
#else
        if (iopl(3) != 0) {
#endif



>               fprintf(stderr, "ERROR: Could not get I/O privileges (%s).\n"
>                       "You need to be root.\n", strerror(errno));
> Index: hwaccess.h
> ===================================================================
> --- hwaccess.h        (revision 927)
> +++ hwaccess.h        (working copy)
> @@ -67,12 +67,21 @@
>    #define INW  inw
>    #define INL  inl
>  #else
>   

Use #elif defined (__MSDOS__) for all changes in this file.


> -  #define OUTB outb
> -  #define OUTW outw
> -  #define OUTL outl
> -  #define INB  inb
> -  #define INW  inw
> -  #define INL  inl
> +//#error "a"
> +
> +//#include <pc.h>
> +
> +  #define OUTB(x,y) outportb(y, x)
> +  #define OUTW(x,y) outportw(y, x)
> +  #define OUTL(x,y) outportl(y, x)
> +
> +
> +  #define INB  inportb
> +  #define INW  inportw
> +  #define INL  inportl
> +
> +
> +
>  #endif
>  #endif
>  
> @@ -89,47 +98,6 @@
>      #endif
>    #include <stdint.h>
>  
> -static inline void
> -outb(uint8_t value, uint16_t port)
> -{
> -     asm volatile ("outb %b0,%w1": :"a" (value), "Nd" (port));
> -}
> -
> -static inline uint8_t
> -inb(uint16_t port)
> -{
> -     uint8_t value;
> -     asm volatile ("inb %w1,%0":"=a" (value):"Nd" (port));
> -     return value;
> -}
> -
> -static inline void
> -outw(uint16_t value, uint16_t port)
> -{
> -     asm volatile ("outw %w0,%w1": :"a" (value), "Nd" (port));
> -}
> -
> -static inline uint16_t
> -inw(uint16_t port)
> -{
> -     uint16_t value;
> -     asm volatile ("inw %w1,%0":"=a" (value):"Nd" (port));
> -     return value;
> -}
> -
> -static inline void
> -outl(uint32_t value, uint16_t port)
> -{
> -     asm volatile ("outl %0,%w1": :"a" (value), "Nd" (port));
> -}
> -
> -static inline uint32_t
> -inl(uint16_t port)
> -{
> -     uint32_t value;
> -     asm volatile ("inl %1,%0":"=a" (value):"Nd" (port));
> -     return value;
> -}
>    #endif
>  #endif
>  
> Index: physmap.c
> ===================================================================
> --- physmap.c (revision 927)
> +++ physmap.c (working copy)
> @@ -58,21 +58,38 @@
>  static int fd_mem = -1;
>  static int fd_mem_cached = -1;
>  
>   

Use #if defined (__MSDOS__) for all changes in this file.


> +#define MAP_FAILED 0
> +
> +//***************** call DPMI physical memory mapping and allocate LDT 
> descriptor for the memory block
>   

Comments should use /**/ instead of //


> +void *map_physical_memory(uint32_t phys_base, uint32_t size) // phys_base 
> must be page aligned
> +{                                                         // size will be 
> aligned automatically
>   

Explanations for phys_base and size should be in a doxygen comment above
the function.


> +  void *p;
> +  if (size == 0)                    // if zero block size, do nothing
>   

Comments above each line, not to the right of the code.


> +    return(NULL);
> +  if ((size & 0x0FFF) != 0)         // if size is not page-aligned
> +    size = (size + 4096) & (~0x0FFF);  // make it page-aligned
> +  if ((p = valloc(size)) == NULL)      // allocate page-aligned memory 
> (__djgpp_map_physical_memory required this)
> +    {                                       // allocation failed
> +    printf("ERROR: cannot allocate %lu bytes for memory mapped 
> device\n",size);
>   

Please use msg_perr instead of printf, try to keep the 80 column limit
by breaking the string apart. gcc can handle stuff like below without
problems:

msg_perr("ERROR: foo bar "
         "baz bang\n");



> +    exit(-1);                               // exit program
> +    }
> +  if (__djgpp_map_physical_memory(p,size,phys_base))
> +    {                                       // failed to map physmem
> +    printf("ERROR: failed to map physical memory range: 0x%08lX - 
> 0x%08lX\nDPMI 1.0 server or support of DPMI function 0508h is needed.\nIt 
> doesn't work under Windows, use win32 version 
> instead.\n",phys_base,phys_base+size-1);
>   

msg_perr instead of printf, 80 column limit.


> +    return MAP_FAILED;                              // exit program
> +    }
> +  return(p);                        // return pointer to memory block 
> aliasing physical memory area
> +}
> +
> +
> +
>  /* For MMIO access. Must be uncached, doesn't make sense to restrict to ro. 
> */
>  void *sys_physmap_rw_uncached(unsigned long phys_addr, size_t len)
>  {
>       void *virt_addr;
>  
> -     if (-1 == fd_mem) {
> -             /* Open the memory device UNCACHED. Important for MMIO. */
> -             if (-1 == (fd_mem = open(MEM_DEV, O_RDWR | O_SYNC))) {
> -                     perror("Critical error: open(" MEM_DEV ")");
> -                     exit(2);
> -             }
> -     }
>  
> -     virt_addr = mmap(0, len, PROT_WRITE | PROT_READ, MAP_SHARED,
> -                      fd_mem, (off_t)phys_addr);
> +     virt_addr = map_physical_memory(phys_addr, len)   ;
>       return MAP_FAILED == virt_addr ? NULL : virt_addr;
>  }
>  
> @@ -83,17 +100,10 @@
>  {
>       void *virt_addr;
>  
> -     if (-1 == fd_mem_cached) {
> -             /* Open the memory device CACHED. */
> -             if (-1 == (fd_mem_cached = open(MEM_DEV, O_RDWR))) {
> -                     perror("Critical error: open(" MEM_DEV ")");
> -                     exit(2);
> -             }
> -     }
>  
> -     virt_addr = mmap(0, len, PROT_READ, MAP_SHARED,
> -                      fd_mem_cached, (off_t)phys_addr);
> +     virt_addr = map_physical_memory(phys_addr, len)    ;
>       return MAP_FAILED == virt_addr ? NULL : virt_addr;
> +
>  }
>  
>  void physunmap(void *virt_addr, size_t len)
> @@ -103,7 +113,7 @@
>               return;
>       }
>               
> -     munmap(virt_addr, len);
> +//   munmap(virt_addr, len);
>  }
>  #endif
>  
>   


> Index: getopt.c
> ===================================================================
> --- getopt.c  (revision 0)
> +++ getopt.c  (revision 0)
> Index: getopt.h
> ===================================================================
> --- getopt.h  (revision 0)
> +++ getopt.h  (revision 0)
>   

A copy of the getopt header. If anything, this needs to be merged
separately, but it would be preferable to just pick it up from some
generic include path.


> Index: pci/pci.h
> ===================================================================
> --- pci/pci.h (revision 0)
> +++ pci/pci.h (revision 0)
> Index: pci/types.h
> ===================================================================
> --- pci/types.h       (revision 0)
> +++ pci/types.h       (revision 0)
> Index: pci/config.h
> ===================================================================
> --- pci/config.h      (revision 0)
> +++ pci/config.h      (revision 0)
> Index: pci/header.h
> ===================================================================
> --- pci/header.h      (revision 0)
> +++ pci/header.h      (revision 0)
>   

A copy of the important libpci headers. If anything, this needs to be
merged separately, but it would be preferable to just pick it up from
some generic include path.


> Index: Makefile
> ===================================================================
> --- Makefile  (revision 927)
> +++ Makefile  (working copy)
>   

Superseded by my Makefile patch.

Regards,
Carl-Daniel

-- 
"I do consider assignment statements and pointer variables to be among
computer science's most valuable treasures."
-- Donald E. Knuth


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to