From ddb682e910c60cda1f7bea097020bb5b1e862cba Mon Sep 17 00:00:00 2001
From: Fang Lu <cc2lufang@gmail.com>
Date: Tue, 12 Dec 2017 01:06:29 -0600
Subject: [PATCH] gl - fix unsafe behaviors

- Prevent writing to out-of-screen locations
- Fix RC enable sync
---
 gl/gl_mgr.sv                      | 7 +++++--
 gl/painters/gl_painter_circle.sv  | 4 +---
 gl/painters/gl_painter_image.sv   | 3 +--
 gl/painters/gl_painter_polygon.sv | 5 ++---
 gl/painters/gl_painter_rect.sv    | 4 ++--
 gl/painters/gl_painter_ring.sv    | 5 ++---
 6 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/gl/gl_mgr.sv b/gl/gl_mgr.sv
index 6dbc9d0..73f6eaa 100644
--- a/gl/gl_mgr.sv
+++ b/gl/gl_mgr.sv
@@ -106,8 +106,11 @@ module gl_mgr (
 	// Paint Write
 	logic fb_PAINT_REQ;
 	logic [9:0] fb_PAINT_X, fb_PAINT_Y;
+	logic [9:0] fb_PAINT_X_san, fb_PAINT_Y_san;
 	logic [15:0] fb_PAINT_RGB16;
 	logic fb_PAINT_READY;
+	assign fb_PAINT_X_san = (fb_PAINT_X>10'd639) ? 10'd639 : fb_PAINT_X;
+	assign fb_PAINT_Y_san = (fb_PAINT_Y>10'd479) ? 10'd479 : fb_PAINT_Y;
 	gl_frame_buffer frame_buffer(
 		.CLK          (CLOCK),
 		.RESET        (RESET),
@@ -122,8 +125,8 @@ module gl_mgr (
 		.GL_DATA      (fb_GL_RGB),
 		.GL_READY     (fb_GL_READY),
 		.PAINT_REQ    (fb_PAINT_REQ),
-		.PAINT_X      (fb_PAINT_X),
-		.PAINT_Y      (fb_PAINT_Y),
+		.PAINT_X      (fb_PAINT_X_san),
+		.PAINT_Y      (fb_PAINT_Y_san),
 		.PAINT_RGB16  (fb_PAINT_RGB16),
 		.PAINT_READY  (fb_PAINT_READY),
 		.BUF_ACTIVE   (paint_buffer),
diff --git a/gl/painters/gl_painter_circle.sv b/gl/painters/gl_painter_circle.sv
index 408c37c..214025c 100644
--- a/gl/painters/gl_painter_circle.sv
+++ b/gl/painters/gl_painter_circle.sv
@@ -37,6 +37,7 @@ module gl_painter_circle (
 	assign fb_PAINT_RGB16 = color;
 	assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER};
 	assign RC_DATA_WR = 1'b1;
+	assign RC_WE = fb_PAINT_REQ;
 
 	always_ff @(posedge CLOCK) begin
 		if(RESET | ~EN) begin
@@ -72,7 +73,6 @@ module gl_painter_circle (
 		xlen_in = xlen;
 		color_in = color;
 		DONE = 1'b0;
-		RC_WE = 1'b0;
 		paint_req_in = 1'b0;
 
 		case (state)
@@ -88,7 +88,6 @@ module gl_painter_circle (
 
 			s_axis: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x + 1;
@@ -127,7 +126,6 @@ module gl_painter_circle (
 
 			s_paint: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x + 1;
diff --git a/gl/painters/gl_painter_image.sv b/gl/painters/gl_painter_image.sv
index 61a5852..a7d53d2 100644
--- a/gl/painters/gl_painter_image.sv
+++ b/gl/painters/gl_painter_image.sv
@@ -50,6 +50,7 @@ module gl_painter_image (
 
 	assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER};
 	assign RC_DATA_WR = 1'b1;
+	assign RC_WE = fb_PAINT_REQ;
 
 	assign fb_GL_ADDR = img_ptr;
 
@@ -84,7 +85,6 @@ module gl_painter_image (
 		color_in = color;
 		i_in = i;
 		DONE = 1'b0;
-		RC_WE = 1'b0;
 		paint_req_in = 1'b0;
 		read_req_in = 1'b0;
 		img_ptr_in = img_ptr;
@@ -132,7 +132,6 @@ module gl_painter_image (
 
 			s_paint: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next location
 					i_in = i + 1;
diff --git a/gl/painters/gl_painter_polygon.sv b/gl/painters/gl_painter_polygon.sv
index 9647b64..a9b50a1 100644
--- a/gl/painters/gl_painter_polygon.sv
+++ b/gl/painters/gl_painter_polygon.sv
@@ -35,8 +35,10 @@ module gl_painter_polygon (
 	assign fb_PAINT_RGB16 = C0;
 	assign fb_PAINT_X = x;
 	assign fb_PAINT_Y = y;
+
 	assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER};
 	assign RC_DATA_WR = 1'b1;
+	assign RC_WE = fb_PAINT_REQ;
 
 	// Inclined line scanner instances
 	logic [9:0] l_x1, l_y1, l_x2, l_y2, r_x1, r_y1, r_x2, r_y2;
@@ -81,7 +83,6 @@ module gl_painter_polygon (
 		y_in = y;
 		xbeg_in = xbeg;
 		DONE = 1'b0;
-		RC_WE = 1'b0;
 		paint_req_in = 1'b0;
 		l_lim_in = l_lim;
 		r_lim_in = r_lim;
@@ -96,7 +97,6 @@ module gl_painter_polygon (
 
 			s_scan_left: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x - 1;
@@ -111,7 +111,6 @@ module gl_painter_polygon (
 
 			s_scan_right: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x + 1;
diff --git a/gl/painters/gl_painter_rect.sv b/gl/painters/gl_painter_rect.sv
index 6f0288b..d545eb4 100644
--- a/gl/painters/gl_painter_rect.sv
+++ b/gl/painters/gl_painter_rect.sv
@@ -36,8 +36,10 @@ module gl_painter_rect (
 	assign fb_PAINT_X = x;
 	assign fb_PAINT_Y = y;
 	assign fb_PAINT_RGB16 = color;
+
 	assign RC_ADDR = {x, y[8:0], PAINT_BUFFER};
 	assign RC_DATA_WR = 1'b1;
+	assign RC_WE = fb_PAINT_REQ;
 
 	always_ff @(posedge CLOCK) begin
 		if(RESET | ~EN) begin
@@ -63,7 +65,6 @@ module gl_painter_rect (
 		y_in = y;
 		color_in = color;
 		DONE = 1'b0;
-		RC_WE = 1'b0;
 		paint_req_in = 1'b0;
 
 		case (state)
@@ -76,7 +77,6 @@ module gl_painter_rect (
 			end
 			s_paint: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					y_in = y + 1;
diff --git a/gl/painters/gl_painter_ring.sv b/gl/painters/gl_painter_ring.sv
index bccb30d..10c586e 100644
--- a/gl/painters/gl_painter_ring.sv
+++ b/gl/painters/gl_painter_ring.sv
@@ -33,8 +33,10 @@ module gl_painter_ring (
 	logic[2:0] quadrant, quadrant_in;
 
 	assign fb_PAINT_RGB16 = CSTROKE;
+
 	assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER};
 	assign RC_DATA_WR = 1'b1;
+	assign RC_WE = fb_PAINT_REQ;
 
 	always_ff @(posedge CLOCK) begin
 		if(RESET | ~EN) begin
@@ -67,7 +69,6 @@ module gl_painter_ring (
 		y_in = y;
 		xlen_in = xlen;
 		DONE = 1'b0;
-		RC_WE = 1'b0;
 		paint_req_in = 1'b0;
 
 		case (state)
@@ -82,7 +83,6 @@ module gl_painter_ring (
 
 			s_axis: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x + 1;
@@ -117,7 +117,6 @@ module gl_painter_ring (
 
 			s_paint: begin
 				paint_req_in = 1'b1;
-				RC_WE = 1'b1;
 				if(fb_PAINT_READY) begin
 					// Value written, move to next pixel
 					x_in = x + 1;
-- 
GitLab