[Upgrading, Modifying and Unlocking] :
Well, I think I narrowed the problem. It is as I said graphic related, and to be precise to that peculiar

TARGET_RECOVERY_PIXEL_FORMAT := "RGBA_8888"

.

This require the framebuffer to work with 32 bits per pixel, but in any CWM which doesn't support RGBA_8888, the value is 16 bits per pixel, unless there is used BGRA_8888 or RGBX_8888 (for devices that require that). Why CWM doesn't have support for RGBA_8888? Who knows... probably wasn't much used at the time.

Also, why the new cm recovery works? Let me show you:

if (vi.bits_per_pixel != 32) {
vi.bits_per_pixel = 32;

it forces the framebuffer to work with 32 bits per pixel, and therefore that's the reason these recovery works on that phone. I think the chinese guys who made that working recovery changed the code to support that. I'm going to do that tomorrow also to see if it will work then.

But why the stock recovery works? Probably has same thing fixed - I don't know because we never saw any piece of code from zopo. But in lenovo stock recovery code there isn't any change

#if defined(RECOVERY_BGRA)
#define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888
#define PIXEL_SIZE 4
#elif defined(RECOVERY_RGBX)
#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBX_8888
#define PIXEL_SIZE 4
#else
#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGB_565
#define [COLOR="Red"]PIXEL_SIZE 2[/COLOR]
#endif
.........
[COLOR="Red"]vi.bits_per_pixel = PIXEL_SIZE * 8[/COLOR];

That means 2x8=16.

So what's the trick? Eh, it's this folder "miui" from recovery root. That recovery from lenovo is a simplified miui recovery, and just like in twrp case, the UI isn't used from stock code but from miui code, where we can see

static byte ag_32; //-- FrameBuffer Type 32/16bit

Now, what is the connection between imposibility to get a framebuffer and to see something on screen and the fact that the recovery stops and then restarts? This is the CWM and other recovery rutine, right after initialisation it loads the user interface ui and ui, and after that loads volumes, process commands and start adb, etc.

int is_user_initiated_recovery = 0;
time_t start = time(NULL);

[COLOR="Red"]// If these fail, there's not really anywhere to complain...[/COLOR]
freopen(TEMPORARY_LOG_FILE, "a", stdout); setbuf(stdout, NULL);
freopen(TEMPORARY_LOG_FILE, "a", stderr); setbuf(stderr, NULL);
printf("Starting recovery on %s\n", ctime(&start));

device_ui_init(&ui_parameters);
ui_init();
************************
int gr_init(void)
{
gglInit(&gr_context);
GGLContext *gl = gr_context;
...........

gr_fb_fd = get_framebuffer(gr_framebuffer);
[COLOR="Red"] if (gr_fb_fd < 0) {
gr_exit();
return -1;[/COLOR]
}

My conclusion: the new platform adopted RGBA_8888 mode (related to OpenGL 2.0) which works with 32 bits per pixel on framebuffer and all the existent recoveries don't do that.

I'll try tomorrow to find a fix for this.

PS: don't think the graphic issue is a minor one. If you want to make a test, unpack any working cwm recovery and change stitch and icon_clockwork from RGB mode to indexed, then start it and you will see a black screen. In stock recovery and the new cm recovery that isn't the case since they work even with grayscale mode, but cwm has this problem - only work with rgb images, and twrp too.