1. 28 Jun, 2015 1 commit
  2. 27 Jun, 2015 1 commit
  3. 26 Jun, 2015 4 commits
    • Adds X8664 Condition codes. · a054f0ac
      John Porto authored
      Also fixes the X8664 Registers file.
      
      BUG= https://code.google.com/p/nativeclient/issues/detail?id=4077
      R=kschimpf@google.com
      
      Review URL: https://codereview.chromium.org/1212393005.
    • Adds the X8664 register definition. · 2b18687b
      John Porto authored
      BUG=
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1211103004.
    • Fixes bug on conditional branch where the targets are the same. · c070d6f7
      Karl Schimpf authored
      Fixes constructor InstBr when it is a conditional branch, and the
      true and false branches are the same.
      
      BUG= https://code.google.com/p/nativeclient/issues/detail?id=4212
      R=jpp@chromium.org, stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1215443002.
    • Function Layout, Global Variable Layout and Pooled Constants Layout Reordering · 7cd5351c
      Qining Lu authored
      PURPOSE:
      The purpose of function layout reordering is to defend against code-reuse attacks as the location of code blocks will be various among different binaries. The layout reordering for global variables and pooled constants can be considered as static data randomization. This is to stop memory corruption attacks by randomizing the locations of the static data. After function layout reordering, the order of function blocks in TEXT section will be randomized. Global variable reordering randomize the order of global variables, and pooled constant reordering randomize the order of pooled constants. Note the order of constant pools won’t be affected and all pooled constants will remain in their original constant pools.
      
      USAGE:
      -reorder-functions: bool type command line option, enables function layout shuffling in TEXT section. Note when -threads=0 is set, function reordering will be forced off.
      
      -reorder-functions-window-size: uint32 type command line option, specify the length of the shuffling queue. Note -reorder-functions-window-size=0 or 1 means no shuffling applied to functions.
      
      -reorder-global-variables: bool type command line option, enables global variables shuffling.
      
      -reorder-pooled-constants: bool type command line option, enables pooled constants shuffling.
      
      APPROACH:
      Randomization is introduced at the code emission time. We use a shuffling method to randomize the emission of function code, global variables and pooled constants. For function code emission, we also introduce “window size” as a parameter to control the size of the function holding buffer for shuffling. Window size 1 and 0 mean no shuffling applied, and a value higher than the number of translated functions means holding all the functions and shuffling them before emitting any of them.
      
      IMPLEMENTATION:
          Function reordering:
              GlobalContext::emitItems(): Call RandomShuffle() routine to shuffle a specific part of the Pending vector.
      
          Global variable reorder:
              GlobalContext::lowerGlobals(const IceString &SectionSuffix): Call RandomShuffle() routine upon declaration list: Globals.
      
          Pooled constant reordering:
              TargetDataX8632::emitConstantPool(GlobalContext *Ctx): Add call to RandomShuffle() to shuffle the constant pool to be emitted. This is for asm output.
      
              ELFObjectWriter::writeConstantPool(Type Tu): Add call to RandomShuffle() to shuffle the constant pool before emitting it. This is only for elf output.
      
      ISSUES:
          The initialization of global variables are emitted along with function code, all of them are considered as EmitterWorkItem. However, we do need to first emit global variables to keep the block profiling workflow untouched. To fulfill this, a “kind” check is added in the while loop of GlobalContext::emitItems(). The “if” statement at line 480 shows the workaround of this issue.
      BUG=
      R=jpp@chromium.org, jvoung@chromium.org, stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1206723003.
  4. 25 Jun, 2015 2 commits
  5. 24 Jun, 2015 3 commits
  6. 23 Jun, 2015 4 commits
  7. 22 Jun, 2015 8 commits
    • Subzero: Use more "= default;" for ctors and dtors. · e587d949
      Jim Stichnoth authored
      Look for "() override {}" and "() final {}" patterns.
      
      Don't touch IceTargetLoweringX8632.* to spare a refactoring in
      progress.
      
      BUG= none
      R=jpp@chromium.org
      
      Review URL: https://codereview.chromium.org/1201023002
    • Fix llvm makefile to handle macro INPUT_IS_TEXTUAL_BITCODE. · cac05851
      Karl Schimpf authored
      BUG=None
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1205463002
    • Allow pnacl-sz to be compiled to textual bitcode records. · 6f9ba115
      Karl Schimpf authored
      This has been added to allow fuzzing to be applied to textual bitcode
      records. When built with make option TEXTUAL_BITCODE=1, the
      corresponding generated pnacl-sz will preprocess the input file
      (containing the textual form of bitcode records) and generate
      a corresponding data stream with the binary form.
      
      Note that the texual form of bitcode records is not LLVM assembly
      (i.e. .ll files). Rather, it is sequences of texual integers
      corresponding to bitcode records.
      
      Dependent on: https://codereview.chromium.org/1191393004
      
      BUG= https://code.google.com/p/nativeclient/issues/detail?id=4169
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1190413004
    • Subzero: Fix "make -f Makefile.standalone MINIMAL=1 check". · c8799688
      Jim Stichnoth authored
      Some recent ARM changes turned out to break the lit tests for the MINIMAL build.  Two main issues:
      
      1. ARM tests are currently asm-only, so allow_dump needs to be required.
      
      2. GlobalContext::emitFileHeader() needs to return gracefully instead of calling report_fatal_error(), to allow error tests to produce the right error output.
      
      BUG= none
      R=kschimpf@google.com
      
      Review URL: https://codereview.chromium.org/1202563002
    • Subzero. Fixes memory leaks. · 1bec8bcd
      John Porto authored
      Adds named constructors to initialzers. Removes destructor from Inst.
      
      BUG= None
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1181013016.
    • Subzero: Apply commutativity to the RMW optimization. · 8525c329
      Jim Stichnoth authored
      The read-modify-write (RMW) optimization looks for patterns like this:
      
        a = Load addr
        b = <op> a, other
        Store b, addr
      
      and essentially transforms them into this:
      
        RMW <op>, addr, other
      
      This CL also applies the transformation when the middle instruction is
        b = <op> other, a
      and <op> is commutative.
      
      BUG= https://code.google.com/p/nativeclient/issues/detail?id=4095
      R=jpp@chromium.org
      
      Review URL: https://codereview.chromium.org/1193103005
    • Subzero: Use C++11 member initializers where practical. · eafb56cb
      Jim Stichnoth authored
      Also change the pattern "foo() {}" into "foo() = default;" for ctors and dtors.
      
      Generally avoids initializing unique_ptr<> members to nullptr in a .h file, because that requires knowing the definition of the underlying class which may not be available to all includers.
      
      BUG= none
      R=jpp@chromium.org
      
      Review URL: https://codereview.chromium.org/1197223002
    • Add constant blinding/pooling option for X8632 code translation. · 253dc8a8
      Qining Lu authored
      GOAL:
      The goal is to remove the ability of an attacker to control immediates emitted into the text section.
      
      OPTION:
      The option -randomize-pool-immediates is set to none by default (-randomize-pool-immediates=none). To turn on constant blinding, set -randomize-pool-immediates=randomize; to turn on constant pooling, use -randomize-pool-immediates=pool.
      
      Not all constant integers in the input pexe file will be randomized or pooled. The signed representation of a candidate constant integer must be between -randomizeOrPoolImmediatesThreshold/2 and +randomizeOrPoolImmediatesThreshold/2. This threshold value can be set with command line option: "-randomize-pool-threshold". By default this threshold is set to 0xffff.
      
      The constants introduced by instruction lowering (e.g. constants in shifting, masking) and argument lowering are not blinded in this way. The mask used for sandboxing is not affected either.
      
      APPROACH:
      We use GAS syntax in these examples.
      
      Constant blinding for immediates:
      Original:
          add 0x1234, eax
      After:
          mov 0x1234+cookie, temp_reg
          lea -cookie[temp_reg], temp_reg
          add temp_reg, eax
      
      Constant blinding for memory addressing offsets:
      Original:
        mov 0x1234(eax, esi, 1), ebx
      After:
        lea 0x1234+cookie(eax), temp_reg
        mov -cookie(temp_reg, esi, 1), ebx
      
      We use "lea" here because it won't affect flag register, so it is safer to transform immediate-involved instructions.
      
      Constant pooling for immediates:
      Original:
          add 0x1234, eax
      After:
          mov [memory label of 0x1234], temp_reg
          add temp_reg, eax
      
      Constant pooling for addressing offsets:
      Original:
        mov 0x1234, eax
      After:
        mov [memory label of 0x1234], temp_reg
        mov temp_reg, eax
      
      Note in both cases, temp_reg may be assigned with "eax" here, depends on the
      liveness analysis. So this approach may not require extra register.
      
      IMPLEMENTATION:
        Processing:
         TargetX8632::randomizeOrPoolImmediate(Constant *Immediate, int32_t RegNum);
         TargetX8632::randomizeOrPoolImmediate(OperandX8632Mem *Memoperand, int32_t RegNum);
      
        Checking eligibility:
          ConstantInteger32::shouldBeRandomizedOrPooled(const GlobalContext *Ctx);
      
      ISSUES:
      1. bool Ice::TargetX8632::RandomizationPoolingPaused is used to guard some translation phases to disable constant blinding/pooling temporally. Helper class BoolFlagSaver is added to latch the value of RandomizationPoolingPaused.
      
      Known phases that need to be guarded are: doLoadOpt() and advancedPhiLowering(). However, during advancedPhiLowering(), if the destination variable has a physical register allocated, constant blinding and pooling are allowed. Stopping blinding/pooling for doLoadOpt() won't hurt our randomization or pooling as the optimized addressing operands will be processed again in genCode() phase.
      
      2. i8 and i16 constants are collected with different constant pools now, instead of sharing a same constant pool with i32 constants. This requires emitting two more pools during constants lowering, hence create two more read-only data sections in the resulting ELF and ASM. No runtime issues have been observed so far.
      
      BUG=
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/1185703004.
  8. 18 Jun, 2015 4 commits
  9. 17 Jun, 2015 2 commits
  10. 16 Jun, 2015 1 commit
  11. 15 Jun, 2015 2 commits
  12. 12 Jun, 2015 3 commits
  13. 11 Jun, 2015 5 commits