Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20151110150818.5820b37d@r2lynx>
Date: Tue, 10 Nov 2015 15:08:18 +0700
From: Рысь <lynx@...xlynx.tk>
To: musl@...ts.openwall.com
Subject: Re: sys/io.h lacks inb_p and outb_p on x86

On Mon, 9 Nov 2015 17:17:34 -0500
Rich Felker <dalias@...c.org> wrote:

> On Sun, Nov 08, 2015 at 12:23:58AM -0500, Rich Felker wrote:
> > On Sun, Nov 08, 2015 at 12:13:37PM +0700, Рысь wrote:
> > > On Sat, 7 Nov 2015 23:50:45 -0500
> > > Rich Felker <dalias@...c.org> wrote:
> > > 
> > > > On Sun, Nov 08, 2015 at 11:26:55AM +0700, Рысь wrote:
> > > > > x86 arch lacks inb_p and outb_p inline functions. This is
> > > > > required for memtest86+.
> > > > > 
> > > > > I don't know how properly make an assembly here, so when
> > > > > making memtest I copied sys/io.h into local directory, and
> > > > > copied these functions from uClibc.
> > > > > 
> > > > > I attach modified header for reference (they should go into
> > > > > bits/io.h).
> > > > 
> > > > Any idea what these are intended to do? Are they documented
> > > > anywhere?
> > > > 
> > > > Rich
> > > 
> > > I can't say much, but looking into memtest code I see they're
> > > used only for beeping a PC speaker.
> > > 
> > > Comment in io.h include file of memtest says:
> > > 
> > >  * This file contains the definitions for the x86 IO instructions
> > >  * inb/inw/inl/outb/outw/outl and the "string versions" of the
> > > same
> > >  * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
> > >  * versions of the single-IO instructions (inb_p/inw_p/..).
> > > 
> > > However memtest builds with assumption they're present in
> > > sys/io.h from host and io.h included with memtest does not define
> > > inb_p/outb_p in any way.
> > > 
> > > I probably will go with uClibc defines, or just nop memtest
> > > beeper.
> > 
> > See
> > http://stackoverflow.com/questions/6793899/what-does-the-0x80-port-address-connects
> > 
> > So apparently these are convenience functions to show the most
> > recent port io that was performed on a hardware debugging device in
> > case the memtest crashes. I don't mind adding them is software
> > expects them to be there, but they should be written in terms of
> > the existing functions rather than duplicating asm.
> 
> Hmm, according to the man page this is actually to "pause". See:
> http://man7.org/linux/man-pages/man2/outb.2.html
> 
> Of course there's also all kinds of nonsense claiming they won't work
> with -O0, so I'm not sure what to believe.
> 
> If you want these, can you prepare a patch adding all 6 *_p functions
> as calls to plain in[bwl]/out[bwl] followed by a call to outb to port
> 0x80?
> 
> Rich

Well, I am not good at assembly right now, so no.

While digging this I came to suspection that grabbed versions from
uClibc cannot be rewritten as function calls, or I misunderstand
assembly (or it's gcc variant) at all.

So, after three+ years of experience with musl I just hit this once,
and I don't think they worth adding if there is no much interest.

memtest86+ uses no libc code, and suddenly only grabs those two from
host which is easily patchable.

I used uClibc versions just to get a conformant binary.

-- 
http://lynxlynx.tk/
Power electronics made simple
Unix and simple KISS C code

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.