socsvn commit: r272264 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw
dpl at FreeBSD.org
dpl at FreeBSD.org
Tue Aug 12 10:37:04 UTC 2014
Author: dpl
Date: Tue Aug 12 10:37:03 2014
New Revision: 272264
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272264
Log:
Added the pullup_failed basic block
Modified:
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Aug 12 09:48:54 2014 (r272263)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Aug 12 10:37:03 2014 (r272264)
@@ -48,6 +48,11 @@
Type *int32Ty;
PointerType *int8PtrTy;
+ // Basic blocks used
+ BasicBlock *entry;
+ BasicBlock *pullup_failed;
+ BasicBlock *startiter;
+
// JIT Compiled Vars
// Loop control.
Value *match;
@@ -108,6 +113,9 @@
Function *set_match;
Function *jump_fast;
+ // Not pkg-filtering related funcs.
+ Function *printf;
+
// Used structs
StructType *ifnetTy;
StructType *in_addrTy;
@@ -122,7 +130,8 @@
StructType *ucredTy;
// Load the bc for JIT compilation.
- Module *loadbc(std::string name)
+ Module *
+ loadbc(std::string name)
{
error_code ec = MemoryBuffer::getFile(name, buffer);
if (ec) {
@@ -141,7 +150,7 @@
}
// Create the needed variables to perform pkt filtering.
- int
+ void
setEnv(struct ip_fw_args *args, struct ip_fw_chain *chain)
{
// Get Type objects
@@ -265,6 +274,37 @@
return (0);
}
+ void
+ emit_pullup_failed()
+ {
+ GlobalValue *is_verbose, *str;
+ BasicBlock *print, *ret;
+
+ // VNET_DECLARE(int, fw_verbose);
+ // #define V_fw_verbose VNET(fw_verbose)
+ // We should be fine getting that from the Module.
+
+ // pullup_failed:
+ // if (V_fw_verbose)
+ // printf("ipfw: pullup failed\n");
+ // return (IP_FW_DENY);
+
+ irb.SetInsertPoint(pullup_failed);
+ is_verbose = mod.getGlobalVariable("fw_verbose");
+ str = irb.CreateGlobalString("ipfw: pullup failed\n");
+
+ // if (V_fw_verbose)
+ CreateCondBr(CreateICmpEQ(is_verbose, ConstantInt::get(int32Ty, 0)), ret, print);
+ // printf("ipfw: pullup failed\n");
+ irb.SetInsertPoint(print);
+ irb.CreateCall(printf, str);
+ irb.CreateBr(ret);
+
+ // return (IP_FW_DENY);
+ irb.SetInsertPoint(ret);
+ irb.CreateRet(ConstantInt::get(int32Ty, IP_FW_DENY));
+ }
+
public:
ipfwJIT(struct ip_fw_args *args, struct ip_fw_chain *chain): irb(con)
{
@@ -273,15 +313,22 @@
func = mod->getFunction("ipfw_chk_jit");
func->setLinkage(GlobalValue::ExternalLinkage);
- // Create the entry point of the function
- BasicBlock *entry = BasicBlock::Create(con, "entry", func);
- // Add the entry block to ArrayRef
- blocks.push_back(entry);
- // Set the IRBuilder to insert instructions after the basic block.
+
+ printf = mod->getFunction("printf");
+
+ // Create first BasicBlocks.
+ entry = BasicBlock::Create(con, "entry", func);
+ pullup_failed = BasicBlock::Create(con, "pullup_failed", func);
+ startiter = BasicBlock::Create(con, "startiter", func);
+
+ // Create the code related to the pullup_failed Basic Block.
+ emit_pullup_failed();
+
+ // Set the IRBuilder to insert instructions after the entry BB.
irb.SetInsertPoint(entry);
+
// Get struct types, and store vars
setEnv(args, chain);
- // Create the code related to the pullup_failed Basic Block.
}
~ipfwJIT()
{
More information about the svn-soc-all
mailing list