From RCS Wiki
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. Done
  • 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
  • Url
    • url/url_canon_host.cc
    - Uses a reinterpret_cast to get an unsigned char pointer into an unsigned int, for no good reason. 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

Failing testcases

Testsuite Testcase Result
base_unittests OutOfMemoryDeathTest.SecurityValloc Fail
(Also on LE)
PartitionAllocTest.DumpMemoryStats Crash
(Also on LE)
PartitionAllocTest.GenericAllocGetSize Fail
(Also on LE)
PartitionAllocTest.PurgeDiscardable Crash
(Also on LE)
PartitionAllocTest.Realloc Fail
(Also on LE)
StackTraceTest.TraceStackFramePointers Fail
(Also on LE)
StringUtilTest.FormatBytesUnlocalized Fail
SysInfoTest.GetHardwareInfo Fail
(Also on LE)
TCMallocFreeTest.BadPointerInFirstPageOfTheLargeObject Fail
(Also on LE)
TCMallocFreeTest.DoubleFreeSmallObject Fail
(Also on LE)
components_unittests ActivationStateComputingThrottleSubFrameTest.Activate/0 Fail
(Also on LE)
BidirectionalStreamDelayRequestHeadersUntilFlush Fail
CastFramerTest.TestMessageFramerCompleteMessage Crash
CastFramerTest.TestUnparsableBodyProto Fail
CastTransportTest Crash
ChromeCTPolicyEnforcerTest Fail
(Also on LE)
DataAccessorTest.Mix Fail
DataReductionProxyInterceptorEndToEndTest.RedirectChainToHttps Crash
(Also on LE)
DocumentProviderTest.GenerateLastModifiedString Fail
(Also on LE)
ExpireHistoryTest Crash
FaviconHandlerTest.RedownloadExpiredPageUrlFavicon Fail
HistoryBackendTest Fail
ImageManagerTest.GetImageForURLNetworkCacheHit Timeout
ImageManagerTest.QueueImageRequest Timeout
MockCastSocketTest Crash
MultilingualSpellCheckTest Fail
NetExportFileWriterTest.AddEventCustomPath Fail
PasswordHashDataTest.CalculatePasswordHash Fail
PwgRasterTest.Encode Fail
QuarantineTest.FileCanBeAnnotatedWithNoGUID Fail
QuarantineTest.FileCanBeOpenedForReadAfterAnnotation Fail
RemoteSuggestionsProviderImplTest Fail
SelectFaviconFramesTest Fail
SenderPipeTest.TimeoutNoRead Fail
(Also on LE)
SenderPipeTest.TimeoutSmallRead Fail
(Also on LE)
SpellCheckTest Fail
SslCastSocketTest.TestConnectEndToEndWithRealSSL Fail
SubresourceFilterVerifiedRulesetDealerTest.OpenAndSetRulesetFileValidNoChecksum Fail

Patchfiles uploaded