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