Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: sandbox/linux/seccomp-bpf/codegen.cc

Issue 576673003: Decouple CodeGen from ErrorCode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync and fix comment Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sandbox/linux/seccomp-bpf/codegen.h ('k') | sandbox/linux/seccomp-bpf/codegen_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sandbox/linux/seccomp-bpf/codegen.h" 5 #include "sandbox/linux/seccomp-bpf/codegen.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 instructions_.push_back(insn); 165 instructions_.push_back(insn);
166 return insn; 166 return insn;
167 } else { 167 } else {
168 // Non-jumping instructions do not use any of the branch targets. 168 // Non-jumping instructions do not use any of the branch targets.
169 Instruction* insn = new Instruction(code, k, next); 169 Instruction* insn = new Instruction(code, k, next);
170 instructions_.push_back(insn); 170 instructions_.push_back(insn);
171 return insn; 171 return insn;
172 } 172 }
173 } 173 }
174 174
175 Instruction* CodeGen::MakeInstruction(uint16_t code, const ErrorCode& err) {
176 if (BPF_CLASS(code) != BPF_RET) {
177 SANDBOX_DIE("ErrorCodes can only be used in return expressions");
178 }
179 if (err.error_type_ != ErrorCode::ET_SIMPLE &&
180 err.error_type_ != ErrorCode::ET_TRAP) {
181 SANDBOX_DIE("ErrorCode is not suitable for returning from a BPF program");
182 }
183 return MakeInstruction(code, err.err_);
184 }
185
186 Instruction* CodeGen::MakeInstruction(uint16_t code, 175 Instruction* CodeGen::MakeInstruction(uint16_t code,
187 uint32_t k, 176 uint32_t k,
188 Instruction* jt, 177 Instruction* jt,
189 Instruction* jf) { 178 Instruction* jf) {
190 // We can handle all conditional jumps. They are followed by both a 179 // We can handle all conditional jumps. They are followed by both a
191 // "true" and a "false" branch. 180 // "true" and a "false" branch.
192 if (BPF_CLASS(code) != BPF_JMP || BPF_OP(code) == BPF_JA) { 181 if (BPF_CLASS(code) != BPF_JMP || BPF_OP(code) == BPF_JA) {
193 SANDBOX_DIE("Expected a BPF_JMP instruction"); 182 SANDBOX_DIE("Expected a BPF_JMP instruction");
194 } 183 }
195 if (!jt && !jf) { 184 if (!jt && !jf) {
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 CutGraphIntoBasicBlocks(instructions, branch_targets, &all_blocks); 757 CutGraphIntoBasicBlocks(instructions, branch_targets, &all_blocks);
769 MergeTails(&all_blocks); 758 MergeTails(&all_blocks);
770 BasicBlocks basic_blocks; 759 BasicBlocks basic_blocks;
771 TopoSortBasicBlocks(first_block, all_blocks, &basic_blocks); 760 TopoSortBasicBlocks(first_block, all_blocks, &basic_blocks);
772 ComputeRelativeJumps(&basic_blocks, all_blocks); 761 ComputeRelativeJumps(&basic_blocks, all_blocks);
773 ConcatenateBasicBlocks(basic_blocks, program); 762 ConcatenateBasicBlocks(basic_blocks, program);
774 return; 763 return;
775 } 764 }
776 765
777 } // namespace sandbox 766 } // namespace sandbox
OLDNEW
« no previous file with comments | « sandbox/linux/seccomp-bpf/codegen.h ('k') | sandbox/linux/seccomp-bpf/codegen_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698