Re: [PATCHv6 15/30] x86/boot: Port I/O: allow to hook up alternative helpers

From: Kirill A. Shutemov
Date: Thu Mar 17 2022 - 16:10:50 EST


On Thu, Mar 17, 2022 at 01:12:59PM +0100, Thomas Gleixner wrote:
> On Wed, Mar 16 2022 at 05:08, Kirill A. Shutemov wrote:
> > +#undef inb
> > +#undef inw
> > +#undef inl
> > +#undef outb
> > +#undef outw
> > +#undef outl
> > +
> > +struct port_io_ops {
> > + u8 (*inb)(u16 port);
> > + u16 (*inw)(u16 port);
> > + u32 (*inl)(u16 port);
> > + void (*outb)(u8 v, u16 port);
> > + void (*outw)(u16 v, u16 port);
> > + void (*outl)(u32 v, u16 port);
>
> u8 (*inb)(u16 port);
> void (*outb)(u8 v, u16 port);
> void (*outw)(u16 v, u16 port);
>
> is all what's used AFAICT.

Hm. Okay. I will drop the rest.

> > +};
> > +
> > +extern struct port_io_ops pio_ops;
> > +
> > +/*
> > + * Use the normal I/O instructions by default.
> > + * TDX guests override these to use hypercalls.
> > + */
> > +static inline void init_default_io_ops(void)
> > +{
> > + pio_ops.inb = __inb;
> > + pio_ops.inw = __inw;
> > + pio_ops.inl = __inl;
> > + pio_ops.outb = __outb;
> > + pio_ops.outw = __outw;
> > + pio_ops.outl = __outl;
> > +}
>
> #define DEFINE_PORT_IO_OPS() \
> struct port_io_ops pio_ops = { \
> .inb = __inb, \
> .outb = __outb, \
> .outw = __outw, }
>
> Hmm?

This kind of initializations are problematic. They generate run-time
relacations that kernel cannot handle in the boot stub. Linker complains
about this:

ld.lld: error: Unexpected run-time relocations (.rela) detected!

I will leave it as is, unless you have better ideas.

--
Kirill A. Shutemov