Porting/Chromium/BE

From RCS Wiki
Revision as of 09:50, 16 February 2019 by MarcusC (talk | contribs)
Jump to navigation Jump to search

Changes required to Chromium to work on big endian

  • Skia
- Chromium assumes that the pixel format, when viewed as a 32-bit word, is either ARGB or ABGR. However, third_party/skia/include/core/SkImageInfo.h contains a check that the pixel format, when viewed as four 8-bit bytes, is either BGRA or RGBA. Hence either this check needs to be relaxed (Maybe it is bogus in the first place? The comments talk about "native ARGB 32-bit", yet the test goes out of its way to test the ordering as bytes and not as 32-bit words), or Chromium needs to learn about a different pixel format.
  • Datapack
    • ui/base/resource/data_pack.cc
    - Need to byteswap metadata on input (resource file format is specified to use LE) Done
    • chrome/browser/themes/browser_theme_pack.cc
    - "datapack assumes little endian"
  • Net
    • net/cert/crl_set.cc
    - "assumes little endian"
    • components/safe_browsing/db/v4_rice.cc
    - #error The code below assumes little-endianness.
  • Media
    • media/ffmpeg/ffmpeg_common.cc and media/formats/mp4/box_definitions.cc
    - #error The code below assumes little-endianness.
    • media/renderers/paint_canvas_video_renderer.cc
    - Depending on choice of Skia pixel format, a new LIBYUV mapping set may be needed (see also third_party/libyuv below).
  • I18N
    • base/i18n/icu_util.cc
    - Needs to use "icudtb.dat" instead of "icudtl.dat" on BE Done
  • Sandbox
    • sandbox/linux/system_headers/linux_seccomp.h
    - The definition of the big endian variant is incorrect (contains a bogus "__AUDIO_ARCH_BE"). Also, it would be better to define two different macros AUDIT_ARCH_PPC64 and AUDIT_ARCH_PPC64LE (because that is how it actually looks in <linux/audit.h>), and choose the correct one in sandbox/linux/bpf_dsl/seccomp_macros.h instead. Done
  • Partition allocator
    • base/allocator/partition_allocator/partition_freelist_entry.h
    - A different pointer transformation function is used on BE compared to on LE. This is not an issue in itself, but it exposes a bug that NULL pointers are sometimes not transformed when they ought to be (the LE transformation function is unity for NULL).
  • Pickle
    • base/pickle.cc
    - ReadBool accesses serialized bools as "bool" (8 bit) despite WriteBool serializing them as "int" (32 bit) Done
  • SHA1
    • base/sha1.cc
    - Contains some byteswaps which should only happen on little endian Done
  • Unit tests
    • base/memory/shared_memory_mapping_unittest.cc, base/metrics/bucket_ranges_unittest.cc, and base/strings/string_number_conversions_unittest.cc
    - These unit tests expose endianness in one way or another and need to be adjusted to run correctly on BE Done
  • third_party/skia
    • include/private/GrTypesPriv.h
    - #error "Skia gpu currently assumes little endian"
    • src/opts/Sk4px_none.h
    - Sk4px::alphas, Sk4px::zeroAlphas, Sk4px::zeroColors: "This method assumes little-endian."
    • src/opts/SkXfermode_opts.h
    - a_rgb assumes specific component order
    • src/utils/SkJSON.cpp and src/utils/SkJSON.h
    - Tagged value implementation needs to be adapted for BE Done
    • src/codec/SkCodecPriv.h
    - Missing include of "SkEndian.h" Done
  • third_party/boringssl/src
    • include/openssl/base.h
    - Need to recognize BE ppc64 Done
    • crypto/fipsmodule/bn/bytes.c
    - Bignum I/O functions need adaption for BE Done
    • crypto/fipsmodule/ecdsa/ecdsa.c and third_party/fiat/p256.c
    - More bignum stuff needing adaption for BE Done
    • crypto/asn1/a_int.c, crypto/fipsmodule/modes/gcm.c, crypto/fipsmodule/modes/internal.h, and crypto/fipsmodule/rand/ctrdrbg.c
    - Hardcoded swaps which need to be removed on BE Done
    • crypto/fipsmodule/modes/polyval.c
    - reverse_and_mulX_ghash does both byte-swapping and arithmetic. The order needs to be reversed on BE. Done
    • crypto/poly1305/poly1305.c
    - Defines specific LE access functions, but does not do any actual serialization or swapping in them. Done
    • crypto/curve25519/spake25519.c and third_party/fiat/curve25519.c
    - The arithmetic operations on LE data (addition, comparison) need swaps on BE. Done
    • crypto/evp/scrypt.c
    - Need to swap the input and and output blocks on BE. Done
    • crypto/chacha/chacha.c
    - LE access functions are defined, and correct, but are only used in one of the two CHACHA variants. Done
    • crypto/cipher_extra/e_aesgcmsiv.c
    - Counter and length fields need swapping on BE. Done
    • crypto/compiler_test.cc
    - There is a test which deliberately fails if the host is not LE... Done
  • third_party/blink
    • renderer/platform/graphics/gpu/webgl_image_conversion.cc
    - Does contain BE support, but a variable rename refactoring is missing from the BE code Done
    • renderer/platform/graphics/logging_canvas.cc
    - Does contain BE support, but a variable rename refactoring is missing from the BE code Done
    • renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc
    - #error Blink assumes a little-endian target.
    • renderer/platform/image-decoders/webp/webp_image_decoder.cc
    - #error Blink assumes a little-endian target.
    • renderer/platform/heap/asm/SaveRegisters_ppc64.S
    - Needs to handle ELF ABI v1 Done
  • third_party/perfetto
    • src/ipc/buffered_frame_deserializer.cc, src/ipc/buffered_frame_deserializer_unittest.cc
    - Uses "AssumeLittleEndian" template
    • src/protozero/message.cc
    - float and double handling need adjusting for BE (according to comment)
    • src/protozero/proto_decoder.cc
    - Byteswap implementations missing Done
  • third_party/ffmpeg
    • chromium/scripts/build_ffmpeg.py
    - Needs to recognize 'ppc64' as well as 'ppc64le' Done
  • third_party/webrtc
    • common_audio/wav_file.cc
    - WavReader::ReadSamples and WavWriter::WriteSamples need to byteswap the samples
    • common_audio/wav_header.cc
    - Conversion functions missing Done
  • third_party/modp_b64
    • BUILD.gn
    - modp_b64 actually supports BE, but in converting to their own build system Google managed to lose the check to define WORDS_BIGENDIAN Done
    • modp_b64.cc
    - The prototype of modp_b64_decode needs to be updated to use size_t instead of int for the lengths, as it has been done for the LE variant Done
  • third_party/crc32c
    • BUILD.gn
    - Needs to define BYTE_ORDER_BIG_ENDIAN=1 on BE
  • third_party/leveldatabase
    • port/port_chromium.h
    - Needs to set kLittleEndian depending on endianness
  • third_party/libvpx
- The build system should move VSX-specific sources into a separate source set, and set the cflags "-maltivec -mvsx" for it. In the original build system the cflags were set based on a glob of the source filename, but in Googles build system it has to be done manually.
  • third_party/libyuv
- Depending on choice of Skia pixel format, additional conversion function variants may be needed
  • base/third_party/dmg_fp
    • dtoa.cc
    - Google has hardcoded little endian mode Done

Patchfiles uploaded