On Sun, Jun 04, 2017 at 11:46:00PM +0200, Christian Weisgerber wrote: > This catches up i386 with the changes to acpi_wakecode.S and mptramp.s > that were made on amd64 for clang. Here's kettenis@'s original > commit message: > > -------------------> > Generating mixed 16-bit/32-bit/64-bit code with clang's integrated > assembler is a bit tricky. It supports the .code16, .code32 and > .code64 directives. But it doesn't know about the data16/data32 and > addr16/addr32 instruction prefixes. Instead it tries to determine > those from the instruction opcode. It mostly succeeds, but there are > a couple of corner cases where clang will generate the "addr32" form > where gas generates the "addr16" form in .code16 segments. That > should be no problem (and just waste a couple of bytes), but it makes > comparing the generated code a bit difficult. > > Allow the trampoline code to be compiled with both. For clang #define > away the addr32 prefix and avoid using the data32 prefix by using a > mnemonic that explicitly encodes the size of the operand. Add a few > addr32 prefixes in .code16 blocks to reduce the differences between > code generated by clang and gas. > <------------------- > > ok? >
yep. go for it. ok mlarkin > Index: acpi_wakecode.S > =================================================================== > RCS file: /cvs/src/sys/arch/i386/i386/acpi_wakecode.S,v > retrieving revision 1.27 > diff -u -p -r1.27 acpi_wakecode.S > --- acpi_wakecode.S 20 May 2016 02:30:41 -0000 1.27 > +++ acpi_wakecode.S 4 Jun 2017 21:06:47 -0000 > @@ -52,6 +52,10 @@ > #include <machine/segments.h> > #include <dev/acpi/acpivar.h> > > +#ifdef __clang__ > +#define addr32 > +#endif > + > #define _ACPI_TRMP_LABEL(a) a = . - _C_LABEL(acpi_real_mode_resume) + > ACPI_TRAMPOLINE > #define _ACPI_TRMP_OFFSET(a) a = . - _C_LABEL(acpi_real_mode_resume) > #define _ACPI_TRMP_DATA_LABEL(a) a = . - _C_LABEL(acpi_tramp_data_start) + \ > @@ -108,7 +112,7 @@ _ACPI_TRMP_OFFSET(acpi_s3_vector_real) > movw %ax, %ss > movw %cs, %ax > movw %ax, %es > - lidtl clean_idt > + addr32 lidtl clean_idt > > /* > * Set up stack to grow down from offset 0x0FFE. > @@ -140,7 +144,7 @@ _ACPI_TRMP_OFFSET(acpi_s3_vector_real) > * to sleep (although on i386, the saved GDT will most likely > * represent something similar based on machine/segment.h). > */ > - data32 addr32 lgdt tmp_gdt > + addr32 lgdtl tmp_gdt > > /* > * Enable protected mode by setting the PE bit in CR0 > @@ -342,7 +346,7 @@ _ACPI_TRMP_LABEL(hibernate_resume_vector > movw %ax, %fs > movw %ax, %gs > movl $0x0FFE, %esp > - lidtl clean_idt > + addr32 lidtl clean_idt > > /* Jump to the S3 resume vector */ > ljmp $(_ACPI_RM_CODE_SEG), $acpi_s3_vector_real > Index: mptramp.s > =================================================================== > RCS file: /cvs/src/sys/arch/i386/i386/mptramp.s,v > retrieving revision 1.20 > diff -u -p -r1.20 mptramp.s > --- mptramp.s 6 Feb 2017 01:50:36 -0000 1.20 > +++ mptramp.s 4 Jun 2017 20:32:04 -0000 > @@ -84,6 +84,10 @@ > #include <machine/mpbiosvar.h> > #include <machine/i82489reg.h> > > +#ifdef __clang__ > +#define addr32 > +#endif > + > #define GDTE(a,b) .byte 0xff,0xff,0x0,0x0,0x0,a,b,0x0 > #define _RELOC(x) ((x) - KERNBASE) > #define RELOC(x) _RELOC(_C_LABEL(x)) > @@ -115,7 +119,7 @@ _C_LABEL(cpu_spinup_trampoline): > movw %cs, %ax > movw %ax, %es > movw %ax, %ss > - data32 addr32 lgdt (gdt_desc) # load flat descriptor table > + addr32 lgdtl (gdt_desc) # load flat descriptor table > movl %cr0, %eax # get cr0 > orl $0x1, %eax # enable protected mode > movl %eax, %cr0 # doit > -- > Christian "naddy" Weisgerber na...@mips.inka.de >